Пункт 211. Модуль Apache mod_vhost_alias
Этот модуль создает динамически настраиваемые виртуальные хосты, позволяя Host:
использовать IP-адрес и/или заголовок HTTP-запроса как часть имени пути, чтобы определить, какие файлы обслуживать. Это позволяет легко использовать огромное количество виртуальных хостов с похожими конфигурациями.
Примечание
Если mod_alias
или mod_userdir
используются для преобразования URI в имена файлов, они переопределяют директивы, mod_vhost_alias
описанные ниже. Например, следующая конфигурация будет отображаться
/cgi-bin/script.pl
во
/usr/local/apache2/cgi-bin/script.pl
всех случаях:
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
VirtualScriptAlias "/никогда/найден/%0/cgi-bin/"
Интерполяция имени каталога
Все директивы в этом модуле интерполируют строку в путь. Интерполированная строка (далее именуемая «имя») может быть либо именем сервера ( UseCanonicalName
подробности о том, как это определяется, см. в директиве), либо IP-адресом виртуального хоста на сервере в точечно-квадратном формате. Интерполяцией управляют спецификаторы, вдохновленные которыми, printf
имеют несколько форматов:
%% |
вставить % |
%p |
вставьте номер порта виртуального хоста |
%N.M |
вставить (часть) имя |
N
и M
используются для указания подстрок имени. N
выбирает из компонентов имени, разделенных точками, и M
выбирает символы внутри того, что N
было выбрано.
M
является необязательным и по умолчанию равен нулю, если он отсутствует; точка должна присутствовать тогда и только тогда, когда M
она присутствует. Толкование следующее:
0 |
полное имя |
1 |
первая часть |
2 |
Вторая часть |
-1 |
последняя часть |
-2 |
предпоследняя часть |
2+ |
вторая и все последующие части |
-2+ |
предпоследняя и все предыдущие части |
1+ и -1+ |
такой же как 0 |
Если N
или M
больше, чем количество доступных частей, интерполируется одно подчеркивание.
Примеры
Для простых виртуальных хостов на основе имен вы можете использовать следующие директивы в файле конфигурации вашего сервера:
UseCanonicalName Выкл.
VirtualDocumentRoot "/usr/local/apache/vhosts/%0"
Запрос на
http://www.example.com/directory/file.html
будет удовлетворен файлом
/usr/local/apache/vhosts/www.example.com/directory/file.html
.
Для очень большого количества виртуальных хостов рекомендуется расположить файлы так, чтобы уменьшить размер каталога
vhosts
. Для этого вы можете использовать следующее в вашем файле конфигурации:
UseCanonicalName Выкл.
VirtualDocumentRoot "/usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2"
Запрос на
http://www.domain.example.com/directory/file.html
будет удовлетворен файлом
/usr/local/apache/vhosts/example.com/d/o/m/domain/directory/file.html
.
Более равномерного распространения файлов можно добиться путем хэширования с конца имени, например:
VirtualDocumentRoot "/usr/local/apache/vhosts/%3+/%2.-1/%2.-2/%2.-3/%2"
Пример запроса будет исходить от
/usr/local/apache/vhosts/example.com/n/i/a/domain/directory/file.html
.
В качестве альтернативы вы можете использовать:
VirtualDocumentRoot "/usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2.4+"
Пример запроса будет исходить от
/usr/local/apache/vhosts/example.com/d/o/m/ain/directory/file.html
.
Очень частым запросом пользователей является возможность указать несколько доменов на несколько корней документов, не беспокоясь о длине или количестве запрашиваемых частей имени хоста. Если запрошенное имя хоста sub.www.domain.example.com
вместо просто www.domain.example.com
, то использование %3+ приведет к тому, что корень документа будет /usr/local/apache/vhosts/domain.example.com/...
вместо предполагаемого example.com
каталога. В таких случаях может быть полезно использовать комбинацию %-2.0.%-1.0
, которая всегда будет давать доменное имя и tld, например, example.com
независимо от количества поддоменов, добавленных к имени хоста. Таким образом, можно сделать конфигурацию, которая будет направлять все поддомены первого, второго или третьего уровня в один и тот же каталог:
VirtualDocumentRoot "/usr/local/apache/vhosts/%-2.0.%-1.0"
В приведенном выше примере оба, www.example.com
а также www.sub.example.com
или example.com
будут указывать на /usr/local/apache/vhosts/example.com
.
Для виртуального хостинга на основе IP вы можете использовать в файле конфигурации следующее:
UseCanonicalName DNS
VirtualDocumentRootIP "/usr/local/apache/vhosts/%1/%2/%3/%4/docs"
VirtualScriptAliasIP "/usr/local/apache/vhosts/%1/%2/%3/%4/cgi-bin"
Запрос
http://www.domain.example.com/directory/file.html
был бы удовлетворен файлом
/usr/local/apache/vhosts/10/20/30/40/docs/directory/file.html
, если бы IP-адрес www.domain.example.com
был 10.20.30.40. Запрос на
http://www.domain.example.com/cgi-bin/script.pl
будет удовлетворен выполнением программы
/usr/local/apache/vhosts/10/20/30/40/cgi-bin/script.pl
.
Если вы хотите включить .
символ в
VirtualDocumentRoot
директиву, но он конфликтует с директивой %
, вы можете обойти проблему следующим образом:
VirtualDocumentRoot "/usr/local/apache/vhosts/%2.0.%3.0"
Запрос на
http://www.domain.example.com/directory/file.html
будет удовлетворен файлом
/usr/local/apache/vhosts/domain.example/directory/file.html
.
Директивы и полезны в сочетании с этим модулем LogFormat
. %V
%A
Директива VirtualDocumentRoot
Описание: | Динамически настроить расположение корня документа для данного виртуального хоста |
Синтаксис: | VirtualDocumentRoot interpolated-directory|none |
По умолчанию: | VirtualDocumentRoot none |
Контекст: | конфигурация сервера, виртуальный хост |
Положение дел: | Расширение |
Модуль: | mod_vhost_alias |
Директива VirtualDocumentRoot
позволяет вам определить, где Apache HTTP Server найдет ваши документы, на основе значения имени сервера. Результат расширения
interpolated-directory используется как корень дерева документов аналогично DocumentRoot
аргументу директивы. Если interpolated-directory есть, none
то
VirtualDocumentRoot
он выключен. Эту директиву нельзя использовать в том же контексте, что и VirtualDocumentRootIP
.
Примечание
VirtualDocumentRoot
переопределит любые
DocumentRoot
директивы, которые вы могли поместить в тот же контекст или дочерние контексты. Помещение a
VirtualDocumentRoot
в глобальную область сервера будет эффективно переопределять
DocumentRoot
директивы в любых виртуальных хостах, определенных позже, если только вы не установите
VirtualDocumentRoot
для
None
каждого виртуального хоста.
Директива VirtualDocumentRootIP
Описание: | Динамически настроить расположение корня документа для данного виртуального хоста |
Синтаксис: | VirtualDocumentRootIP interpolated-directory|none |
По умолчанию: | VirtualDocumentRootIP none |
Контекст: | конфигурация сервера, виртуальный хост |
Положение дел: | Расширение |
Модуль: | mod_vhost_alias |
Директива VirtualDocumentRootIP
аналогична
VirtualDocumentRoot
директиве, за исключением того, что она использует IP-адрес серверной части соединения для интерполяции каталогов вместо имени сервера.
Директива VirtualScriptAlias
Описание: | Динамически настроить расположение каталога CGI для данного виртуального хоста. |
Синтаксис: | VirtualScriptAlias interpolated-directory|none |
По умолчанию: | VirtualScriptAlias none |
Контекст: | конфигурация сервера, виртуальный хост |
Положение дел: | Расширение |
Модуль: | mod_vhost_alias |
Директива VirtualScriptAlias
позволяет вам определить, где Apache httpd будет находить CGI-скрипты аналогично тому, как это VirtualDocumentRoot
делается для других документов. Он соответствует запросам на начало URI /cgi-bin/
, как и ScriptAlias
/cgi-bin/
должно быть.
Директива VirtualScriptAliasIP
Описание: | Динамически настроить расположение каталога CGI для данного виртуального хоста. |
Синтаксис: | VirtualScriptAliasIP interpolated-directory|none |
По умолчанию: | VirtualScriptAliasIP none |
Контекст: | конфигурация сервера, виртуальный хост |
Положение дел: | Расширение |
Модуль: | mod_vhost_alias |
Директива VirtualScriptAliasIP
аналогична
VirtualScriptAlias
директиве, за исключением того, что она использует IP-адрес серверной части соединения для интерполяции каталогов вместо имени сервера.