Wir haben ein seltsames Problem (vielleicht einen Fehler?) Mit dem Verhalten von Apache mod_rewrite beim Durchlaufen von Abfragezeichenfolgen festgestellt.
Zur Reproduktion haben wir eine saubere Ubuntu-Installation (Oneiric) mit der Standard-Apache-Konfiguration eingerichtet. Wir haben mod_rewrite aktiviert und in der Standard-Site-Konfiguration Folgendes hinzugefügt:
RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
Zum Testen verwenden wir Curl:
curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
Die relevante Ausgabe ist:
HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
Wie Sie sehen, wird die Abfragezeichenfolge doppelt maskiert, was falsch ist. Hat jemand eine Idee, wie wir das beheben könnten? Ein paar Dinge, die wir ausprobiert haben:
- Hinzufügen von [NE]. Dadurch erhalten wir die richtige Abfragezeichenfolge, der Pfad wird jedoch nicht umgangen, was zu neuen Problemen führt.
- Hinzufügen von [NE, B]. Dies scheint zu funktionieren, führt jedoch dazu, dass das
/
zwischena
und liegendeb
Teil des Pfades ausgeblendet wird. Manuelles Entgrenzen der Abfragezeichenfolge.
RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
Dies bedeutet jedoch, dass wir in der Abfragezeichenfolge nicht zwischen beispielsweise einem
&
und einem&
Escapezeichen unterscheiden können.
Aktualisieren:
Dieser Fehlerbericht beschreibt das gleiche Problem. Der erste Kommentar verweist auf ein Commit, das das Problem anscheinend behebt, aber wie Pieter weiter unten sagt, scheint es nicht so, als wäre es tatsächlich behoben.