Apache mod_rewrite codiert die Abfragezeichenfolge bei der Umleitung doppelt

13

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 /zwischen aund liegende bTeil 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.

Erik Hesselink
quelle

Antworten:

7

Dies scheint ein Fehler in Apache zu sein. Dieser Fehlerbericht ist ein bisschen chaotisch, beschreibt aber Ihr Problem genau:

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

Es sieht so aus, als wären sie sich des Problems bewusst. Obwohl der Fehler behauptet, dass er behoben wurde, habe ich ihn mit Apache 2.3.15 getestet, und das Problem scheint immer noch da zu sein. Beachten Sie auch, dass Apache 2.3 eine Beta-Version ist, sodass Sie selbst dann keinen Nutzen daraus ziehen, wenn es behoben wurde, bis Apache 2.4 veröffentlicht wird.

Pieter
quelle
Scheint, dass Apache 2.4.10 dies noch tut, obwohl es in 2.4.1 behoben worden sein sollte .
Arjan
1
Ich sehe das Problem immer noch in 2.4.7
François