Russian Apache Switch to English
Switch to Russian koi8-r
windows=1251
cp-866
iso8859-5
Russian Apache Как это работает Рекоммендации Где взять Как установить Как настроить Статус и поддержка
Краткий обзор FAQ Список рассылки Благодарности Поиск по серверу Powered by Russian Apache
Russian Apache mailing list archive (apache-rus@lists.lexa.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [apache-rus] CGI redirector vs. mod_rewrite



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 ] [ Как это работает ] [ Рекомендации ] [ Где взять ] [ Как установить ] [ Как настроить ] [ Статус и поддержка ] [ Краткий обзор ] [ FAQ ] [ Список рассылки ] [ Благодарности ] [ Поиск по серверу ] [ Powered by Russian Apache ] [ Apache-talk archive ]

"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.