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