Alex Tutubalin/Apache-RUS team wrote:
>
> > Вот я тут попробовал сделать Redirect с URL с автоматическим
> > определением кодировки на URL с кодировкой клиента (перекодировка
> > по портам) с помощью mod_rewrite. Вроде, оно даже работает :) -
> Кто бы объяснил, как оно работает. Идея в том, что первая строка
> делает subrequest и после этого появляется переменная CHARSET ?
Не совсем. Конструкция %{LA-U:ENV:CHARSET} действительно делает
subrequest и достает оттуда значение CHARSET, но самой переменной
в окружении при этом не появляется. Функция lookup_variable() (или
вроде того, не помню) из mod_rewrite.c - рекурсивная и каждый раз
обрезает 'LA-[UF]:' в начале имени. Теоретически, видимо, можно
написать что-нибудь вроде %{LA-U:LA-U:LA-F:LA-U:...} ;)
Если требуется получить значения нескольких переменных CHARSET_*,
то для каждой нужно сделать по одному subrequest.
Повторю еще раз, теперь с комментариями:
# Тут мы обходим дальнейшие преобразования, если исходный порт не 80
#RewriteCond %{SERVER_PORT} !=80
RewriteCond %{LA-U:ENV:CHARSET_SERVER_PORT} !=80
RewriteRule (.*) $1 [skip=9]
# Делается subrequest и из него выдирается CHARSET, при
# этом значение URL path целиком заменяется на строку
# вида '/client_charset/'
RewriteRule .* /%{LA-U:ENV:CHARSET}/ [nosubreq]
# Выбираем соответствующий кодировке порт. Слэши перед
# ':810x' нужны - результат должен начинаться либо с '/',
# либо с корректного имени метода (http://, proxy://, etc.)
RewriteRule /koi8-r/ /:8100 [skip=5,nosubreq]
RewriteRule /windows-1251/ /:8101 [skip=4,nosubreq]
RewriteRule /ibm866/ /:8102 [skip=3,nosubreq]
RewriteRule /iso-8859-5/ /:8103 [skip=2,nosubreq]
RewriteRule /x-mac-cyrillic/ /:8104 [skip=1,nosubreq]
# Для неопознанных предыдущими правилами кодировок
# либо делаем редирект на порт 8105 - при последующих
# запросах этого клиента цепочка рулесов больше не
# будет выполняться, ...
RewriteRule .* /:8105 [nosubreq]
# ... либо сразу выдаем документ (раскомментарено
# должно быть только одно из этих правил!)
#RewriteRule .* %{REQUEST_URI} [skip=2,nosubreq]
# Здесь мы заменяем строку '/:810x' на саму себя. Опция redirect
# говорит mod_rewrite, что если результат начинается с '/', то
# спереди нужно еще добавить 'http[s]://server'. Получаем
# 'http[s]://server/:810x'
RewriteRule (.*) $1 [redirect,nosubreq]
# Убираем слэш перед номером порта и добавляем в конец путь.
# last означает, что на этом правиле нужно закончить обработку.
RewriteRule (.+)/(.*) $1$2%{REQUEST_URI} [redirect=permanent,last,nosubreq]
# Сюда делается переход из первого (условного) правила.
# Запросы на порт !=80 передаются другим преобразователям
# URI->path (mod_alias, etc.)
RewriteRule (.*) $1 [passthrough]
--
Vladimir Pastukhov <vol@escortcorp.com>
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE.
Copyright (C) 1995-2001 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C)
1997-2009 Alex Tutubalin. Design (C) 1998 Max Smolev.