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 partia
eb
del 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.