Apache mod_rewrite podwójnie koduje ciąg zapytania przy przekierowaniu

13

Napotkaliśmy dziwny problem (może błąd?) Z zachowaniem mod_rewrite Apache podczas przekazywania ciągów zapytań.

Aby odtworzyć, skonfigurowaliśmy czystą instalację Ubuntu (oneiric) z domyślną konfiguracją Apache. Włączyliśmy mod_rewrite, aw domyślnej konfiguracji strony dodaliśmy:

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

Aby przetestować, używamy curl:

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

Odpowiedni wynik to:

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

Jak widać, ciąg zapytania jest podwójnie zastępowany, co jest niepoprawne. Czy ktoś ma pomysł, jak to naprawić? Kilka rzeczy, które próbowaliśmy:

  • Dodanie [NE]. To daje nam poprawny ciąg zapytania, ale ścieżka jest nieokreślona, ​​co prowadzi do nowych problemów.
  • Dodanie [NE, B]. To wydaje się działać, ale powoduje, że /pomiędzy ai bczęści ścieżki mają być uciekł.
  • Ręczne usuwanie ciągu zapytania.

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

    Oznacza to jednak, że nie możemy rozróżnić między, powiedzmy, a &i znakiem ucieczki &w ciągu zapytania.

Aktualizacja:

Ten raport o błędzie opisuje ten sam problem. Pierwszy komentarz odnosi się do zatwierdzenia najwyraźniej naprawiającego problem, ale jak Pieter mówi poniżej, nie wygląda na to, żeby został naprawiony.

Erik Hesselink
źródło

Odpowiedzi:

7

To wydaje się być błędem w Apache. Ten raport o błędzie jest nieco niechlujny, ale dokładnie opisuje twój problem:

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

Wygląda na to, że są świadomi problemu. Chociaż błąd twierdzi, że naprawił, przetestowałem to z Apache 2.3.15, a problem nadal istnieje. Zauważ też, że Apache 2.3 jest wersją beta, więc nie ma dla ciebie sensu, nawet jeśli to naprawił, dopóki Apache 2.4 nie zostanie wydany.

Pieter
źródło
Wygląda na to, że Apache 2.4.10 nadal to robi, chociaż powinno to zostać naprawione w 2.4.1 .
Arjan
1
Nadal widzę ten problem w 2.4.7
François,