2010-08-13 2 views
0

J'ai un petit problème ici. J'utilise une règle simple pour rediriger toutes les requêtes vers un script, certains dossiers avec excepte le contenu statique:mod_rewrite crée 301 au lieu de la redirection transparente si le dossier existe

RewriteEngine On 
RewriteCond $1 !^(templates|css|js|uploads)/(.*)$ 
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA] 

La plupart du temps, la redirection est bonne et transparente. Mais si le dossier correspondant à l'URL existe et si je ne mets pas le dernier "/", j'aurai une redirection 301.

Exemples: (la galerie de dossier n'existe pas, mais mods ne)

  • ht * p: // localhost/test/Galerie/-> OK
  • ht * p: // localhost/test/mods/-> OK
  • ht p: // localhost/test/mods -> 301 ht redirection vers p: // localhost/test/mods/url = mods

je? ce problème sur tous les serveurs apache2 (testé Fedora, Debian, Windo ws).

Quelqu'un sait comment résoudre ce problème? Merci

Répondre

1

Cela est dû à la directive DirectorySlash, qui effectuera la redirection externe après que votre réécriture est effectuée, ce qui a pour conséquence involontaire de prendre votre chaîne de requête ajoutée avec elle.

Vous pouvez désactiver DirectorySlash, mais ce n'est pas recommandé pour les raisons décrites dans la documentation. L'option préférée dans ce cas est probablement d'effectuer le travail de mod_dir pour cela, en redirigeant vers l'URL terminée par une barre oblique avant d'exécuter vos règles. Quelque chose comme ceci au-dessus de votre règle existante devrait fonctionner:

RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_URI} !/$ 
RewriteRule ^.*$ /$0/ [R=301,L] 
+0

Voilà, merci! –