(fwd) [apache-rus] CGI redirector vs. mod_rewrite

Andrey Gerzhov (kittle@freeland.alex-ua.com)
Sat, 30 Jan 1999 22:39:47 +0200 (EET)

-- forwarded message --
Path: freeland.alex-ua.com!news.alexradio.kiev.ua!not-for-mail
Message-ID: <36B19B22.5B52CBEC@escortcorp.com>
Date: Fri, 29 Jan 1999 16:27:10 +0500
From: Vladimir Pastukhov <vol@escortcorp.com>
To: Russian Apache mailing list <apache-rus@lists.lexa.ru>
Subject: [apache-rus] CGI redirector vs. mod_rewrite
Newsgroups: alex.gated.apache.rus
Lines: 81
Xref: freeland.alex-ua.com alex.gated.apache.rus:589

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

Вот я тут попробовал сделать 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/ -- end of forwarded message --

-- 
С тем, что не помешает никогда,
                                               Kittle