Мы столкнулись со странной проблемой (возможно, с ошибкой?) С поведением Apache mod_rewrite при прохождении через строки запроса.
Для воспроизведения мы установили чистую установку Ubuntu (oneiric) с конфигурацией Apache по умолчанию. Мы включили mod_rewrite и в конфигурацию сайта по умолчанию добавили следующее:
RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
Для проверки используем curl:
curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
Соответствующий вывод:
HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
Как видите, строка запроса имеет двойное экранирование, что неверно. Кто-нибудь знает, как это исправить? Мы пробовали несколько вещей:
/
между a
и b
части пути, которые нужно избежать.Отмена экранирования строки запроса вручную.
RewriteCond %{QUERY_STRING} .*
RewriteMap unescape int:unescape
RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
Однако это означает, что мы не можем различить, скажем, &
и сбежавший &
в строке запроса.
Обновить:
Этот отчет об ошибке описывает ту же проблему. Первый комментарий ссылается на фиксацию, которая, по-видимому, решает проблему, но, как говорит ниже Питер, не похоже, что она на самом деле исправлена.
Похоже, это ошибка в Apache. Этот отчет об ошибке немного запутан, но точно описывает вашу проблему:
https://issues.apache.org/bugzilla/show_bug.cgi?id=34602
Похоже, они знают об этой проблеме. Хотя ошибка утверждает, что они исправлены, я тестировал это с Apache 2.3.15, и проблема все еще существует. Также обратите внимание, что Apache 2.3 - это бета-версия, поэтому она бесполезна для вас, даже если она исправила это, пока не выйдет Apache 2.4.