Spec-Zone.ru › Apache HTTP Server

Динамические массовые виртуальные хосты с mod_rewrite

Этот документ дополняет справочную документацию mod_rewrite. В нём описано, как использовать mod_rewrite для динамической настройки виртуальных хостов.

mod_rewrite — не лучший способ настройки виртуальных хостов. Прежде чем прибегать к mod_rewrite, рассмотрите альтернативы. См. также документ «Как избежать использования mod_rewrite.

Виртуальные хосты для произвольных имён хостов

Описание:

Мы хотим автоматически создавать виртуальный хост для каждого имени хоста, разрешаемого в нашем домене, не создавая при этом новые секции VirtualHost.

В этом примере предполагается, что для каждого пользователя будет использоваться имя хоста www.SITE.example.com, а его содержимое будет размещаться в /home/SITE/www.

Решение:
RewriteEngine on

RewriteMap    lowercase int:tolower

RewriteCond   "${lowercase:%{HTTP_HOST}}"   "^www\.([^.]+)\.example\.com$"
RewriteRule   "^(.*)" "/home/%1/www$1"
Обсуждение
Вам нужно самостоятельно настроить разрешение DNS-имён — Apache не выполняет разрешение имён. Необходимо либо создать записи CNAME для каждого имени хоста, либо запись DNS с подстановочным знаком. Создание записей DNS выходит за рамки этого документа.

Внутренняя директива tolower RewriteMap используется, чтобы гарантировать, что все используемые имена хостов записаны строчными буквами. Это исключает неоднозначность в структуре каталогов, которую необходимо создать.

Круглые скобки в RewriteCond захватываются в обратные ссылки %1, %2 и т. д., а круглые скобки в RewriteRule — в обратные ссылки $1, $2 и т. д.

Как и во многих других описанных в этом документе приёмах, mod_rewrite на самом деле не лучший способ выполнить эту задачу. Вместо этого рассмотрите возможность использования mod_vhost_alias: этот способ гораздо лучше справляется с задачами, выходящими за рамки предоставления статических файлов, такими как обработка динамического содержимого и разрешение Alias.

Динамические виртуальные хосты с использованием mod_rewrite

Этот фрагмент из httpd.conf выполняет ту же задачу, что и первый пример. Первая половина очень похожа на соответствующую часть выше, за исключением некоторых изменений, необходимых для обратной совместимости и корректной работы части mod_rewrite; во второй половине mod_rewrite настраивается для выполнения основной работы.

Поскольку mod_rewrite запускается до других модулей преобразования URI (например, mod_alias), необходимо явно указать mod_rewrite игнорировать все URL, которые обрабатывались бы этими модулями. Кроме того, поскольку в противном случае эти правила обходили бы все директивы ScriptAlias, мы должны явно заставить mod_rewrite выполнять соответствующие преобразования.

# get the server name from the Host: header
UseCanonicalName Off

# splittable logs
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon

<Directory "/www/hosts">
    # ExecCGI is needed here because we can't force
    # CGI execution in the way that ScriptAlias does
    Options FollowSymLinks ExecCGI
</Directory>

RewriteEngine On

# a ServerName derived from a Host: header may be any case at all
RewriteMap  lowercase  int:tolower

## deal with normal documents first:
# allow Alias "/icons/" to work - repeat for other aliases
RewriteCond  "%{REQUEST_URI}"  "!^/icons/"
# allow CGIs to work
RewriteCond  "%{REQUEST_URI}"  "!^/cgi-bin/"
# do the magic
RewriteRule  "^/(.*)$"  "/www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1"

## and now deal with CGIs - we have to force a handler
RewriteCond  "%{REQUEST_URI}"  "^/cgi-bin/"
RewriteRule  "^/(.*)$"  "/www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1"  [H=cgi-script]

Использование отдельного файла конфигурации виртуальных хостов

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

Файл vhost.map должен выглядеть примерно так:

customer-1.example.com /www/customers/1
customer-2.example.com /www/customers/2
# ...
customer-N.example.com /www/customers/N

Файл httpd.conf должен содержать следующее:

RewriteEngine on

RewriteMap   lowercase  int:tolower

# define the map file
RewriteMap   vhost      "txt:/www/conf/vhost.map"

# deal with aliases as above
RewriteCond  "%{REQUEST_URI}"               "!^/icons/"
RewriteCond  "%{REQUEST_URI}"               "!^/cgi-bin/"
RewriteCond  "${lowercase:%{SERVER_NAME}}"  "^(.+)$"
# this does the file-based remap
RewriteCond  "${vhost:%1}"                  "^(/.*)$"
RewriteRule  "^/(.*)$"                      "%1/docs/$1"

RewriteCond  "%{REQUEST_URI}"               "^/cgi-bin/"
RewriteCond  "${lowercase:%{SERVER_NAME}}"  "^(.+)$"
RewriteCond  "${vhost:%1}"                  "^(/.*)$"
RewriteRule  "^/cgi-bin/(.*)$"                      "%1/cgi-bin/$1" [H=cgi-script]

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/rewrite/vhosts.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API