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.

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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.