Apache mod_rewrite double encode la chaîne de requête lors de la redirection

13

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 le aet les bparties 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.

Erik Hesselink
la source

Réponses:

7

Cela semble être un bogue dans Apache. Ce rapport de bogue est un peu compliqué, mais décrit exactement votre problème:

https://issues.apache.org/bugzilla/show_bug.cgi?id=34602

Il semble qu'ils soient conscients du problème. Bien que le bogue affirme avoir été corrigé, je l'ai testé avec Apache 2.3.15, et le problème semble toujours être là. Notez également qu'Apache 2.3 est une version bêta, donc cela ne vous est d'aucune utilité même s'il l'a corrigé, jusqu'à ce qu'Apache 2.4 soit sorti.

Pieter
la source
Il semble qu'Apache 2.4.10 continue de le faire, bien qu'il aurait dû être corrigé dans 2.4.1 .
Arjan
1
Je vois toujours le problème dans 2.4.7
François