¿Las reglas de reescritura de Apache se rompen entre sí?

¿Las reglas de reescritura de Apache se rompen entre sí?

Tengo esta regla:

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]

Lo cual funciona muy bien por sí solo. Básicamente, tengo un montón de directorios que contienen un montón de archivos que quiero mantener en la carpeta "/guide", pero quiero que aparezcan en la raíz web por razones de SEO.

Esta regla funciona, pero desafortunadamente las URL originales también funcionan (con "/guide"). Quiero redirigir 301 los que tienen "/guide" en la URL a los que no, sin mover los archivos en el servidor.

Intenté agregar esta regla:

RewriteCond %{REQUEST_URI} ^/guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$
RewriteRule ^guide/(.*)$ http://www.domain.com/$1 [R=301,L]

... pero eso rompe completamente mi primera regla.

¿Alguna idea sobre lo que podría estar haciendo mal? Avíseme si necesita saber algo más de mí para ayudarme con este problema.


EDITAR: Según la sugerencia de Matthews, cambié mis reglas a esto (que refleja el comportamiento que quiero):

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]

Sin embargo, las reglas todavía se están rompiendo entre sí, solo que esta vez de una manera diferente. Al intentar acceder a una página regida por la segunda regla (y a qué redirige correctamente la primera regla), aparece este error en Safari:

Se produjeron demasiadas redirecciones al intentar abrir "http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php”. Esto puede ocurrir si abre una página que se redirige para abrir otra página que luego se redirige para abrir la página original.

¿Alguna sugerencia?


EDICIÓN ADICIONAL:

Parece que estas reglas se están dando vueltas sobre sí mismas. Aquí hay un extracto de los registros de reescritura:

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]

Creo que el problema radica en la sección del medio (que separé mediante saltos de línea). Parece que después de que Apache reescribe la ruta local (usando /home/neezer/...), emite otra solicitud con la raíz del documento eliminada, que por supuesto incluye /guide, que luego filtra en la primera regla, que finalmente filtra en la segunda regla, y va y viene hasta el infinito. .

¿Cómo le digo que simplemente se DETENGA después de la primera regla? Agregar [L]parece no tener ningún efecto.

Respuesta1

No estoy seguro de por qué estás usando RewriteConds. Me parece que se podría poner todo directamente en RewriteRules. Parece que su problema se debe al hecho de que está redirigiendo todo lo que coincide con Request_URI. Si realiza la comparación en la propia RewriteRule, la regla reescrita ya no coincidirá con la siguiente regla.

Quizás quieras probar 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 

Probablemente necesitarás modificarlos porque no entiendo todo lo que estás tratando de lograr. Por ejemplo, el RewriteCond a continuación parecía redundante, así que lo omití. Si realmente estás intentando reescribir todo lo que se encuentra en el directorio de la guía, tendrás que volver a incorporarlo.

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

EDITAR
Después de hacer algunas pruebas rápidas en mi servidor, pude hacer que estas reglas funcionaran, pero no en un contexto por directorio (es decir, no en un .htaccess o dentro de un <Directory></Directory>).

No probé esto, pero es posible que puedas solucionarlo configurando una variable de entorno con la segunda regla y luego probándola en la primera.

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]

Respuesta2

No pude encontrar ninguna forma alrededor de ese bucle infinito, así que moví los archivos a una nueva carpeta llamada "vecindarios" y usé estas reglas:

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 ideal, porque ahora tengo dos carpetas (tengo otros archivos que estoy sirviendo fuera de la guía), pero soluciona mis preocupaciones de SEO.

información relacionada