Разница между _default_:* и *:* в контексте VirtualHost
Я хочу знать разницу между "поумолчанию:*" и "*:*" в контексте VirtualHost.
<VirtualHost _default_:*>
#...
ServerName host.example.com
#...
</VirtualHost>
<VirtualHost *:*>
#...
ServerName host.example.com
#...
</VirtualHost>
Я не знаю разницы и типа использования.
Thk
2 ответа
Решение по документации Apache 2.2 по директиве Virtualhost:
Синтаксис: ... (...) Addr может быть:
- IP-адрес виртуального хоста;
- Полное доменное имя для IP-адреса виртуального хоста (не рекомендуется);
- Символ *, который используется только в сочетании с NameVirtualHost * для сопоставления всех IP-адресов; или же
- Строка _default_, которая используется только с виртуальным IP-хостингом для перехвата несоответствующих IP-адресов.
Существует два способа обработки виртуальных хостов: виртуальный хостинг на основе имени и виртуальный хостинг на основе IP.
С именованными виртуальными хостами у вас есть список виртуальных хостов, каждый из которых управляет одним или несколькими доменными именами, и каждый связан с парой listening IP:port
, *
это специальное значение, которое означает все IP-адреса на этом хосте. VirtualHost по умолчанию является первым объявленным в этом списке для каждого заданного адреса прослушивания.
С виртуальными хостами на базе 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 ответ один и тот же.
_default_
Vhosts для всех портов
Перехват каждого запроса на любой неуказанный IP-адрес и порт, т. Е. Комбинацию адрес / порт, которая не используется ни для какого другого виртуального хоста.