Ми стикалися з дивною проблемою (помилка, можливо?) З поведінкою 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}}
Однак це означає, що ми не можемо розрізнити між, скажімо,
&
і вхідним&
рядком запиту.
Оновлення:
Цей звіт про помилку описує ту саму проблему. Перший коментар посилається на комітет, очевидно, що вирішує проблему, але, як каже Пітер нижче, це не здається, що воно фактично виправлено.