Apache mod_rewrite ‘loop’ / Dernier ne fonctionne pas

J’ai les règles de réécriture ci-dessous mais tous sauf ma dernière réécriture ont cessé de fonctionner.

La structure des dossiers ressemble à:

/ /site /console /requests 

Si je vais sur http://xx.com/contact , cela me montre essentiellement http://xx.com/site/contact . Cela fonctionne bien. Cependant, si je vais sur http://xx.com/console , cela ne fonctionnera pas. Je crois que cela a quelque chose à voir avec ma règle finale qui prend le dessus, mais je ne vois pas comment. Essentiellement, lorsque je vais sur http://xx.com/console , il faut que j’aille à http://xx.com/console , cependant, je pense qu’il essaie de m’amener à http://img.zgserver.com/apache/banner.png$ http://img.zgserver.com/apache/banner.png [L,R=301] RewriteRule ^questions(.*)$ http://xx.org.uk/questions/ [L,R=301] RewriteRule ^survey(.*)$ http://xx.org.uk/xx-2014-survey/ [L,R=301] RewriteRule ^console/([^/.]+)$ http://xx.org.uk/console/?id=$1 [L,R=301] RewriteRule ^requests/([^/.]+)$ http://xx.org.uk/requests/?id=$1 [L,R=301] RewriteCond %{REQUEST_URI} !^/site/ RewriteRule ^(.*)$ /site/$1 [L,NC]

L ne met pas fin à l’exécution de la règle comme le fait END mais END ne fonctionne que dans Apache 2.4+. L ne termine que la règle actuelle.

Pour la version précédente d’Apache, modifiez votre dernière règle en tant que:

 RewriteCond %{REQUEST_URI} !^/(site|questions|console|requests|xx-2014-survey)/ [NC] RewriteRule ^(.*)$ /site/$1 [L,NC] 

Étant donné que tous sauf la dernière règle ont le drapeau [R] (pour le test?), Le navigateur charge une nouvelle URL, et une nouvelle demande sera faite à Apache.

Comme cette requête ne correspond à aucune des autres règles et ne contient pas / site /, elle correspondra à la dernière règle.

L’indicateur [L], ou tout autre indicateur, ne peut pas empêcher cela, car Apache n’a aucun moyen de savoir que cette nouvelle requête était le résultat d’une règle précédente, et pas quelqu’un qui saisit la nouvelle URL directement dans son navigateur.