Apache mod_rewrite подвійний кодує рядок запиту при переадресації


13

Ми стикалися з дивною проблемою (помилка, можливо?) З поведінкою 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}}
    

    Однак це означає, що ми не можемо розрізнити між, скажімо, &і вхідним &рядком запиту.

Оновлення:

Цей звіт про помилку описує ту саму проблему. Перший коментар посилається на комітет, очевидно, що вирішує проблему, але, як каже Пітер нижче, це не здається, що воно фактично виправлено.

Відповіді:


7

Здається, це помилка в Apache. Цей звіт про помилку трохи безладний, але точно описує вашу проблему:

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

Схоже, вони знають про проблему. Хоча помилки стверджують, що вони виправлені, я перевірив це за допомогою Apache 2.3.15, і проблема все ще існує. Також зауважте, що Apache 2.3 - це бета-версія, тому вам це не корисно, навіть якщо виправили це, поки Apache 2.4 не вийде.


Здається, Apache 2.4.10 все ще робить це, хоча це повинно було бути виправлено в 2.4.1 .
Ар'ян

1
Я все ще бачу проблему в 2.4.7
Франсуа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.