Apache mod_rewrite doppia codifica la stringa di query al reindirizzamento


13

Abbiamo riscontrato uno strano problema (un bug, forse?) Con il comportamento di Apache mod_rewrite durante il passaggio attraverso le stringhe di query.

Per riprodurre, abbiamo creato un'installazione Ubuntu (onirica) pulita con la configurazione predefinita di Apache. Abbiamo abilitato mod_rewrite e nella configurazione del sito predefinita abbiamo aggiunto quanto segue:

RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]

Per testare, utilizziamo curl:

curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'

L'output rilevante è:

HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b

Come puoi vedere, la stringa di query ha un doppio escape, il che è sbagliato. Qualcuno ha idea di come possiamo risolvere questo problema? Un paio di cose che abbiamo provato:

  • Aggiunta di [NE]. Questo ci dà la stringa di query corretta, ma il percorso è senza escape, il che porta a nuovi problemi.
  • Aggiunta di [NE, B]. Questo sembra funzionare, ma causa la fuga /tra le parti ae bdel percorso.
  • Annullamento dell'escaping manuale della stringa di query.

    RewriteCond %{QUERY_STRING} .*
    RewriteMap unescape int:unescape  
    RewriteRule ^(.*)$          $1?${unescape:%{QUERY_STRING}}
    

    Tuttavia, ciò significa che non possiamo distinguere, per esempio, da un &e un escape &nella stringa di query.

Aggiornare:

Questa segnalazione di bug descrive lo stesso problema. Il primo commento si collega a un commit apparentemente risolvendo il problema, ma come dice Pieter di seguito, non sembra che sia effettivamente risolto.

Risposte:


7

Questo sembra essere un bug in Apache. Questa segnalazione di bug è un po 'confusa, ma descrive esattamente il tuo problema:

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

Sembra che siano a conoscenza del problema. Sebbene il bug affermi di aver risolto, l'ho provato con Apache 2.3.15 e il problema sembra essere ancora lì. Si noti inoltre che Apache 2.3 è una versione beta, quindi non è utile anche se è stato risolto, fino a quando Apache 2.4 non viene rilasciato.


Sembra che Apache 2.4.10 lo stia ancora facendo, anche se avrebbe dovuto essere corretto in 2.4.1 .
Arjan,

1
Vedo ancora il problema in 2.4.7
François il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.