2010-01-24 6 views
6

J'ai un problème avec la réécriture d'une URL à un répartiteur fastcgi. Si je laisse seulement:Mod_rewrite boucles même avec indicateur L

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

Je me attendais L (dernière règle) pour faire une seule réécriture. Au lieu de cela, il conserve dispatch.fcgi jusqu'à ce que Apache signale une erreur.

Je sais que cela peut être corrigé avec:

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

Mais quelle est la raison de multiples réécritures? Est-ce que L fait autre chose que ce que je pense?

Répondre

7

Je sais qu'il est une vieille question, mais à d'autres la recherche de la vraie réponse , voici:

Le drapeau [L]fonctionne le dans .htaccess fichiers. Il indique au rewrite module d'ignorer toutes les règles suivantes dans ce fichier .htaccess. Il fait son travail, Apache réécrit l'URL et quitte le fichier .htaccess.

Cependant, à la fin du fichier .htaccesssi l'URL de la requête a été réécrite, l'ensemble du processus de mise en correspondance d'URL commence à nouveau avec la nouvelle URL.

C'est ce qui se passe au-dessus, ^(.*)$ va toujours correspondre l'URL actuelle, il provoque une boucle infinie, seule l'option maxredirect de réécriture (10 par défaut) arrête.

Le test d'attribut de fichier !-f (tel que mentionné par le questionneur) serait résoudre le problème, puisque l'URL correspond à un vrai nom:

RewriteCond% {REQUEST_FILENAME} -f

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

maintenant, si nous demandons http://example.com/toappend, .htaccess récrit à dispatch.fcgi/toappend et pas de boucle rewrite se produira.

+0

Pourquoi est-ce que si je fais 'rewriterule. */Index.php' , il y a une boucle infinie, mais si je fais 'rewriterule. * index.php' il n'y a pas de boucle? – Pacerier

+0

Ok, j'ai trouvé les ans et je l'ai écrit ici – Pacerier

2

Apparemment - et je ne lis que ceci ici, je n'ai aucune connaissance de première main - la directive [L] ne fonctionne pas dans les fichiers .htaccess, seulement si c'est dans votre fichier .conf.

Voir: Hidden features of mod_rewrite

dans le contexte .htaccess, [L] ne pas forcer mod_rewrite à arrêter. il continuera à déclencher interne

+0

Je suppose que les réponses http://stackoverflow.com/questions/1775877/ aussi - malheureusement la réponse réelle n'était pas marquée là ... – viraptor

6

Hy, ajoutez après RewriteEngine On

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

.. et il devrait fonctionner des boucles d'abattage.