#3891From:Gennadij Pastuhov
To:All
Date:06-05-2020 19:08:29
Subj:apache utf8 uri escaping?
Рад всех приветствовать! А особенно - 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
--- GoldED+/W32 1.1.5-041013 xenofont.chat.ru skype pastuhovgena
* Origin: Чёрнaя дырa - труднодоступнaя aфрикaнскaя провинция (2:5036/26)
SEEN-BY: 5020/1042 5036/26 6090/1
PATH: 5036/26 5020/1042 6090/1
#3892From:Eugene Grosbein
To:Gennadij Pastuhov
Date:07-05-2020 01:22:12
Subj:Re: apache utf8 uri escaping?
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> страницу с окончанием 'гуд'. При попытке зайти (хоть курлом) фактически отдаётся
GP> адрес /%D0%B3%D13%D0%B4 (г3д). Возникло предположение, что движок mod_rewrite
GP> воспринял %8, как backreference, и выбросил его. Попробовали вручную вписать в
GP> конфиг: /\%D0\%B3\%D1\%83\%D0\%B4 - так RewriteRule заработало нормально.
GP> Вопросы: верное ли это предположение? Если конфиг апача генерится эхотагом, то,
GP> получается, нужно подобные строки (содержащие %), прогонять через: s/%/\\%/g ?
GP> И риторический: долгое гугление на эту тему вообще ничего не дало, как будто
GP> такая проблема возникла первый раз. Правда, что ли?

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

****://******.*****.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
--
Поэты - страшные люди. У них все святое.
--- slrn/1.0.3 (FreeBSD)
* Origin: RDTC JSC (2:5006/1@fidonet)
SEEN-BY: 5006/1 5020/1042 5080/102 6090/1
PATH: 5006/1 5080/102 5020/1042 6090/1
#3893From:Gennadij Pastuhov
To:Eugene Grosbein
Date:06-05-2020 23:21:18
Subj:apache utf8 uri escaping?
Рад всех приветствовать! А особенно - 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> ****://******.*****.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
--- GoldED+/W32 1.1.5-041013 xenofont.chat.ru skype pastuhovgena
* Origin: Топ - топ - топ - топ. Чёрные лапки!!!! (2:5036/26)
SEEN-BY: 5020/1042 5036/26 6090/1
PATH: 5036/26 5020/1042 6090/1
#3894From:Eugene Grosbein
To:Gennadij Pastuhov
Date:07-05-2020 05:56:27
Subj:Re: apache utf8 uri escaping?
06 мая 2020, среда, в 23:21 NOVT, Gennadij Pastuhov написал(а):

EG>> ****://******.*****.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> Я не очень большой спец по апачу, не очень понял ответ. То, что RewriteRule
GP> применяется к %-decoded, означает, что сначала строка из директивы декодируется,
GP> а потом к ней применяется правило? Или что правило уже должно быть записано в
GP> декодированном виде?

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

Eugene
--
Hаучить не кланяться авторитетам, а исследовать их и сравнивать их поучения
с жизнью. Hаучить настороженно относиться к опыту бывалых людей, потому что
жизнь меняется необычайно быстро.
--- slrn/1.0.3 (FreeBSD)
* Origin: RDTC JSC (2:5006/1@fidonet)
SEEN-BY: 5006/1 5020/1042 5080/102 6090/1
PATH: 5006/1 5080/102 5020/1042 6090/1
#3895From:Stas Mishchenkov
To:All
Date:23-05-2020 13:44:05
Subj:имена файлов
Hi, All!

На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда отдает их в cp1251. Если нужно создать список файлов в cp866, то в именах файлов иногда встречается следующее:
cp1251: Ленинград - Ах уехала жена.mp3
cp866: Ленинград ? Ах уехала жена.mp3
Как правильно избежать такой ситуации, ну, кроме переименования файлов, разумеется?

Have nice nights.
Stas Mishchenkov.

--- Запомни, люди не меняются, ты их просто лучше узнаёшь.
* Origin: Lame Users Breeding. Simferopol, Crimea. (2:460/5858)
SEEN-BY: 460/58 5858 5020/545 1042 4441 6090/1
PATH: 460/5858 58 5020/545 4441 1042 6090/1
#3896From:Alexey Vissarionov
To:Stas Mishchenkov
Date:23-05-2020 14:23:00
Subj:имена файлов
Доброго времени суток, Stas!
23 May 2020 13:44:10, ты -> All:

SM> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда
SM> отдает их в cp1251. Если нужно создать список файлов в cp866, то
SM> в именах файлов иногда встречается следующее:
SM> cp1251: Ленинград - Ах уехала жена.mp3
SM> cp866: Ленинград ? Ах уехала жена.mp3
SM> Как правильно избежать такой ситуации,

Да в общем-то ничего сложного...

SM> ну, кроме переименования файлов, разумеется?

Значит, никак.


--
Alexey V. Vissarionov aka Gremlin from Kremlin
gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii

... Овощ вам в помощь - в смысле, хрен с вами!
--- /bin/vi
* Origin: ****://******.*****/Owl/ru (2:5020/545)
SEEN-BY: 5020/545 1042 4441 6090/1
PATH: 5020/545 4441 1042 6090/1
#3897From:Alexander N. Skovpen
To:Stas Mishchenkov
Date:23-05-2020 21:07:17
Subj:имена файлов
Hello Stas Mishchenkov!

23 May 20 13:44:10, Stas Mishchenkov wrote to All:

SM> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда отдает их в cp1251. Если нужно создать список файлов в cp866, то в именах файлов иногда встречается следующее:
SM> cp1251: Ленинград - Ах уехала жена.mp3
SM> cp866: Ленинград ? Ах уехала жена.mp3
SM> Как правильно избежать такой ситуации, ну, кроме переименования файлов, разумеется?
А как ты CP1251 в CP866 перекодируешь?

Alexander


--- ════════╦╦═╦╦═╗╔════
* Origin: ═╩══╬╩═╩╩═╬╬═ (2:5020/9696)
SEEN-BY: 5020/715 1042 4441 9696 6090/1
PATH: 5020/9696 715 4441 1042 6090/1
#3898From:Stas Mishchenkov
To:Alexander N. Skovpen
Date:23-05-2020 21:44:18
Subj:имена файлов
Hi, Alexander!

23 май 20 21:07, Alexander N. Skovpen -> Stas Mishchenkov:

SM>> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда
SM>> отдает их в cp1251. Если нужно создать список файлов в cp866, то в
SM>> именах
SM>> файлов иногда встречается следующее:
SM>> cp1251: Ленинград - Ах уехала жена.mp3
SM>> cp866: Ленинград ? Ах уехала жена.mp3
SM>> Как правильно избежать такой ситуации, ну, кроме переименования файлов,
SM>> разумеется?

ANS> А как ты CP1251 в CP866 перекодируешь?

use Encode 'decode';
use Encode 'encode';

$fname = encode( 'cp866', decode( 'cp1251', $key ) ) if $^O eq 'MSWin32';

кстати, почему-то from_to не срабатывает, хотя внутри у нее как раз то же самое.
и еще один вопрос попутно...
if $^O eq 'MSWin32'; - не совсем корректная проверка, но setlocale почему-то под разной виндой выдает разное при одной и той же локали.

Have nice nights.
Stas Mishchenkov.

--- Мужики, они как куры - двадцать метров от дома и уже ничьи.
* Origin: Lame Users Breeding. Simferopol, Crimea. (2:460/5858)
SEEN-BY: 460/58 5858 5020/545 1042 4441 6090/1
PATH: 460/5858 58 5020/545 4441 1042 6090/1
#3899From:Stas Mishchenkov
To:Alexey Vissarionov
Date:23-05-2020 21:53:03
Subj:имена файлов
Hi, Alexey!

23 май 20 14:23, Alexey Vissarionov -> Stas Mishchenkov:

SM>> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда
SM>> отдает их в cp1251. Если нужно создать список файлов в cp866, то
SM>> в именах файлов иногда встречается следующее:
SM>> cp1251: Ленинград - Ах уехала жена.mp3
SM>> cp866: Ленинград ? Ах уехала жена.mp3
SM>> Как правильно избежать такой ситуации,

AV> Да в общем-то ничего сложного...

Что-то мне подсказывает, что лазейка есть, ииначе бы не спрашивал.

SM>> ну, кроме переименования файлов, разумеется?

AV> Значит, никак.

Этого я и боялся. Не, для себя под полумух я делал скриптик на REXX-е, который транслитерировал и переименовывал файлы, причем не по правилам жертв ЕГЭ, а старорежимно правильно. Хотелось бы обойтись в этот раз...

Have nice nights.
Stas Mishchenkov.

--- Бухать - не выход. Но вариант.
* Origin: Lame Users Breeding. Simferopol, Crimea. (2:460/5858)
SEEN-BY: 460/58 5858 5020/545 1042 4441 6090/1
PATH: 460/5858 58 5020/545 4441 1042 6090/1
#3900From:Eugene Grosbein
To:Stas Mishchenkov
Date:24-05-2020 07:57:06
Subj:Re: имена файлов
23 мая 2020, суббота, в 13:44 NOVT, Stas Mishchenkov написал(а):

SM> Hа ntfs имена файлов хранятся в UTF-16, в консоль при этом винда отдает их
SM> в cp1251. Если нужно создать список файлов в cp866, то в именах файлов иногда
SM> встречается следующее:
SM> cp1251: Ленинград - Ах уехала жена.mp3
SM> cp866: Ленинград ? Ах уехала жена.mp3
SM> Как правильно избежать такой ситуации, ну, кроме переименования файлов,
SM> разумеется?

И в наборе символов Unicode (а UTF-16 лишь один из технических способов
представления Unicode), и в наборе символов cp1251 есть символы,
которых тупо нет в cp866, таких как длинное тире или "типографские кавычки".

Если в таблице тупо нет символа, то ты можешь только подобрать
более-менее подходящий по виду символ или группу символов для замены.

CP866 отличается от KOI8-R только порядком символов в таблице,
а сам набор символов тот же самый, поэтому тебе, может быть,
пригодится готовая таблица для такиз замен за авторством
покойного Чернова из его утилиты fromwin, правда в синтаксисе C:

win2koi8[] = {
"Ъ", "Г", "\'", "г", "\"", "...", "+", "+", /* 80-87 */
"#", "%", "ЛЬ", "<", "HЬ", "К", "h", "Ц", /* 88-8F */
"h", "`", "\'", "\"", "\"", "\x95", "-", "-", /* 90-97 */
"#", "(TM)", "ль", ">", "нь", "к", "h", "ц", /* 98-9F */
"\x9A", "У", "у", "J", "$", "Г", "|", "$", /* A0-A7 */
"\xB3", "\xBF", "Е", "\"", "^", "-", "(R)", "I", /* A8-AF */
"\x9C", "+", "I", "i", "г", "m", "#", "\x9E", /* B0-B7 */
"\xA3", "N", "е", "\"", "j", "S", "s", "i", /* B8-BF */
"\xE1", "\xE2", "\xF7", "\xE7", "\xE4", "\xE5", "\xF6", "\xFA", /* C0-C7 */
"\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF", "\xF0", /* C8-CF */
"\xF2", "\xF3", "\xF4", "\xF5", "\xE6", "\xE8", "\xE3", "\xFE", /* D0-D7 */
"\xFB", "\xFD", "\xFF", "\xF9", "\xF8", "\xFC", "\xE0", "\xF1", /* D8-DF */
"\xC1", "\xC2", "\xD7", "\xC7", "\xC4", "\xC5", "\xD6", "\xDA", /* E0-E7 */
"\xC9", "\xCA", "\xCB", "\xCC", "\xCD", "\xCE", "\xCF", "\xD0", /* E8-EF */
"\xD2", "\xD3", "\xD4", "\xD5", "\xC6", "\xC8", "\xC3", "\xDE", /* F0-F7 */
"\xDB", "\xDD", "\xDF", "\xD9", "\xD8", "\xDC", "\xC0", "\xD1" /* F8-FF */
};

Тут символ многоточия заменяется на три точки, варианты тире
на дефис, символ копирайта на (R) и так далее.

Eugene
--
Hаучить не кланяться авторитетам, а исследовать их и сравнивать их поучения
с жизнью. Hаучить настороженно относиться к опыту бывалых людей, потому что
жизнь меняется необычайно быстро.
--- slrn/1.0.3 (FreeBSD)
* Origin: RDTC JSC (2:5006/1@fidonet)
SEEN-BY: 5006/1 5020/1042 5080/102 6090/1
PATH: 5006/1 5080/102 5020/1042 6090/1
Выделенный сервер за 149 руб!