разница между _default_:* и *:* в контексте VirtualHost

разница между _default_:* и *:* в контексте VirtualHost

Я хочу знать разницу между"по умолчанию:*" и "*:*"в контексте VirtualHost.

<VirtualHost _default_:*>
  #...
  ServerName host.example.com
  #...
</VirtualHost>

<VirtualHost *:*>
  #...
  ServerName host.example.com
  #...
</VirtualHost>

Я не знаю разницы и смысла использования.

Спасибо

решение1

Решение есть в документации Apache 2.2в директиве Virtualhost:

Синтаксис: ... (...) Адрес может быть:

  • IP-адрес виртуального хоста;
  • Полное доменное имя для IP-адреса виртуального хоста (не рекомендуется);
  • Персонаж *, который используется только в сочетании сИмяVirtualHost* для сопоставления всех IP-адресов; или
  • Строка _default_, который используется только сВиртуальный хостинг IPдля перехвата несовпадающих IP-адресов.

Существует два способа работы с виртуальными хостами: виртуальный хостинг на основе имени и виртуальный хостинг на основе IP.

С помощью именованных виртуальных хостов у вас есть список виртуальных хостов, каждый из которых управляет одним или несколькими доменными именами, и каждый из них связан с парой listening IP:port. *— это специальное значение, которое означаетвсе IP на этом хосте. Виртуальный хост по умолчанию — это первый объявленный хост в этом списке для каждого указанного адреса прослушивания.

При использовании 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_:*>означает «Я буду использовать этот виртуальный хост для всех других сетевых интерфейсов на моем хосте, если он не соответствует предыдущему правилу и если заголовок хоста запроса не соответствует именованному виртуальному хосту»

Итак, все дело в определении универсального виртуального хоста. Документация добавляет:

_default_При использовании виртуального хостинга на основе IP можно указать специальное имя, в этом случае этот виртуальный хост будет соответствовать любому IP-адресу, который явно не указан в другом виртуальном хосте. При отсутствии любого _default_виртуального хоста используется «главная» конфигурация сервера, состоящая из всех этих определений вне раздела VirtualHost, когда не происходит сопоставления IP. (Но обратите внимание, что любой IP-адрес, который соответствует директиве NameVirtualHost, не будет использовать ни «главную» конфигурацию сервера, ни _default_виртуальный хост. Дополнительные сведения см. в документации по виртуальному хостингу на основе имени.)

Итак, после всего этого становится совершенно «ясно», что смешивание виртуального хостинга на основе IP и имени может стать беспорядком. С Apache 2.2 виртуальный хостинг на основе имени использовался только если NameVirtualhost <something>использовался.

Нос новымАпач 2.4версияэти вещи действительно легче понять, без NameVirtualhostдеклараций.Директива NameVirtualHost больше не имеет никакого эффекта, кроме как выдает предупреждение. Любая комбинация адрес/порт, появляющаяся в нескольких виртуальных хостах, неявно рассматривается как виртуальный хост на основе имени. Больше никаких сложных мыслей, даже документация теперь проще:

  • Символ *, который действует как подстановочный знак и соответствует любому IP-адресу.
  • Строка _default_, которая является псевдонимом для *

Итак, с Apache 2.4 ответ таков:это то же самое.

решение2

_default_vhosts для всех портов

Перехват каждого запроса на любой неуказанный IP-адрес и порт, т. е. комбинацию адреса/порта, которая не используется ни для одного другого виртуального хоста.

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

Связанный контент