Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

apache utf8 uri escaping?

0 views
Skip to first unread message

Gennadij Pastuhov

unread,
May 6, 2020, 12:25:02 PM5/6/20
to
Рад всех приветствовать! А особенно - All!

Очередная не очень понятная проблема. Есть апач, в конфиге которого есть такой
кусок:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule (.*) <тут поскипано>/%D0%B3%D1%83%D0%B4 [R=301,NE,L]
</IfModule>

Т.е., предполагается, что при заходе на сервер будет перенаправление на
страницу с окончанием 'гуд'. При попытке зайти (хоть курлом) фактически
отдаётся адрес /%D0%B3%D13%D0%B4 (г3д). Возникло предположение, что движок
mod_rewrite воспринял %8, как backreference, и выбросил его. Попробовали
вручную вписать в конфиг: /\%D0\%B3\%D1\%83\%D0\%B4 - так RewriteRule
заработало нормально.

Вопросы: верное ли это предположение? Если конфиг апача генерится эхотагом, то,
получается, нужно подобные строки (содержащие %), прогонять через: s/%/\\%/g ?
И риторический: долгое гугление на эту тему вообще ничего не дало, как будто
такая проблема возникла первый раз. Правда, что ли?

... Jonny wanna live

Eugene Grosbein

unread,
May 6, 2020, 2:30:01 PM5/6/20
to
06 мая 2020, среда, в 19:08 NOVT, Gennadij Pastuhov написал(а):

GP> <IfModule mod_rewrite.c>
GP> RewriteEngine on
GP> RewriteRule (.*) <тут поскипано>/%D0%B3%D1%83%D0%B4 [R=301,NE,L]
GP> </IfModule>
GP> Т.е., предполагается, что при заходе на сервер будет
GP> </IfModule>
перенаправление на
GP> страницу с окончанием 'гуд'. При попытке зайти (хоть курлом) фактически
GP> отдаётся
GP> адрес /%D0%B3%D13%D0%B4 (г3д). Возникло предположение, что движок
GP> mod_rewrite
GP> воспринял %8, как backreference, и выбросил его. Попробовали вручную
GP> вписать в
GP> конфиг: /\%D0\%B3\%D1\%83\%D0\%B4 - так RewriteRule заработало нормально.
GP> Вопросы: верное ли это предположение? Если конфиг апача генерится
GP> эхотагом, то,
GP> получается, нужно подобные строки (содержащие %), прогонять через:
GP> s/%/\\%/g ?
GP> И риторический: долгое гугление на эту тему вообще ничего не дало, как
GP> будто
GP> такая проблема возникла первый раз. Правда, что ли?

Hадо было не гуглить, а *внимательно* читать документацию
на директиву RewriteRule.

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule

Pattern is a perl compatible regular expression. On the first RewriteRule
it is applied to the (%-decoded) URL-path of the request;
subsequent patterns are applied to the output of the last matched RewriteRule.

Ключевое слово %-decoded. То есть матчить надо уже декодированную строку.
Если же у тебя реально матчятся %-кодированные данные, значит твои
ссылки некорректно дважды %-кодируются при генерации.

Eugene
--
Поэты - страшные люди. У них все святое.

Gennadij Pastuhov

unread,
May 6, 2020, 4:35:02 PM5/6/20
to
Рад всех приветствовать! А особенно - Eugene!

Четверг мая 07 20 01:22 Eugene Grosbein писал к Gennadij Pastuhov:

GP>> <IfModule mod_rewrite.c>
GP>> RewriteEngine on
GP>> RewriteRule (.*) <тут поскипано>/%D0%B3%D1%83%D0%B4 [R=301,NE,L]
GP>> </IfModule>
GP>> Т.е., предполагается, что при заходе на сервер будет
GP>> перенаправление на
GP>> страницу с окончанием 'гуд'. При попытке зайти (хоть курлом)
GP>> фактически отдаётся
GP>> адрес /%D0%B3%D13%D0%B4 (г3д). Возникло предположение, что движок
GP>> mod_rewrite
GP>> воспринял %8, как backreference, и выбросил его. Попробовали
GP>> вручную вписать в
GP>> конфиг: /\%D0\%B3\%D1\%83\%D0\%B4 - так RewriteRule заработало
GP>> нормально.
GP>> Вопросы: верное ли это предположение? Если конфиг апача генерится
GP>> эхотагом, то,
GP>> получается, нужно подобные строки (содержащие %), прогонять
GP>> через: s/%/\\%/g ?
GP>> И риторический: долгое гугление на эту тему вообще ничего не
GP>> дало, как будто
GP>> такая проблема возникла первый раз. Правда, что ли?

EG> Hадо было не гуглить, а *внимательно* читать документацию
EG> на директиву RewriteRule.

EG> http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule

EG> Pattern is a perl compatible regular expression. On the first
EG> RewriteRule it is applied to the (%-decoded) URL-path of the request;
EG> subsequent patterns are applied to the output of the last matched
EG> RewriteRule.

EG> Ключевое слово %-decoded. То есть матчить надо уже декодированную
EG> строку. Если же у тебя реально матчятся %-кодированные данные, значит
EG> твои ссылки некорректно дважды %-кодируются при генерации.

Я не очень большой спец по апачу, не очень понял ответ. То, что RewriteRule
применяется к %-decoded, означает, что сначала строка из директивы
декодируется, а потом к ней применяется правило? Или что правило уже должно
быть записано в декодированном виде? Сейчас, насколько я понимаю, в конфиг
передаются строки, прошедшие код типа этого:

use URI::Escape;
my $url = '/гуд';
my $escaped = uri_escape_utf8($url);
print "Esc: " . $escaped;

Esc: %2F%D0%B3%D1%83%D0%B4

... Jonny wanna live

Eugene Grosbein

unread,
May 6, 2020, 7:05:02 PM5/6/20
to
06 мая 2020, среда, в 23:21 NOVT, Gennadij Pastuhov написал(а):

EG>> http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule
EG>> Pattern is a perl compatible regular expression. On the first
EG>> RewriteRule it is applied to the (%-decoded) URL-path of the request;
EG>> subsequent patterns are applied to the output of the last matched
EG>> RewriteRule.
EG>> Ключевое слово %-decoded. То есть матчить надо уже декодированную
EG>> строку. Если же у тебя реально матчятся %-кодированные данные, значит
EG>> твои ссылки некорректно дважды %-кодируются при генерации.

GP> Я не очень большой спец по апачу, не очень понял ответ. То, что
GP> RewriteRule
GP> применяется к %-decoded, означает, что сначала строка из директивы
GP> декодируется,
GP> а потом к ней применяется правило? Или что правило уже должно быть
GP> записано в
GP> декодированном виде?

Второе. Прежде чем mod_rewrite получит строку на обработку, она декодируется.

Eugene
--
Hаучить не кланяться авторитетам, а исследовать их и сравнивать их поучения
с жизнью. Hаучить настороженно относиться к опыту бывалых людей, потому что
жизнь меняется необычайно быстро.
0 new messages