Примеры виртуальных хостов
Этот документ пытается ответить на часто задаваемые вопросы о настройке виртуальных хостов. Эти сценарии относятся к случаям, когда на одном сервере работают несколько веб-сайтов, с помощью виртуальных хостов на основе имени или виртуальных хостов на основе IP.
Запуск нескольких веб-сайтов на основе имени на одном IP-адресе.
Ваш сервер имеет несколько имен хостов, которые разрешаются на один адрес, и вы хотите по-разному реагировать на www.example.com и www.example.org.
Примечание
Создание конфигураций виртуальных хостов на вашем сервере Apache не магически создает записи DNS для этих имен хостов. Вам необходимо иметь имена в DNS, разрешенные на ваш IP-адрес, иначе никто не сможет увидеть ваш веб-сайт. Вы можете поместить записи в свой файл hosts для локального тестирования, но это будет работать только с машины, с теми записями hosts.
# Ensure that Apache listens on port 80
Listen 80
<VirtualHost *:80>
DocumentRoot "/www/example1"
ServerName www.example.com
# Other directives here
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/www/example2"
ServerName www.example.org
# Other directives here
</VirtualHost> Звездочки соответствуют всем адресам, поэтому основной сервер не обрабатывает запросы. Поскольку виртуальный хост с ServerName www.example.com стоит первым в файле конфигурации, он имеет наивысший приоритет и может рассматриваться как по умолчанию или первичный сервер. Это означает, что если получен запрос, который не соответствует одному из указанных ServerName директив, он будет обработаться этим первым <VirtualHost>.
Вышеприведенная конфигурация — то, что вам нужно использовать практически во всех ситуациях с виртуальными хостами на основе имени. Фактически, эта конфигурация не будет работать только тогда, когда вы предоставляете различное содержимое на основе различных IP-адресов или портов.
Примечание
Можно заменить * на конкретный IP-адрес в системе. Такие виртуальные хосты будут использоваться только для HTTP-запросов, полученных при подключении к указанному IP-адресу.
Однако полезно использовать * на системах, где IP-адрес непредсказуем — например, если у вас динамический IP-адрес от вашего интернет-провайдера, и вы используете какой-либо вид решения динамического DNS. Поскольку * соответствует любому IP-адресу, эта конфигурация будет работать без изменений при изменении вашего IP-адреса.
Виртуальные хосты на основе имени на нескольких IP-адресах.
Примечание
Любой из описанных здесь методов может быть расширен на любое количество IP-адресов.
Сервер имеет два IP-адреса. На одном (172.20.30.40), мы будем обслуживать "главный" сервер, server.example.com, а на другом (172.20.30.50), мы будем обслуживать два или более виртуальных хостов.
Listen 80
# This is the "main" server running on 172.20.30.40
ServerName server.example.com
DocumentRoot "/www/mainserver"
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example1"
ServerName www.example.com
# Other directives here ...
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example2"
ServerName www.example.org
# Other directives here ...
</VirtualHost> Любой запрос на адрес, отличный от 172.20.30.50, будет обрабатываться с главного сервера. Запрос на 172.20.30.50 с неизвестным именем хоста или без заголовка Host: будет обрабатываться с www.example.com.
Предоставление одинакового содержимого на разных IP-адресах (например, внутреннего и внешнего адреса).
Серверная машина имеет два IP-адреса (192.168.1.1 и 172.20.30.40). Машина находится между внутренней (интранет) сетью и внешней (интернет) сетью. Внешняя сеть имя server.example.com разрешается на внешний адрес (172.20.30.40), а внутри сети это же имя разрешается на внутренний адрес (192.168.1.1).
Сервер может отвечать на внутренние и внешние запросы с тем же содержимым, используя только один раздел <VirtualHost>.
<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot "/www/server1"
ServerName server.example.com
ServerAlias server
</VirtualHost> Теперь запросы из обеих сетей будут обрабатываться с того же <VirtualHost>.
Примечание:
Внутри сети можно просто использовать имя server вместо полное имени хоста server.example.com.
Обратите также внимание, что в приведенном примере можно заменить список IP-адресов на *, что заставит сервер отвечать одинаково на всех адресах.
Запуск разных сайтов на разных портах.
У вас есть несколько доменов, подключенных к одному IP-адресу, а также вы хотите обслуживать несколько портов. Пример ниже иллюстрирует, что сопоставление имен происходит после определения лучшей комбинации IP-адреса и порта.
Listen 80
Listen 8080
<VirtualHost 172.20.30.40:80>
ServerName www.example.com
DocumentRoot "/www/domain-80"
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example.com
DocumentRoot "/www/domain-8080"
</VirtualHost>
<VirtualHost 172.20.30.40:80>
ServerName www.example.org
DocumentRoot "/www/otherdomain-80"
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example.org
DocumentRoot "/www/otherdomain-8080"
</VirtualHost> Виртуальный хостинг на основе IP
Сервер имеет два IP-адреса (172.20.30.40 и 172.20.30.50) которые разрешаются на имена www.example.com и www.example.org соответственно.
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example1"
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example2"
ServerName www.example.org
</VirtualHost> Запросы на любой адрес, не указанный в одной из <VirtualHost> директив (например, localhost), попадут на главный сервер, если он есть.
Смешанные виртуальные хосты на основе порта и IP
Серверная машина имеет два IP-адреса (172.20.30.40 и 172.20.30.50) которые разрешаются на имена www.example.com и www.example.org соответственно. В каждом случае мы хотим запустить хосты на портах 80 и 8080.
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080
<VirtualHost 172.20.30.40:80>
DocumentRoot "/www/example1-80"
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot "/www/example1-8080"
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot "/www/example2-80"
ServerName www.example.org
</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot "/www/example2-8080"
ServerName www.example.org
</VirtualHost> Смешанные виртуальные хосты на основе имени и IP
Любой адрес, упомянутый в аргументе virtualhost, который никогда не появляется в другом виртуальном хосте, является строго виртуальным хостом на основе IP.
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example1"
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example2"
ServerName www.example.org
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example3"
ServerName www.example.net
</VirtualHost>
# IP-based
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example4"
ServerName www.example.edu
</VirtualHost>
<VirtualHost 172.20.30.60>
DocumentRoot "/www/example5"
ServerName www.example.gov
</VirtualHost> Использование Virtual_host и mod_proxy вместе
Следующий пример позволяет переднему узлу проксировать виртуальный хост на сервер, работающий на другой машине. В примере виртуальный хост с таким же именем настроен на машине по адресу 192.168.111.2. Директива ProxyPreserveHost On используется для того, чтобы желаемое имя хоста передавалось, в случае, если мы проксируем несколько имен хостов на одну машину.
<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass "/" "http://192.168.111.2/"
ProxyPassReverse "/" "http://192.168.111.2/"
ServerName hostname.example.com
</VirtualHost> Использование виртуальных хостов по умолчанию
_default_ виртуальные хосты для всех портов
Перехват всех запросов на любой не указанный IP-адрес и порт, т. е., комбинации адреса/порта, не используемые для других виртуальных хостов.
<VirtualHost _default_:*>
DocumentRoot "/www/default"
</VirtualHost> Использование такого виртуального хоста по умолчанию с подстановочным знаком порта фактически предотвращает любые запросы к главному серверу.
Виртуальный хост по умолчанию никогда не обрабатывает запрос, отправленный на адрес/порт, используемый для виртуальных хостов на основе имени. Если запрос содержал неизвестный или отсутствующий заголовок Host:, он всегда обрабатывается с первичного виртуального хоста на основе имени (виртуального хоста для этого адреса/порта, появляющегося первым в файле конфигурации).
Можно использовать AliasMatch или RewriteRule для перенаправления любого запроса на отдельную информационную страницу (или скрипт).
_default_ виртуальные хосты для разных портов
То же, что и в настройке 1, но сервер прослушивает на нескольких портах, и мы хотим использовать второй виртуальный хост по умолчанию для порта 80.
<VirtualHost _default_:80>
DocumentRoot "/www/default80"
# ...
</VirtualHost>
<VirtualHost _default_:*>
DocumentRoot "/www/default"
# ...
</VirtualHost> Виртуальный хост по умолчанию для порта 80 (который должен предшествовать любому виртуальному хосту по умолчанию с подстановочным знаком порта) перехватывает все запросы, отправленные на не указанный IP-адрес. Главный сервер никогда не используется для обработки запроса.
_default_ виртуальные хосты для одного порта
Мы хотим иметь виртуальный хост по умолчанию для порта 80, но не других виртуальных хостов по умолчанию.
<VirtualHost _default_:80>
DocumentRoot "/www/default"
...
</VirtualHost> Запрос на неопределенный адрес на порту 80 обрабатывается с виртуального хоста по умолчанию. Любой другой запрос на неопределенный адрес и порт обрабатывается с главного сервера.
Любое использование * в объявлении виртуального хоста будет иметь более высокий приоритет, чем _default_.
Перенос виртуального хоста на основе имени на виртуальный хост на основе IP
Виртуальный хост на основе имени с именем хоста www.example.org (из нашего примера на основе имени, настройка 2) должен получить собственный IP-адрес. Чтобы избежать проблем с серверами имен или прокси, которые кэшировали старый IP-адрес для виртуального хоста на основе имени, мы хотим предоставить оба варианта во время фазы миграции.
Решение простое, так как мы можем просто добавить новый IP-адрес (172.20.30.50) к директиве VirtualHost.
Listen 80
ServerName www.example.com
DocumentRoot "/www/example1"
<VirtualHost 172.20.30.40 172.20.30.50>
DocumentRoot "/www/example2"
ServerName www.example.org
# ...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example3"
ServerName www.example.net
ServerAlias *.example.net
# ...
</VirtualHost> Теперь к виртуальному хосту можно получить доступ по новому адресу (как виртуальному хосту на основе IP) и по старому адресу (как виртуальному хосту на основе имени).
Использование директивы ServerPath
У нас есть сервер с двумя виртуальными хостами на основе имени. Для соответствия правильному виртуальному хосту клиент должен отправить правильный заголовок Host:. Старые клиенты HTTP/1.0 не отправляют такого заголовка, и Apache не знает, к какому виртуальному хосту клиент пытался подключиться (и обрабатывает запрос с первичного виртуального хоста). Чтобы обеспечить максимальную обратную совместимость, мы создаем первичный виртуальный хост, который возвращает одну страницу с ссылками с префиксом URL к виртуальным хостам на основе имени.
<VirtualHost 172.20.30.40>
# primary vhost
DocumentRoot "/www/subdomain"
RewriteEngine On
RewriteRule "." "/www/subdomain/index.html"
# ...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/subdomain/sub1"
ServerName www.sub1.domain.tld
ServerPath "/sub1/"
RewriteEngine On
RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
# ...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/subdomain/sub2"
ServerName www.sub2.domain.tld
ServerPath "/sub2/"
RewriteEngine On
RewriteRule "^(/sub2/.*)" "/www/subdomain$1"
# ...
</VirtualHost> Благодаря директиве ServerPath запрос к URL http://www.sub1.domain.tld/sub1/ всегда обрабатывается с подхоста sub1.
Запрос к URL http://www.sub1.domain.tld/ обрабатывается с подхоста sub1 только если клиент отправил правильный заголовок Host:. Если заголовок Host: не отправлен, клиент получает страницу информации с первичного хоста.
Обратите внимание на одну особенность: запрос к http://www.sub2.domain.tld/sub1/ также обрабатывается с подхоста sub1, если клиент не отправил заголовок Host:.
Директивы RewriteRule используются для того, чтобы клиент, который отправил правильный заголовок Host: мог использовать оба варианта URL, т. е., с префиксом URL или без него.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/vhosts/examples.html