2010-01-24 29 views
6

Tengo un problema con la reescritura de una URL a un despachador fastcgi. Si dejo solamente:mod_rewrite bucles incluso con L flag

RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA] 

que esperaba L (última regla) para hacer que un solo reescritura. En cambio, sigue anteponiendo dispatch.fcgi hasta que Apache informa un error.

Sé que puede ser fijado con:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA] 

Pero lo que es la razón de múltiples reescrituras? ¿El L hace algo más de lo que creo que hace?

Respuesta

7

sé que es una cuestión de edad, sino a otros en busca de la respuesta real , aquí está:

La bandera [L]HACE trabajo en .htaccess archivos. Le dice al rewrite module que omita todas las reglas siguientes en ese archivo particular .htaccess. Hace su trabajo, Apache reescribe la url y sale del archivo .htaccess.

Sin embargo, al final del archivo .htaccess si la solicitud de URL ha sido reescrito, todo el proceso comienza de nuevo URL coincidente con la nueva url.

Esto es lo que sucede arriba, ^(.*)$ se siempre coinciden la url actual, se produce un bucle infinito, sólo la opción maxredirect reescritura (10 por defecto) lo detiene.

La prueba atributo !-f archivo (como han mencionado en la pregunta) sería resolver el problema, ya que la URL coincidirá con un verdadero nombre:

RewriteCond% {} REQUEST_FILENAME -f

RewriteRule^(. *) $ Dispatch.fcgi/$ 1 [L, QSA]

ahora, si solicitamos http://example.com/toappend, .htaccess reescribe a dispatch.fcgi/toappend y ningún bucle reescritura sucederá.

+0

¿Por qué es que si hago 'rewriterule. */Index.php' , hay un bucle infinito, pero si hago 'rewriterule. * index.php' ¿no hay bucle? – Pacerier

+0

Ok, he encontrado las ans y las he escrito aquí – Pacerier

2

Aparentemente, y solo lo he leído aquí, no tengo conocimiento de primera mano, la directiva [L] no funciona en archivos .htaccess, solo si está en su archivo .conf.

Ver: Hidden features of mod_rewrite

dentro del contexto .htaccess, [L] se no la fuerza para detener mod_rewrite. se seguir desencadenar interna

+0

Creo que eso responde http://stackoverflow.com/questions/1775877/ too - unfortunatley la respuesta real no estaba marcada allí ... – viraptor

6

Hy, añadir esto después de RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 

.. y debería funcionar bucles stoping.