#3891 | From: | 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
#3892 | From: | 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
#3893 | From: | 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
#3894 | From: | 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
#3895 | From: | 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
#3896 | From: | 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
#3897 | From: | 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
#3898 | From: | 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
#3899 | From: | 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
#3900 | From: | 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