EDIT : [Résolu] J'ai finalement trouvé la solution dans la documentation ; j'ai posté une réponse. En bref : le DPI
drapeau.
EDITAR: au bas de la page, a ajouté un moyen facile de reproduire le problème en ligne.
J'ai passé quelques heures à déboguer certaines réécritures. Tout va bien sauf un comportement qui me laisse perplexe.
D'une manière ou d'une autre, lorsqu'on lui fournit une url avec deux sous-répertoires ou plus, mod_rewrite ajoute automatiquement tous les sous-répertoires (sauf le premier) à l'url réécrite. Voici l'exemple le plus simple auquel j'ai pu le réduire. C'est dans un htaccess à DOCUMENT_ROOT
.
- url :
http://localhost/stripthis/stripthat
RewriteRule ^ RewriteWasHere_
- Sortie :
RewriteWasHere_/stripthat
Où cela s'est-il produit ? stripthat
d'où vient-elle ? Une option en amont pourrait-elle être à l'origine de ce problème ?
J'ai essayé de supprimer les sous-dossiers à l'aide de diverses règles. Par exemple :
- url :
http://localhost/stripthis/stripthat
RewriteRule ^/?([^/]+) RewriteWasHere_$1
- Sortie :
RewriteWasHere_stripthis/stripthat
Curieusement, cela se produit à la fois sur un xampp local x Apache 2.4.7 et sur un CentOS x Apache 2.2 distant.
J'ai inspecté les urls réécrites en les envoyant vers un script, mais voici un moyen de reproduire le problème en ligne.
Comment reproduire cela en ligne
- Aller à cette page Testeur de htaccess en ligne
- Pour l'url, entrez
http://example.com/a/123/b
Pour les règles, collez ceci :
# the `(?!)` negative lookaheads are just to make triple sure
# we're not running the same rules multiple times
RewriteRule ^(?!m[yo])([^/]+) my_$1
#RewriteRule ^(?!mo])\D*(\d+) mo_$1:$1:$1
- Exécution : le résultat est
http://example.com/my_a/123/b
- Décommenter la deuxième ligne.
- Exécution : le résultat est
http://example.com/mo_123:123:123/b
- Commentez la deuxième ligne, remplacez la première ligne par
RewriteRule ^(?!m[yo])([^/]+).*$ my_$1
: le problème disparaît sur ce site, mais pas sur mes serveurs.
Toute information serait très appréciée.