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 ServerName
dyrektywa 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 NameVirtualhost
deklaracji. 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 .