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 выходит за рамки этого документа.

Внутренняя директива 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

Spec-Zone.ru

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