Apache RewriteRule & %2F

Hi All,

Кто-то решал данную проблему?

Если в URL есть %2F ("/") (к примеру /test%2Ftest/), правило:
RewriteRule (.*) /rule.php?url=$1 [QSA,L]
- не работает, сервер выдает:

Not Found
The requested URL /test/test/ was not found on this server.

Ответить   Sat, 26 May 2007 10:15:48 +0300 (#668208)

 

Ответы:

Мы пришли к выводу, что это нерешаемо, и написали на такой случай
хелпер, который делает urlencode только русским символам в строке.
Конечно, это не универсальное решение.

Ответить   Sun, 27 May 2007 20:59:57 +0400 (#668448)

 

Hi dgstudio,

Sunday, May 27, 2007, 7:59:57 PM, you wrote:

Проблема находится где-то до правил модуля mod_rewrite, поскольку
корневой .htaccess даже не загружается.

По поводу urlencode: я поступил аналогично, но предпочел полный
rawurlencode() с преобразованием %20 в _ и %2F в "/". В urlencode
пробел заменяется плюсом. А если кодировать только национальные
символы, будут проблемы с unsafe и reserved наборами. Особенно это
касается символа #
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+"
extra = "!" | "*" | "'" | "(" | ")" | ","
safe = "$" | "-" | "_" | "."
unsafe = CTL | SP | <"> | "#" | "%" | "<" | ">"
Вообще говоря RFC1738 достаточно жестко ограничивает диапазон
используемых символов в url path, RFC2068 дает чуть больше свободы -
набор extra и "$". Хотя насколько я помню файлы/ссылки с пробелом
индексируются и работают без проблем. Прошу поправить, если не прав.
А национальные симоволы без %-escape в url path использует
wikipedia, правда в utf8.

P.S. Тот пример правила, что я привел съедает также символы %2B
запроса. Сначала апач для себя преобразовывает %2B в +, а затем не
по rfc1738, пхп преобразовывает в пробел. Так что пришлось даже
отказаться от "?url=$1" в правиле.

Ответить   Sun, 27 May 2007 22:03:06 +0300 (#668471)

 

С нашей точки зрения, проблема находится в том, что браузер, не находя
в ссылке "http://", считает такую ссылку относительной.

Ответить   Mon, 28 May 2007 20:24:44 +0400 (#668670)

 

Hi dgstudio,

Monday, May 28, 2007, 7:24:44 PM, you wrote:

Браузер? Относительной?
Я ввожу такой URL в строку адреса, а не перехожу по абсолютной
ссылке. Браузер для такой ссылки прозрачен, т.е. в каком виде я ее
набрал, в таком-же виде и попадает в cgi запрос и далее - апачу.

До модуля php этот запрос не доходит, до правил mod_rewrite - тоже,
поэтому я делаю вывод что проблема в первичном алгоритме
преобразования url апача или модуля mod_rewrite.

Ответить   Thu, 31 May 2007 10:10:02 +0300 (#669330)

 

Посмотрите get-запросы проксомитроном (proxomitron), или любым другим
приложением, которое умеет показывать лог запросов-ответов. Там станет
более понятно.

Ответить   Thu, 31 May 2007 12:45:16 +0400 (#669443)

 

Hi dgstudio,

Thursday, May 31, 2007, 11:45:16 AM, you wrote:

Лог апача:
*** - - [31/May/2007:17:22:05 +0300] "GET /ru/test%2Ftest/ HTTP/1.1" 404 284
с лишней цифрой после %:
*** - - [31/May/2007:17:23:28 +0300] "GET /ru/test%22Ftest/ HTTP/1.1" 200 2950

Ответить   Thu, 31 May 2007 17:26:37 +0300 (#669454)