Мы столкнулись со странной проблемой (возможно, ошибкой?) В поведении 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
Как видите, строка запроса экранирована двойным образом, что неверно. У кого-нибудь есть идеи, как мы могли бы это исправить? Мы попробовали пару вещей:
- Добавление [NE]. Это дает нам правильную строку запроса, но путь не экранирован, что приводит к новым проблемам.
- Добавление [NE, B]. Кажется, это работает, но приводит к тому, что
/
междуa
иb
частями пути экранируется. Отключение строки запроса вручную.
RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
Однако это означает, что мы не можем различить, скажем, от
&
и экранированный&
в строке запроса.
Обновить:
Этот отчет об ошибке описывает ту же проблему. Первый комментарий связан с коммитом, по-видимому, исправляющим проблему, но, как говорит Питер ниже, не похоже, что он на самом деле исправлен.