Назад | Перейти на главную страницу

Apache mod_rewrite дважды кодирует строку запроса при перенаправлении

Мы столкнулись со странной проблемой (возможно, с ошибкой?) С поведением 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

Как видите, строка запроса имеет двойное экранирование, что неверно. Кто-нибудь знает, как это исправить? Мы пробовали несколько вещей:

Обновить:

Этот отчет об ошибке описывает ту же проблему. Первый комментарий ссылается на фиксацию, которая, по-видимому, решает проблему, но, как говорит ниже Питер, не похоже, что она на самом деле исправлена.

Похоже, это ошибка в Apache. Этот отчет об ошибке немного запутан, но точно описывает вашу проблему:

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

Похоже, они знают об этой проблеме. Хотя ошибка утверждает, что они исправлены, я тестировал это с Apache 2.3.15, и проблема все еще существует. Также обратите внимание, что Apache 2.3 - это бета-версия, поэтому она бесполезна для вас, даже если она исправила это, пока не выйдет Apache 2.4.