Regras de reescrita do Apache quebrando umas às outras?

Regras de reescrita do Apache quebrando umas às outras?

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, tenho vários diretórios que contêm vários arquivos que desejo manter na pasta "/guide", mas quero que eles apareçam na raiz da web por motivos de SEO.

Esta regra funciona, mas infelizmente o URL original também funciona (com "/guide"). Quero redirecionar 301 aqueles com "/guide" na URL para aqueles sem, sem realmente mover os arquivos no servidor.

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 a minha primeira regra.

Alguma idéia sobre o que posso estar fazendo de errado? Por favor, deixe-me saber se você precisar saber mais alguma coisa minha para me ajudar com esse problema.


EDIT: Por sugestão de Matthews, mudei minhas regras para isto (refletindo o comportamento que desejo):

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, só que desta vez de uma maneira diferente. Tentar acessar uma página regida pela segunda regra (e para onde a primeira regra redireciona corretamente) me dá este erro no Safari:

Ocorreram muitos redirecionamentos ao tentar abrir “http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php”. Isso pode ocorrer se você abrir uma página que é redirecionada para abrir outra página, que então é redirecionada para abrir a página original.

Alguma sugestão?


EDIÇÃO ADICIONAL:

Parece que essas regras estão se articulando. Aqui está um trecho dos logs 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]

Acredito que o problema esteja na seção intermediária (que separei por quebras de linha). Parece que depois que o Apache reescreve o caminho local (usando /home/neezer/...), ele emite outra solicitação com a raiz do documento removida, que obviamente inclui /guide, que então filtra a primeira regra, que eventualmente filtra a segunda regra, e vai e volta até o infinito .

Como posso dizer para simplesmente PARAR após a primeira regra? Adicionar [L]parece não ter efeito.

Responder1

Não sei por que você está usando o RewriteConds. Parece-me que você poderia colocar tudo diretamente no RewriteRules. Parece que o seu problema decorre do fato de você estar redirecionando tudo o que corresponde ao Request_URI. Se você fizer a correspondência no próprio RewriteRule, a regra reescrita não corresponderá mais à próxima regra.

Você pode querer tentar algo como:

RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$2 [R=301]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/guide/$2 

Você provavelmente precisará ajustá-los porque não entendo tudo o que você está tentando realizar. Por exemplo, o RewriteCond abaixo parecia redundante, então deixei de fora. Se você realmente está tentando reescrever tudo no diretório do guia, você terá que incorporá-lo novamente.

RewriteCond %{REQUEST_URI} !^/guide/(.*)$

EDITAR
Depois de fazer alguns testes rápidos em meu servidor, consegui fazer essas regras funcionarem, mas não em um contexto por diretório (ou seja, não em um .htaccess ou dentro de um <Directory></Directory>).

Eu não testei isso, mas você pode contornar isso definindo uma variável de ambiente com a segunda regra e testando-a na primeira.

RewriteCond %{ENV:REDIRECT} !^NO$
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$2 [R=301]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$  [E=REDIRECT:NO]

Responder2

Não consegui encontrar esse loop infinito, então movi os arquivos para uma nova pasta chamada "bairros" e usei estas regras:

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/neighborhoods/$1-apartments/$2 [L]

Menos que o ideal, porque agora tenho duas pastas (tenho outros arquivos que estou servindo fora do guia), mas isso resolve minhas preocupações de SEO.

informação relacionada