Руководство по URL преобразованиям
Управление содержанием
Массовый виртуальный хостинг
Описание:
Опция <VirtualHost> Apache очень хороша и великолепно работает когда у вас есть немного виртуальных хостов. Однако когда в являетесь ISP и имеете сотни виртуальных хостов это является не лучшим выбором для такой задачи.
Решение:
Для решения этой задачи мы создадим ассоциации страниц на виртуальных хостах или даже полностью всего веб-пространства виртуальных хостов, с ресурсами в нашем пространстве имен(ресурсами основного сервера) с использованием Proxy функции (флаг [P]):
##
## httpd.conf
##
:
# используем каноническое имя хоста при редиректах, и т.д.
UseCanonicalName on
:
# добавляем впереди виртуальный хост формата CLF
CustomLog /path/to/access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b"
:
# включаем механизм mod_rewrite на основном сервере
RewriteEngine on
# определяем два массива: один для коррекции URL и другой для определения
# доступных виртуальных хостов с соответствующим
# DocumentRoot.
RewriteMap lowercase int:tolower
RewriteMap vhost txt:/path/to/vhost.map
# Теперь делаем реальные ассоциации с виртуальными хостами
# через большое и сложное одиночное правило:
#
# 1. проверяем что мы не делаем ассоциации с собственными URL
# (принадлежащими основному серверу)
RewriteCond %{REQUEST_URL} !^/commonurl1/.*
RewriteCond %{REQUEST_URL} !^/commonurl2/.*
:
RewriteCond %{REQUEST_URL} !^/commonurlN/.*
#
# 2. проверяем что мы имеем заголовок хоста, потому что
# сейчас наша единственная задача это поддерживать
# виртуальный хостинг через этот заголовок
RewriteCond %{HTTP_HOST} !^$
#
# 3. переводим имя хоста в нижний регистр
RewriteCond ${lowercase:%{HTTP_HOST}|NONE} ^(.+)$
#
# 4. ищем имя этого хоста в vhost.map и
# запоминаем его только тогда, когда оно является путём
# (а не "NONE" см. выше)
RewriteCond ${vhost:%1} ^(/.*)$
#
# 5. наконец мы можем ассоциировать этот URL с местоположением его реального
# document root
# и запоминаем имя виртуального хоста для записи в журнал
RewriteRule ^/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}]
: