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]

[apache-rus] CGI redirector vs. mod_rewrite



Приветствую!

Вот я тут попробовал сделать Redirect с URL с автоматическим
определением кодировки на URL с кодировкой клиента (перекодировка
по портам) с помощью mod_rewrite. Вроде, оно даже работает :) -
всех, кто приходит на http://www.y.z[:80]/a/b/c апач отправляет
на http://www.y.z:810x/a/b/c. Для https не проверял, но тоже
должно работать.

**********

UseCanonicalName Off
# или NameOnly, см. ниже

Listen 80
Listen 8100
Listen 8101
Listen 8102
Listen 8103
Listen 8104
#Listen 8105
CharsetByPort koi8-r 8100
CharsetByPort windows-1251 8101
CharsetByPort ibm866 8102
CharsetByPort iso-8859-5 8103
CharsetByPort x-mac-cyrillic 8104

<IfModule mod_rewrite.c>
RewriteEngine On

<IfModule mod_charset.c>
# (1)
#RewriteCond %{SERVER_PORT}	!=80
RewriteCond %{LA-U:ENV:CHARSET_SERVER_PORT}	!=80
RewriteRule (.*)		$1			[skip=9]
RewriteRule .*			/%{LA-U:ENV:CHARSET}/	[nosubreq]
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]
RewriteRule .*			%{REQUEST_URI}		[skip=2,nosubreq]
# or
#RewriteRule .*			/:8105			[nosubreq]
RewriteRule (.*)		$1			[redirect,nosubreq]
RewriteRule (.+)/(.*)		$1$2%{REQUEST_URI}	[redirect=permanent,last,nosubreq]
</IfModule>

# Custom rules here

RewriteRule (.*)		$1			[passthrough]
</IfModule>

**********

Напоминает конфиг одной почтовой программы, правда? ;)

Пояснения к (1): для проверки хотелось бы использовать SERVER_PORT, но
у апача есть неприятная бага (фича?) - если клиент не шлет 'Host:', то
SERVER_PORT всегда будет равен номеру порта по умолчанию, т.е. 80.
Это касается и CGI. Причем установка UseCanonicalName в Off не помогает.
Поэтому приходится делать subrequest (это достаточно дорогая операция),
чтобы получить значение CHARSET_SERVER_PORT.

Фича лечится патчем -
ftp://ftp.escortcorp.com/pub/Linux/misc/patches/apache-1.3.4-port.patch.gz
Кроме того, этот патч добавляет еще одно значение для UseCanonicalName -
"NameOnly" - т.е. не трогать порт.

**********

В общем-то, хотелось бы, чтобы в дистрибутивную конфигурацию RA было
включено нечто подобное, так как Expires на каждой шагу уже порядком
достали. А тут никакой возни со скриптами. Что думает по этому поводу
прогрессивная общественность?

-- 
Vladimir Pastukhov <vol@escortcorp.com>

PS. btw, готовый rpm для RH 5.x с приложенным патчем можно взять на
ftp://ftp.escortcorp.com/pub/Linux/RedHat/local/





Спонсоры сайта:

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