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ędzya
ib
częś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.