Динамические массовые виртуальные хосты с 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 выходит за рамки этого документа.
Внутренняя директива
tolowerRewriteMap используется, чтобы гарантировать, что все используемые имена хостов записаны строчными буквами. Это исключает неоднозначность в структуре каталогов, которую необходимо создать.Круглые скобки в
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