Re[2]: Apache RewriteRule & %2F
Hi dgstudio,
Sunday, May 27, 2007, 7:59:57 PM, you wrote:
U>> Если в URL есть %2F ("/") (к примеру /test%2Ftest/), правило:
U>> RewriteRule (.*) /rule.php?url=$1 [QSA,L]
U>> - не работает
> Мы пришли к выводу, что это нерешаемо, и написали на такой случай
> хелпер, который делает urlencode только русским символам в строке.
> Конечно, это не универсальное решение.
Проблема находится где-то до правил модуля 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" в правиле.