Rozwiązanie dotyczy dokumentacji Apache 2.2 dotyczącej dyrektywy Virtualhost :
Składnia: ... (...) Addr może być:
- Adres IP wirtualnego hosta;
- W pełni kwalifikowana nazwa domeny dla adresu IP hosta wirtualnego (niezalecane);
- Znak * , który jest używany tylko w połączeniu z NameVirtualHost *, aby dopasować wszystkie adresy IP; lub
- Ciąg _default_ , który jest używany tylko z wirtualnym hostingiem IP w celu przechwytywania niedopasowanych adresów IP.
Istnieją dwa sposoby obsługi Virtualhostów: Virtualhosting oparty na nazwie i Virtualhosting oparty na IP.
W przypadku wirtualnych hostów opartych na nazwach masz listę wirtualnych hostów, z których każda zarządza jedną lub kilkoma nazwami domen i każda jest powiązana z kilkoma listening IP:port. *jest specjalną wartością, która oznacza wszystkie adresy IP na tym hoście . Domyślny virtualHost jest pierwszym zadeklarowanym na tej liście dla każdego podanego adresu nasłuchiwania.
W przypadku VirtualHost opartych na IP ServerNamedyrektywa VirtualHost nie jest używana, ważną informacją jest nasłuchujący adres IP (i port), a domyślny VirtualHost jest pierwszym pasującym do adresu IP obsługującego przychodzące żądanie.
Tak więc w przypadku wirtualnego hostingu opartego na nazwie:
<Virtualhost *:80> with ServerName foo.com oznacza „na wszystkich adresach IP zarządzanych na tym hoście”, „na porcie 80”, „jeśli nagłówek hosta żądania to foo.com” Użyję tego wirtualnego hosta
<Virtualhost *:*> with Servername foo.com oznacza „na wszystkich adresach IP zarządzanych na tym hoście”, „na wszystkich portach”, „jeśli nagłówek hosta żądania to foo.com” Użyję tego wirtualnego hosta
<Virtualhost 10.0.0.2:*> with Servername foo.com oznacza „dla żądania przychodzącego z mojego interfejsu sieciowego 10.0.0.2”, „na wszystkich portach”, „jeśli nagłówek hosta żądania to foo.com” Użyję tego wirtualnego hosta
<Virtualhost _default_:*> with Servername foo.com : nie należy używać z wirtualnym hostingiem opartym na nazwie
I na Virtualhosting oparty na IP:
<Virtualhost 10.0.0.2:*> oznacza „Użyję tego wirtualnego hosta do żądania przychodzącego na moim interfejsie 10.0.0.2”
<Virtualhost _default_:443> oznacza „Będę używać tego wirtualnego hosta dla wszystkich innych interfejsów sieciowych na moim hoście dla żądania przychodzącego na porcie 443”
<Virtualhost _default_:*> oznacza „Użyję tego wirtualnego hosta dla wszystkich innych interfejsów sieciowych na moim hoście, jeśli nie jest zgodny z poprzednią regułą i jeśli nagłówek hosta żądania nie jest zgodny z nazwanym wirtualnym hostem”
Chodzi więc o zdefiniowanie wirtualnego hosta typu catch-all. Dokumentacja dodaje:
Podczas korzystania z hostingu wirtualnego opartego na protokole IP _default_można określić specjalną nazwę, w którym to przypadku ten wirtualny host będzie pasował do dowolnego adresu IP, który nie jest wyraźnie wymieniony na innym hoście wirtualnym. W przypadku braku _default_wirtualnego hosta konfiguracja serwera „głównego”, obejmująca wszystkie te definicje poza sekcją VirtualHost, jest używana, gdy nie występuje dopasowanie IP. (Należy jednak pamiętać, że każdy adres IP zgodny z dyrektywą NameVirtualHost nie będzie korzystał ani z konfiguracji serwera „głównego”, ani z _default_hosta wirtualnego. Więcej szczegółowych informacji można znaleźć w dokumentacji hostingu wirtualnego opartej na nazwie).
Po tych wszystkich rzeczach staje się zupełnie „jasne”, że mieszanie wirtualnego hostingu opartego na IP i nazwach może stać się bałaganem. W Apache 2.2 wirtualny hosting oparty na nazwie był używany tylko wtedy, gdy NameVirtualhost <something>był używany.
Ale dzięki nowej wersji Apache 2.4 te rzeczy są naprawdę łatwiejsze do zrozumienia, bez NameVirtualhostdeklaracji. Dyrektywa NameVirtualHost nie ma już żadnego wpływu poza emisją ostrzeżenia. Każda kombinacja adresu / portu pojawiająca się na wielu hostach wirtualnych jest domyślnie traktowana jako host wirtualny oparty na nazwie . Nigdy więcej skomplikowanych spraw, nawet dokumentacja jest teraz prostsza:
- Znak *, który działa jak symbol wieloznaczny i pasuje do dowolnego adresu IP.
- Ciąg
_default_, który jest aliasem dla *
W przypadku Apache 2.4 odpowiedź brzmi: to samo .