Поддержка виртуальных хостов по имени
Этот документ описывает, когда и как использовать виртуальные хосты по имени.
Виртуальные хосты по имени против виртуальных хостов по IP-адресу
Виртуальные хосты по IP-адресу используют IP-адрес подключения для определения правильного виртуального хоста для обслуживания. Поэтому для каждого хоста нужен отдельный IP-адрес.
При виртуальном хостинге по имени сервер полагается на клиента, который сообщает имя хоста как часть заголовков HTTP. Используя эту технику, многие разные хосты могут использовать один и тот же IP-адрес.
Виртуальный хостинг по имени обычно проще, так как вам нужно только настроить ваш DNS-сервер для сопоставления каждого имени хоста с соответствующим IP-адресом, а затем настроить Apache HTTP Server для распознавания различных имён хостов. Виртуальный хостинг по имени также снижает потребность в ограниченных IP-адресах. Поэтому вы должны использовать виртуальный хостинг по имени, если только вы не используете оборудование, которое явно требует хостинг по IP-адресу. Исторические причины виртуального хостинга по IP-адресу, основанные на поддержке клиентом, больше не применимы к универсальному веб-серверу.
Виртуальный хостинг по имени основан на алгоритме выбора виртуального хоста по IP-адресу, что означает, что поиск правильного имени сервера происходит только среди виртуальных хостов, которые имеют наилучший IP-адрес.
Как сервер выбирает правильный виртуальный хост по имени
Важно понимать, что первым шагом в разрешении виртуального хоста по имени является разрешение по IP-адресу. Разрешение виртуального хоста по имени выбирает только наиболее подходящий виртуальный хост по имени после сужения кандидатов до лучшей IP-совместимости. Использование символа подстановки (*) для IP-адреса во всех директивах VirtualHost делает это сопоставление по IP-адресу неактуальным.
При получении запроса сервер найдёт наилучшее (наиболее специфичное) совпадение <VirtualHost> на основе IP-адреса и порта, используемых запросом. Если существует более одного виртуального хоста, содержащего эту оптимальную комбинацию адреса и порта, Apache дополнительно сравнит директивы ServerName и ServerAlias с именем сервера, присутствующим в запросе.
Если вы опустите директиву ServerName из любого виртуального хоста по имени, сервер по умолчанию использует полное доменное имя (FQDN), полученное из имени хоста системы. Это неявно заданное имя сервера может привести к неинтуитивному сопоставлению виртуальных хостов и не рекомендуется.
Виртуальный хост по умолчанию для комбинации IP и порта
Если в наборе виртуальных хостов, содержащих наиболее точное совпадение IP-адреса и порта, не найдено совпадения с ServerName или ServerAlias, то используется первый перечисленный виртуальный хост, который соответствует этому.
Использование виртуальных хостов по имени
| Связанные модули | Связанные директивы |
|---|---|
Первый шаг — создать блок <VirtualHost> для каждого разного хоста, который вы хотите обслуживать. Внутри каждого блока <VirtualHost> вам потребуется как минимум директива ServerName для обозначения обслуживаемого хоста и директива DocumentRoot для указания расположения контента этого хоста в файловой системе.
Основной хост исчезает
Любой запрос, который не соответствует существующему <VirtualHost>, обрабатывается глобальной конфигурацией сервера, независимо от имени хоста или ServerName.
Когда вы добавляете виртуальный хост по имени к существующему серверу, и аргументы виртуального хоста соответствуют существующим комбинациям IP и порта, запросы теперь будут обрабатываться явным виртуальным хостом. В этом случае обычно рекомендуется создать виртуальный хост по умолчанию с ServerName , соответствующим базовому серверу. Новые домены на том же интерфейсе и порту, но требующие отдельных конфигураций, затем могут быть добавлены как последующие (не по умолчанию) виртуальные хосты.
Наследование ServerName
Лучше всегда явно указывать ServerName в каждом виртуальном хосте по имени.
Если VirtualHost не указывает ServerName, имя сервера будет унаследовано из основной конфигурации сервера. Если имя сервера не было указано глобально, оно определяется при запуске через обратное разрешение DNS первого адресного соединения. В любом случае это унаследованное имя сервера повлияет на разрешение виртуальных хостов по имени, поэтому лучше всегда явно указывать ServerName в каждом виртуальном хосте по имени.
Например, предположим, что вы обслуживаете домен www.example.com и хотите добавить виртуальный хост other.example.com, который указывает на тот же IP-адрес. Тогда вы просто добавляете следующее в httpd.conf:
<VirtualHost *:80>
# This first-listed virtual host is also the default for *:80
ServerName www.example.com
ServerAlias example.com
DocumentRoot "/www/domain"
</VirtualHost>
<VirtualHost *:80>
ServerName other.example.com
DocumentRoot "/www/otherdomain"
</VirtualHost> Вы можете альтернативно указать явный IP-адрес вместо * в директивах <VirtualHost>. Например, вы можете сделать это, чтобы запустить некоторые виртуальные хосты по имени на одном IP-адресе, а либо виртуальные хосты по IP-адресу, либо другой набор виртуальных хостов по имени на другом адресе.
Многие серверы хотят быть доступными под несколькими именами. Это возможно с помощью директивы ServerAlias, размещённой в разделе <VirtualHost>. Например, в первом блоке <VirtualHost> выше, директива ServerAlias указывает, что перечисленные имена являются другими именами, которые пользователи могут использовать для просмотра этого веб-сайта:
ServerAlias example.com *.example.com
тогда запросы для всех хостов в домене example.com будут обслуживаться виртуальным хостом www.example.com. Символы подстановки * и ? могут использоваться для соответствия именам. Конечно, вы не можете просто придумать имена и поместить их в ServerName или ServerAlias. Вы должны сначала правильно настроить свой DNS-сервер для сопоставления этих имен с IP-адресом, связанным с вашим сервером.
Виртуальные хосты по имени для наилучшего совпадающего набора <virtualhost> обрабатываются в порядке их появления в конфигурации. Первый совпадающий ServerName или ServerAlias используется без разницы в приоритете для подстановочных символов (ни для ServerName, ни для ServerAlias).
Полный список имён в директиве VirtualHost рассматривается так же, как (не подстановочный) ServerAlias.
Наконец, вы можете уточнить конфигурацию виртуальных хостов, разместив другие директивы внутри контейнеров <VirtualHost> . Большинство директив могут быть помещены в эти контейнеры, и тогда они изменят конфигурацию только для соответствующего виртуального хоста. Чтобы узнать, разрешена ли определённая директива, проверьте контекст директивы. Директивы конфигурации, установленные в главном контексте сервера (вне контейнеров <VirtualHost> ), будут использоваться только в том случае, если они не переопределены настройками виртуального хоста.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/vhosts/name-based.html