Apache mod_rewrite RewriteRule bucles a pesar de la bandera L

Apache mod_rewrite RewriteRule bucles a pesar de la bandera L

Apache/2.4.54.
Estoy tratando de lograr que URL similares (por ejemplo, "/anystuff.htm") sean redirigidas externamente a "/algo", que internamente es "algo.html". Pero las siguientes reglas provocan un bucle en lugar de detenerse, es decir, "algo" coincide

RewriteEngine On
RewriteBase /
RewriteRule ^something$ something.html [L]
RewriteRule ^(some|thing|any|stuff).*/?$ /something [L, R=301,NC]

Pero parece que la directiva "L" no tiene efecto, porque la segunda regla vuelve a coincidir con la redirección a "/algo", lo que provoca el bucle.

Prueba conhttps://htaccess.madewithlove.com/sugiere que debería funcionar como se esperaba. No creo que pueda habilitar el registro :-(

Respuesta1

La Lbandera sólo detiene el paso actual a través del motor de reescritura, no se detienetodoProcesando. Las directivas que siguen no se procesan inmediatamente, pero (en el contexto de un directorio) el proceso de reescritura comienza de nuevo... Durante la "segunda pasada", la primera regla ya no coincide (ya que la entrada es ahora something.html), pero la segunda regla sí. entonces desencadena la redirección.

(El motor de reescritura efectivamente "hace un bucle" hasta que la URL pasa sin cambios. Las directivas son más fáciles de entender cuando se usan en unservidorcontexto (sin directorio), donde la Lbandera detiene efectivamente todo el procesamiento, ya que solo hay un paso por parte del motor de reescritura).

Sin embargo, en Apache 2.4 puede usar la ENDbandera en su lugar para detener todo el procesamiento por parte del motor de reescritura (en undirectoriocontexto). Por ejemplo:

RewriteEngine On

RewriteRule ^something$ something.html [END]
RewriteRule ^(some|thing|any|stuff) /something [R=301,NC,L]

(Ten en cuenta que tenías un errorespacioen el argumento de las banderas sobre la segunda regla. Esto habría resultado en un error de análisis, así que supongo que fue un error tipográfico en su pregunta).

La expresión regular final de la segunda regla (es decir, .*/?$) es superflua.

Usar Lcon una redirección ( Rbandera) es lo mismo que END. Todo el procesamiento se detiene.

La RewriteBasedirectiva es superflua en su ejemplo.

Nota: primero debes probar con una redirección 302 (temporal) y solo cambiar a 301 (permanente) cuando hayas confirmado que funciona según lo previsto. Los 301 se almacenan en caché de forma persistente en el navegador, por lo que las pruebas pueden resultar problemáticas. En consecuencia, deberá borrar la memoria caché del navegador (y de cualquier intermediario) antes de realizar la prueba.

Las pruebas https://htaccess.madewithlove.com/sugieren que debería funcionar como se esperaba.

A diferencia de un servidor real, el probador MWL sólo (efectivamente) realiza una "única pasada" a través de las reglas, por lo que no puede detectar bucles de reescritura/redireccionamiento.


Aparte:Normalmente, debes organizar directivas de redireccionamiento externas antes de las reescrituras internas. Sin embargo, la segunda regla en suejemplose redirigiría /somethinga sí mismo, por lo que sus dos directivas actualmente dependen del orden en que las tenga.

información relacionada