Regras de reescrita do Apache quebrando uma à outra?

1

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.

    
por neezer 17.06.2010 / 23:05

2 respostas

1

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 deriva do fato de que você está redirecionando tudo o que corresponde ao Request_URI. Se você fizer a correspondência na RewriteRule em si, 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á ajustar isso 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 sob o diretório do guia, você terá que incorporá-lo novamente.

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

EDITAR
Depois de fazer alguns testes rápidos no meu servidor, consegui que essas regras funcionassem, 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 conseguir resolver isso definindo uma variável de evocação com a segunda regra e testando a variável no primeiro.

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]
    
por 18.06.2010 / 03:38
0

Eu não consegui encontrar de qualquer maneira em torno desse loop infinito, então mudei 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]

Menor que o ideal, porque agora tenho duas pastas (tenho outros arquivos que não servem de guia), mas isso resolve minhas preocupações com SEO.

    
por 18.06.2010 / 17:26