Рішення знаходиться в документації Apache 2.2 щодо директиви Virtualhost :
Синтаксис: ... (...) Addr може бути:
- IP-адреса віртуального хоста;
- Повноцінне доменне ім’я для IP-адреси віртуального хоста (не рекомендується);
- Символ * , який використовується лише в поєднанні з NameVirtualHost *, щоб відповідати всім IP-адресам; або
- Рядок _default_ , який використовується лише з віртуальним хостингом IP для лову незрівнянних IP-адрес.
Існує два способи поводження з Virtualhosts, Virtualhosting на основі імені та Virtualhosting на основі IP.
З іменованими віртуальними хостами у вас є список віртуальних хостів, кожен з яких керує одним або декількома доменними іменами, а кожен пов'язаний з парою listening IP:port
. *
це особливе значення, яке означає всі IP-адреси цього хоста . За замовчуванням virtualHost є першим оголошеним у цьому списку для кожної заданої адреси прослуховування.
З використанням IP-VirtualHosts ServerName
директива VirtualHost не використовується, важливою інформацією є прослуховуючий IP (і порт), а VirtualHost за замовчуванням є першим, що відповідає IP-адресою, що обробляє вхідний запит ..
Отже, з іменованою конфігурацією віртуального хостингу:
<Virtualhost *:80> with ServerName foo.com
означає "на всіх IP-адресах, якими керує цей хост", "на порту 80", "якщо заголовок хоста запиту foo.com" я буду використовувати цей virtualhost
<Virtualhost *:*> with Servername foo.com
означає "на всіх IP-адресах, якими керує цей хост", "на всіх портах", "якщо заголовок хоста запиту foo.com" я буду використовувати цей virtualhost
<Virtualhost 10.0.0.2:*> with Servername foo.com
означає "для запиту, що надходить з мого мережевого інтерфейсу 10.0.0.2", "на всі порти", "якщо заголовок хоста запиту foo.com" я буду використовувати цей virtualhost
<Virtualhost _default_:*> with Servername foo.com
: не слід використовувати з віртуальним хостингом на основі імен
А на Virtualhosting на основі IP:
<Virtualhost 10.0.0.2:*>
означає "Я буду використовувати цей virtualhost для запиту, що надходить на мій інтерфейс 10.0.0.2"
<Virtualhost _default_:443>
означає "Я буду використовувати цей virtualhost для всіх інших мережевих інтерфейсів мого хоста для запиту, що надходить на порт 443"
<Virtualhost _default_:*>
означає "Я буду використовувати цей virtualhost для всіх інших мережевих інтерфейсів мого хоста, якщо він не збігається з попереднім правилом, і якщо заголовок хоста запиту не відповідає іменованому virtualhost"
Тож справа в тому, щоб визначити виртуальний хост Virtualhost. Документація додає:
Під час використання віртуального хостингу на основі 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 відповідь - це те саме .