Пункт 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-адрес серверной части соединения для интерполяции каталогов вместо имени сервера.