Разница между _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-адрес и порт, т. Е. Комбинацию адрес / порт, которая не используется ни для какого другого виртуального хоста.

http://httpd.apache.org/docs/2.2/vhosts/examples.html

Другие вопросы по тегам