Nous avons rencontré un problème étrange (un bug, peut-être?) Avec le comportement d'Apache mod_rewrite lors du passage dans les chaînes de requête.
Pour reproduire, nous avons mis en place une installation Ubuntu (oneiric) propre avec la configuration Apache par défaut. Nous avons activé mod_rewrite, et dans la configuration de site par défaut, nous avons ajouté ce qui suit:
RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
Pour tester, nous utilisons curl:
curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
La sortie pertinente est:
HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
Comme vous pouvez le voir, la chaîne de requête est à double échappement, ce qui est faux. Quelqu'un a-t-il une idée de comment nous pourrions résoudre ce problème? Quelques choses que nous avons essayées:
- Ajout de [NE]. Cela nous donne la chaîne de requête correcte, mais le chemin n'est pas échappé, ce qui conduit à de nouveaux problèmes.
- Ajout de [NE, B]. Cela semble fonctionner, mais provoque l'échappement
/
entre lea
et lesb
parties du chemin. Annuler l'échappement de la chaîne de requête manuellement.
RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
Cependant, cela signifie que nous ne pouvons pas distinguer, disons, un
&
et un échappé&
dans la chaîne de requête.
Mise à jour:
Ce rapport de bogue décrit le même problème. Le premier commentaire renvoie à un commit qui résout apparemment le problème, mais comme Pieter le dit ci-dessous, il ne semble pas qu'il soit réellement résolu.