Eu tenho esta regra:
RewriteCond %{REQUEST_URI} ^/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$
RewriteCond %{REQUEST_URI} !^/guide/(.*)$
RewriteRule ^(.*)$ /home/neezer/public-html/domain.com/guide/$1 [L]
O que funciona muito bem por si só. Essencialmente, eu tenho um monte de diretórios que tem um monte de arquivos neles que eu quero manter na pasta "/ guide", mas eu quero que eles apareçam na raiz da web por razões de SEO.
Esta regra funciona, mas infelizmente os URLs originais ainda funcionam (com "/ guide"). Eu quero 301 redirecionar aqueles com "/ guia" na URL para aqueles sem, sem realmente mover os arquivos no servidor.
Eu tentei adicionar esta regra:
RewriteCond %{REQUEST_URI} ^/guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$
RewriteRule ^guide/(.*)$ http://www.domain.com/$1 [R=301,L]
... mas isso quebra completamente minha primeira regra.
Quaisquer pensamentos sobre o que eu possa estar fazendo errado? Por favor, deixe-me saber se você precisa saber mais alguma coisa de mim para me ajudar com este problema.
EDIT: sugestão de Per Matthews, eu mudei minhas regras para isso (refletindo o comportamento que eu quero):
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$1-apartments/$2 [R=301,L]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/guide/$1-apartments/$2 [L]
No entanto, as regras ainda estão se quebrando, apenas de uma maneira diferente desta vez. Tentando acessar uma página governada pela segunda regra (e para qual a primeira regra redireciona corretamente) me forneça esse erro no Safari:
Too many redirects occurred trying to
open
“http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php”.
This might occur if you open a page
that is redirected to open another
page which then is redirected to open
the original page.
Alguma sugestão?
EDITAR:
Parece que essas regras estão se conectando. Aqui está um trecho dos registros de reescrita:
init rewrite engine with requested uri /manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
pass through /manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] rewrite 'manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' -> '/home/neezer/public-html/domain.com/guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php'
[perdir /home/neezer/public-html/domain.com/] strip document_root prefix: /home/neezer/public-html/domain.com/guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php -> /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] internal redirect with /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [INTERNAL REDIRECT]
init rewrite engine with requested uri /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
pass through /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] rewrite 'guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' -> 'http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php'
[perdir /home/neezer/public-html/domain.com/] explicitly forcing redirect with http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] escaping http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php for redirect
[perdir /home/neezer/public-html/domain.com/] redirect to http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [REDIRECT/301]
Eu acredito que o problema está na seção da seção do meio (que eu separei por quebras de linha). Parece que depois que o Apache reescreve para o caminho local (usando /home/neezer/...
), ele emite outra solicitação com a raiz do documento removida, o que obviamente inclui /guide
, que então filtra na primeira regra, que eventualmente é filtrada na segunda regra. e para trás e para o infinito.
Como posso dizer para simplesmente PARAR depois da primeira regra? Adicionar [L]
parece não ter efeito.