Решение по документации Apache 2.2 по директиве Virtualhost :
Синтаксис: ... (...) Addr может быть:
- IP-адрес виртуального хоста;
- Полное доменное имя для IP-адреса виртуального хоста (не рекомендуется);
- Символ * , который используется только в сочетании с NameVirtualHost * для сопоставления всех IP-адресов; или
- Строка _default_ , которая используется только с виртуальным IP-хостингом для перехвата несоответствующих IP-адресов.
Существует два способа обработки виртуальных хостов: виртуальный хостинг на основе имени и виртуальный хостинг на основе IP.
С именованными виртуальными хостами у вас есть список виртуальных хостов, каждый из которых управляет одним или несколькими доменными именами, и каждый связан с парой listening IP:port
. *
это специальное значение, которое означает все IP-адреса на этом хосте . VirtualHost по умолчанию является первым объявленным в этом списке для каждого заданного адреса прослушивания.
При использовании VirtualHosts на основе IP-адреса ServerName
директива VirtualHost не используется, важной информацией является прослушивающий IP-адрес (и порт), а VirtualHost по умолчанию является первым, совпадающим с IP-адресом, обрабатывающим входящий запрос.
Итак, с именованной конфигурацией виртуального хостинга:
<Virtualhost *:80> with ServerName foo.com
означает «на всех IP-адресах, управляемых на этом хосте», «на порту 80», «если заголовок хоста запроса - foo.com», я буду использовать этот виртуальный хост
<Virtualhost *:*> with Servername foo.com
означает «на всех IP-адресах, управляемых на этом хосте», «на всех портах», «если заголовок хоста запроса - foo.com», я буду использовать этот виртуальный хост
<Virtualhost 10.0.0.2:*> with Servername foo.com
означает «для запроса, поступающего из моего сетевого интерфейса 10.0.0.2», «на все порты», «если заголовок узла запроса - foo.com», я буду использовать этот виртуальный хост
<Virtualhost _default_:*> with Servername foo.com
: не должен использоваться с виртуальным хостингом на основе имени
И на виртуальном хостинге на основе IP:
<Virtualhost 10.0.0.2:*>
означает «я буду использовать этот виртуальный хост для запроса, поступающего на мой интерфейс 10.0.0.2»
<Virtualhost _default_:443>
означает «Я буду использовать этот виртуальный хост для всех других сетевых интерфейсов на моем хосте для запроса, поступающего на порт 443»
<Virtualhost _default_:*>
означает «Я буду использовать этот виртуальный хост для всех других сетевых интерфейсов на моем хосте, если он не соответствует предыдущему правилу и если заголовок хоста запроса не совпадает с именованным виртуальным хостом»
Так что все дело в определении универсального виртуального хоста. Документация добавляет:
При использовании виртуального хостинга на основе IP _default_
можно указать специальное имя, и в этом случае этот виртуальный хост будет соответствовать любому IP-адресу, который явно не указан в другом виртуальном хосте. При отсутствии какого-либо _default_
виртуального хоста конфигурация «основного» сервера, состоящая из всех этих определений вне любого раздела VirtualHost, используется, когда не происходит сопоставление IP. (Но обратите внимание, что любой IP-адрес, который соответствует директиве NameVirtualHost, не будет использовать ни конфигурацию «основного» сервера, ни _default_
виртуальный хост. Дополнительные сведения см. В документации по виртуальному хостингу на основе имен.)
Таким образом, после всех этих вещей становится довольно «ясно», что смешивание виртуального хостинга на основе IP и имен может стать беспорядком. В Apache 2.2 виртуальный хостинг на основе имен использовался только в том случае, если NameVirtualhost <something>
он использовался.
Но с новой версией Apache 2.4 эти вещи действительно легче понять, без NameVirtualhost
декларации. Директива NameVirtualHost больше не имеет никакого эффекта, кроме как выдавать предупреждение. Любая комбинация адрес / порт, появляющаяся на нескольких виртуальных хостах, неявно рассматривается как виртуальный хост на основе имени . Нет более сложных идей, даже документация теперь стала проще:
- Символ *, который действует как подстановочный знак и соответствует любому IP-адресу.
- Строка
_default_
, которая является псевдонимом для *
Так что с Apache 2.4 ответ один и тот же .