Приветствую!
Вот я тут попробовал сделать 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" 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.