Apache/HTTP/Virtuelle Server/Beispiele: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
(16 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Namensbasierter Websites == | |||
; Betrieb mehrerer namensbasierter Websites unter einer einzigen IP-Adresse | |||
Ihr Server hat mehrere Hostnamen, die zu einer einzigen Adresse aufgelöst werden, und Sie möchten für www.example.comund www.example.org unterschiedlich reagieren | |||
; Hinweis | |||
:Das Erstellen von virtuellen Hostkonfigurationen auf Ihrem Apache-Server bewirkt nicht auf magische Weise, dass DNS-Einträge für diese Hostnamen erstellt werden. | |||
* Sie müssen die Namen im DNS haben, die zu Ihrer IP-Adresse aufgelöst werden, oder niemand wird Ihre Website sehen können. | |||
* Sie können Einträge in Ihrer hosts-Datei für lokale Tests vornehmen, aber das funktioniert nur von dem Rechner aus, der diese hosts-Einträge hat. | |||
# Sicherstellen, dass Apache auf Port 80 lauscht | |||
<syntaxhighlight lang="apache" line> | |||
<syntaxhighlight lang=apache> | |||
Listen 80 | Listen 80 | ||
<VirtualHost *:80> | <VirtualHost *:80> | ||
DocumentRoot "/www/example1" | |||
ServerName www.example.com | |||
# Andere Direktiven hier | |||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | |||
<syntaxhighlight lang="apache" line> | |||
<VirtualHost *:80> | <VirtualHost *:80> | ||
DocumentRoot "/www/example2" | |||
ServerNamewww.example.org | |||
# Andere Direktiven hier | |||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Die Sternchen passen zu allen Adressen, so dass der Hauptserver keine Anfragen bedient. | |||
* Da der virtuelle Host mit ServerName www.example.com in der Konfigurationsdatei an erster Stelle steht, hat er die höchste Priorität und kann als Standard- oder Primärserver angesehen werden. | |||
* Das heißt, wenn eine Anfrage eingeht, die nicht mit einer der angegebenen ServerName-Direktiven übereinstimmt, wird sie von diesem ersten <VirtualHost> bedient. | |||
Die obige Konfiguration sollten Sie in fast allen Fällen verwenden, in denen ein virtuelles Hosting auf Namen basiert. | |||
* Die einzige Sache, für die diese Konfiguration nicht funktioniert, ist, wenn Sie unterschiedliche Inhalte auf der Grundlage unterschiedlicher IP-Adressen oder Ports bereitstellen. | |||
; Hinweis | |||
Sie können * durch eine bestimmte IP-Adresse auf dem System ersetzen. | |||
* Solche virtuellen Hosts werden nur für HTTP-Anfragen verwendet, die bei einer Verbindung mit der angegebenen IP-Adresse eingehen. | |||
Es ist jedoch auch nützlich, * auf Systemen zu verwenden, bei denen die IP-Adresse nicht vorhersehbar ist - zum Beispiel, wenn Sie eine dynamische IP-Adresse bei Ihrem ISP haben und eine Art dynamische DNS-Lösung verwenden. | |||
* Da * mit jeder IP-Adresse übereinstimmt, würde diese Konfiguration ohne Änderungen funktionieren, wenn sich Ihre IP-Adresse ändert. | |||
=== Namensbasierte Hosts auf mehr als einer IP-Adresse === | |||
;Hinweis | |||
: Jede der hier beschriebenen Techniken kann auf eine beliebige Anzahl von IP-Adressen ausgedehnt werden. | |||
Der Server hat zwei IP-Adressen | |||
* Auf der einen(172.20.30.40) wird der "Hauptserver" server.example.com betrieben und auf der anderen(172.20.30.50) werden zwei oder mehr virtuelle Hosts betrieben. | |||
<syntaxhighlight lang="apache" line> | |||
Listen 80 | Listen 80 | ||
# | # Dies ist der "Haupt"-Server, der auf 172.20.30.40 läuft | ||
ServerName server.example. | ServerName server.example.comDocumentRoot "/www/mainserver" | ||
<VirtualHost 172.20.30.50> | <VirtualHost 172.20.30.50> | ||
DocumentRoot "/www/example1" | |||
ServerName www.example.com # Andere Direktiven hier ... | |||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 172.20.30.50> | <VirtualHost 172.20.30.50> | ||
DocumentRoot "/www/example2" | |||
ServerNamewww.example.org # Andere Direktiven hier ... | |||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | |||
Jede Anfrage an eine andere Adresse als 172.20.30.50 wird vom Hauptserver zugestellt. | |||
* Eine Anfrage an 172.20.30.50 mit einem unbekannten Hostnamen oder ohne Host: Header wird von www.example.com zugestellt. | |||
* Bereitstellung desselben Inhalts auf verschiedenen IP-Adressen (z. .B. einer internen und einer externen Adresse). | |||
; Der Server-Rechner hat zwei IP-Adressen(192.168.1.1und 172.20.30.40) | |||
* Der Rechner befindet sich zwischen einem internen (Intranet) und einem externen (Internet) Netz. | |||
* Außerhalb des Netzes wird der Name server.example.com zur externen Adresse(172.20.30.40) aufgelöst, aber innerhalb des Netzes wird derselbe Name zur internen Adresse (192.168.1.1) aufgelöst. | |||
Mit nur einem <VirtualHost>-Abschnitt kann der Server dazu gebracht werden, auf interne und externe Anfragen mit demselben Inhalt zu antworten. | |||
<syntaxhighlight lang="apache" line> | |||
<VirtualHost 192.168.1.1 172.20.30.40> | <VirtualHost 192.168.1.1 172.20.30.40> | ||
DocumentRoot "/www/server1" | |||
ServerName server.example.com ServerAlias server</VirtualHost> | |||
</syntaxhighlight> | |||
</ | |||
Jetzt werden Anfragen aus beiden Netzen von demselben <VirtualHost> bedient. | |||
; Anmerkung | |||
Im internen Netzwerk kann man statt des voll qualifizierten Hostnamens server.example.com einfach den Nameserver verwenden. | |||
Beachten Sie auch, dass Sie im obigen Beispiel die Liste der IP-Adressen durch * ersetzen können, was dazu führt, dass der Server auf alle Adressen gleich antwortet. | |||
=== Verschiedene Websites auf verschiedenen Ports === | |||
Sie haben mehrere Domänen, die auf dieselbe IP-Adresse verweisen, und möchten auch mehrere Ports bedienen. | |||
* Das nachstehende Beispiel zeigt, dass die Namenszuordnung erfolgt, nachdem die am besten passende Kombination aus IP-Adresse und Port ermittelt wurde. | |||
<syntaxhighlight lang="apache" line> | |||
Listen 80 | Listen 80 | ||
Listen 8080 | Listen 8080 | ||
<VirtualHost 172.20.30.40:80> | <VirtualHost 172.20.30.40:80> | ||
ServerNamewww.example.com DocumentRoot "/www/domain-80" | |||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 172.20.30.40:8080> | <VirtualHost 172.20.30.40:8080> | ||
ServerNamewww.example.com DocumentRoot "/www/domain-8080" | |||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 172.20.30.40:80> | <VirtualHost 172.20.30.40:80> | ||
ServerNamewww.example.org DocumentRoot "/www/otherdomain-80" | |||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 172.20.30.40:8080> | <VirtualHost 172.20.30.40:8080> | ||
ServerNamewww.example.org DocumentRoot "/www/otherdomain-8080" | |||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | |||
== IP-basiertes virtuelles Hosting == | |||
IP- | |||
Der Server hat zwei IP-Adressen(172.20.30.40 und 172.20.30.50), die zu den Namen www.example.com bzw. | |||
* www. | |||
* example.orgaufgelöst werden. | |||
<syntaxhighlight lang="apache" line> | |||
Listen 80 | Listen 80 | ||
<VirtualHost 172.20.30.40> | <VirtualHost 172.20.30.40> | ||
DocumentRoot "/www/example1" | |||
ServerName www.example.com</VirtualHost> | |||
</VirtualHost> | |||
<VirtualHost 172.20.30.50> | <VirtualHost 172.20.30.50> | ||
DocumentRoot "/www/example2" | |||
ServerName www.example.org</VirtualHost> | |||
</ | </syntaxhighlight> | ||
Anfragen an eine Adresse, die nicht in einer der <VirtualHost>-Direktiven angegeben ist (z. B. localhost), werden an den Hauptserver weitergeleitet, sofern ein solcher vorhanden ist. | |||
=== Gemischte port- und ip-basierte virtuelle Hosts === | |||
Der Server-Rechner hat zwei IP-Adressen(172.20.30.40 und 172.20.30.50), die zu den Namen www.example.com bzw. www.example.org aufgelöst werden. | |||
* In beiden Fällen wollen wir Hosts auf den Ports 80 und 8080 ausführen. | |||
<syntaxhighlight lang="apache" line> | |||
Listen 172.20.30.40:80 | Listen 172.20.30.40:80 | ||
Listen 172.20.30.40:8080 | Listen 172.20.30.40:8080 | ||
Zeile 138: | Zeile 142: | ||
<VirtualHost 172.20.30.40:80> | <VirtualHost 172.20.30.40:80> | ||
DocumentRoot "/www/example1-80" | |||
ServerName www.example.com</VirtualHost> | |||
</VirtualHost> | |||
<VirtualHost 172.20.30.40:8080> | <VirtualHost 172.20.30.40:8080> | ||
DocumentRoot "/www/example1-8080" | |||
ServerName www.example.com</VirtualHost> | |||
</VirtualHost> | |||
<VirtualHost 172.20.30.50:80> | <VirtualHost 172.20.30.50:80> | ||
DocumentRoot "/www/example2-80" | |||
ServerName www.example.org</VirtualHost> | |||
</VirtualHost> | |||
<VirtualHost 172.20.30.50:8080> | <VirtualHost 172.20.30.50:8080> | ||
DocumentRoot "/www/example2-8080" | |||
ServerName www.example.org</VirtualHost> | |||
</VirtualHost> | </syntaxhighlight> | ||
== Gemischte namensbasierte und IP-basierte vhosts == | |||
Jede Adresse, die im Argument eines virtuellen Hosts genannt wird und nie in einem anderen virtuellen Host auftaucht, ist ein rein IP-basierter virtueller Host. | |||
<syntaxhighlight lang="apache" line> | |||
Listen 80 | Listen 80 | ||
<VirtualHost 172.20.30.40> | <VirtualHost 172.20.30.40> | ||
DocumentRoot "/www/example1" | |||
ServerName www.example.com</VirtualHost> | |||
</VirtualHost> | |||
<VirtualHost 172.20.30.40> | <VirtualHost 172.20.30.40> | ||
DocumentRoot "/www/example2" | |||
ServerName www.example.org</VirtualHost> | |||
</VirtualHost> | |||
<VirtualHost 172.20.30.40> | <VirtualHost 172.20.30.40> | ||
DocumentRoot "/www/example3" | |||
ServerName www.example.net</VirtualHost> | |||
</VirtualHost> | |||
# IP- | # IP-basiert | ||
<VirtualHost 172.20.30.50> | <VirtualHost 172.20.30.50> | ||
DocumentRoot "/www/example4" | |||
ServerName www.example.edu</VirtualHost> | |||
</VirtualHost> | |||
<VirtualHost 172.20.30.60> | <VirtualHost 172.20.30.60> | ||
DocumentRoot "/www/example5" | |||
Servername www.example.gov</VirtualHost> | |||
</VirtualHost> | </syntaxhighlight> | ||
== Gemeinsame Verwendung von Virtual_host und mod_proxy == | |||
Das folgende Beispiel ermöglicht es einem Front-End-Rechner, einen virtuellen Host an einen Server weiterzuleiten, der auf einem anderen Rechner läuft. | |||
* Im Beispiel wird ein virtueller Host mit demselben Namen auf einem Rechner unter 192.168.111.2 konfiguriert. | |||
* Die Anweisung ProxyPreserveHost On wird verwendet, damit der gewünschte Hostname durchgereicht wird, falls wir mehrere Hostnamen an einen einzelnen Rechner weiterleiten. | |||
<syntaxhighlight lang="apache" line> | |||
<VirtualHost *:*> | <VirtualHost *:*> | ||
ProxyPreserveHost On | |||
ProxyPass "/" "http://192.168.111.2/" | |||
ProxyPassReverse "/" "http://192.168.111.2/" | |||
ServerName hostname.example.com</VirtualHost> | |||
</ | </syntaxhighlight> | ||
== Verwendung von _Standard_vhosts == | |||
_Standard_ vhosts für alle Ports | |||
Abfangen jeder Anfrage an eine nicht spezifizierte IP-Adresse und einen nicht spezifizierten Port, d. h. eine Kombination aus Adresse und Port, die für keinen anderen virtuellen Host verwendet wird. | |||
<syntaxhighlight lang="apache" line> | |||
<VirtualHost _default_:*> | <VirtualHost _default_:*> | ||
DocumentRoot "/www/default" | |||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | |||
Die Verwendung eines solchen Standard-Vhosts mit einem Wildcard-Port verhindert effektiv, dass eine Anfrage an den Hauptserver geht. | |||
Ein Standard-Vhost bedient niemals eine Anfrage, die an eine Adresse/Port gesendet wurde, die für namensbasierte Vhosts verwendet wird. | |||
* Wenn die Anfrage einen unbekannten oder keinen Host:-Header enthielt, wird sie immer vom primären namensbasierten vhost bedient (der vhost für diese Adresse/Port, der in der Konfigurationsdatei an erster Stelle steht). | |||
Sie können AliasMatch oder RewriteRule verwenden, um jede Anfrage auf eine einzelne Informationsseite (oder ein Skript) umzuschreiben. | |||
=== _Standard_ vhosts für verschiedene Ports === | |||
Wie Setup 1, aber der Server lauscht auf mehreren Ports und wir wollen einen zweiten _Standard_ vhost für Port 80 verwenden. | |||
<syntaxhighlight lang="apache" line> | |||
<VirtualHost _default_:80> | <VirtualHost _default_:80> | ||
DocumentRoot "/www/default80" | |||
#... | |||
</VirtualHost> | </VirtualHost> | ||
<syntaxhighlight lang="apache" line> | |||
<VirtualHost _default_:*> | <VirtualHost _default_:*> | ||
DocumentRoot "/www/default" | |||
#... | |||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | |||
Der Standard-Vhost für Port 80 (der vor jedem Standard-Vhost mit einem Wildcard-Port stehen muss ) fängt alle Anfragen ab, die an eine nicht spezifizierte IP-Adresse gesendet wurden. | |||
* Der Hauptserver wird nie zur Bearbeitung einer Anfrage verwendet. | |||
=== _Standard_ vhosts für einen Port === | |||
Wir möchten einen Standard-Vhost für Port 80 haben, aber keine anderen Standard-Vhosts. | |||
<syntaxhighlight lang="apache" line> | |||
<VirtualHost _default_:80> | <VirtualHost _default_:80> | ||
DocumentRoot "/www/default" | |||
... | ... | ||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | |||
Eine Anfrage an eine nicht spezifizierte Adresse an Port 80 wird vom Standard-Vhost bedient. | |||
* Alle anderen Anfragen an eine nicht spezifizierte Adresse und einen nicht spezifizierten Port werden vom Hauptserver zugestellt. | |||
Jede Verwendung von * in einer Deklaration eines virtuellen Hosts hat einen höheren Vorrang als _default_. | |||
=== Migrieren eines namensbasierten vhosts zu einem IP-basierten vhost === | |||
Der namensbasierte vhost mit dem Hostnamen www.example.org (aus unserem namensbasierten Beispiel, Setup 2) sollte seine eigene IP-Adresse erhalten. | |||
* Um Probleme mit Nameservern oder Proxies zu vermeiden, die die alte IP-Adresse für den namensbasierten vhost zwischengespeichert haben, wollen wir während einer Migrationsphase beide Varianten anbieten. | |||
Die Lösung ist einfach, denn wir können die neue IP-Adresse (172.20.30.50) einfach in die VirtualHost-Richtlinieaufnehmen. | |||
<syntaxhighlight lang="apache" line> | |||
Listen 80 | Listen 80 | ||
ServerNamewww.example.comDocumentRoot "/www/example1" | |||
<VirtualHost 172.20.30.40 172.20.30.50> | <VirtualHost 172.20.30.40 172.20.30.50> | ||
DocumentRoot "/www/example2" | |||
ServerNamewww.example.org # ... | |||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 172.20.30.40> | <VirtualHost 172.20.30.40> | ||
DocumentRoot "/www/example3" | |||
ServerNamewww.example.net ServerAlias *.example.net # ... | |||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | |||
Der vhost kann nun über die neue Adresse (als IP-basierter vhost) und über die alte Adresse (als namensbasierter vhost) erreicht werden. | |||
=== Verwendung der ServerPath-Richtlinie === | |||
Wir haben einen Server mit zwei namensbasierten vhosts. | |||
* Um den richtigen virtuellen Host zu finden, muss ein Client den richtigen Host:Header senden. | |||
* Alte HTTP/1.0-Clients senden einen solchen Header nicht und der Apache hat keine Ahnung, welchen vhost der Client zu erreichen versucht hat (und bedient die Anfrage vom primären vhost). | |||
* Um so viel Abwärtskompatibilität wie möglich zu gewährleisten, erstellen wir einen primären vhost, der eine einzelne Seite mit Links mit einem URL-Präfix zu den namensbasierten virtuellen Hosts zurückgibt. | |||
<syntaxhighlight lang="apache" line> | |||
<VirtualHost 172.20.30.40> | <VirtualHost 172.20.30.40> | ||
# primary vhost | |||
DocumentRoot "/www/subdomain" | |||
RewriteEngine On | |||
RewriteRule "." "/www/subdomain/index.html" | |||
#... | |||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 172.20.30.40> | <VirtualHost 172.20.30.40> | ||
DocumentRoot "/www/subdomain/sub1" | |||
ServerName www.sub1.domain.tld ServerPath "/sub1/" | |||
RewriteEngine On | |||
RewriteRule "^(/sub1/.*)" "/www/subdomain$1" | |||
#... | |||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 172.20.30.40> | <VirtualHost 172.20.30.40> | ||
DocumentRoot "/www/subdomain/sub2" | |||
ServerNamewww.sub2.domain.tld ServerPath "/sub2/" | |||
RewriteEngine On | |||
RewriteRule "^(/sub2/.*)" "/www/subdomain$1" | |||
# ... | |||
</VirtualHost> | </VirtualHost> | ||
</syntaxhighlight> | |||
Aufgrund der ServerPath-Direktive wird eine Anfrage an die URL http://www.sub1.domain.tld/sub1/ immer vom sub1-vhost bedient. | |||
Eine Anfrage an die URL http://www.sub1.domain.tld/ wird nur dann vom sub1-vhost bedient, wenn der Client einen korrekten Host: Header gesendet hat. | |||
* Wenn kein Host: Header gesendet wird, erhält der Client die Informationsseite vom primären Host. | |||
Bitte beachten Sie, dass es eine Besonderheit gibt: Eine Anfrage an http://www.sub2.domain.tld/sub1/ wird auch dann vom sub1-vhost bedient, wenn der Client keinen Host: Header gesendet hat. | |||
Die RewriteRule-Direktiven werden verwendet, um sicherzustellen, dass ein Client, der einen korrekten Host:- Header gesendet hat, beide URL-Varianten verwenden kann, d. h. mit oder ohne URL-Präfix. | |||
[[Kategorie:Apache/HTTP/Virtuelle Server]] |
Aktuelle Version vom 5. Mai 2024, 18:35 Uhr
Namensbasierter Websites
- Betrieb mehrerer namensbasierter Websites unter einer einzigen IP-Adresse
Ihr Server hat mehrere Hostnamen, die zu einer einzigen Adresse aufgelöst werden, und Sie möchten für www.example.comund www.example.org unterschiedlich reagieren
- Hinweis
- Das Erstellen von virtuellen Hostkonfigurationen auf Ihrem Apache-Server bewirkt nicht auf magische Weise, dass DNS-Einträge für diese Hostnamen erstellt werden.
- Sie müssen die Namen im DNS haben, die zu Ihrer IP-Adresse aufgelöst werden, oder niemand wird Ihre Website sehen können.
- Sie können Einträge in Ihrer hosts-Datei für lokale Tests vornehmen, aber das funktioniert nur von dem Rechner aus, der diese hosts-Einträge hat.
- Sicherstellen, dass Apache auf Port 80 lauscht
Listen 80
<VirtualHost *:80>
DocumentRoot "/www/example1"
ServerName www.example.com
# Andere Direktiven hier
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/www/example2"
ServerNamewww.example.org
# Andere Direktiven hier
</VirtualHost>
Die Sternchen passen zu allen Adressen, so dass der Hauptserver keine Anfragen bedient.
- Da der virtuelle Host mit ServerName www.example.com in der Konfigurationsdatei an erster Stelle steht, hat er die höchste Priorität und kann als Standard- oder Primärserver angesehen werden.
- Das heißt, wenn eine Anfrage eingeht, die nicht mit einer der angegebenen ServerName-Direktiven übereinstimmt, wird sie von diesem ersten <VirtualHost> bedient.
Die obige Konfiguration sollten Sie in fast allen Fällen verwenden, in denen ein virtuelles Hosting auf Namen basiert.
- Die einzige Sache, für die diese Konfiguration nicht funktioniert, ist, wenn Sie unterschiedliche Inhalte auf der Grundlage unterschiedlicher IP-Adressen oder Ports bereitstellen.
- Hinweis
Sie können * durch eine bestimmte IP-Adresse auf dem System ersetzen.
- Solche virtuellen Hosts werden nur für HTTP-Anfragen verwendet, die bei einer Verbindung mit der angegebenen IP-Adresse eingehen.
Es ist jedoch auch nützlich, * auf Systemen zu verwenden, bei denen die IP-Adresse nicht vorhersehbar ist - zum Beispiel, wenn Sie eine dynamische IP-Adresse bei Ihrem ISP haben und eine Art dynamische DNS-Lösung verwenden.
- Da * mit jeder IP-Adresse übereinstimmt, würde diese Konfiguration ohne Änderungen funktionieren, wenn sich Ihre IP-Adresse ändert.
Namensbasierte Hosts auf mehr als einer IP-Adresse
- Hinweis
- Jede der hier beschriebenen Techniken kann auf eine beliebige Anzahl von IP-Adressen ausgedehnt werden.
Der Server hat zwei IP-Adressen
- Auf der einen(172.20.30.40) wird der "Hauptserver" server.example.com betrieben und auf der anderen(172.20.30.50) werden zwei oder mehr virtuelle Hosts betrieben.
Listen 80
# Dies ist der "Haupt"-Server, der auf 172.20.30.40 läuft
ServerName server.example.comDocumentRoot "/www/mainserver"
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example1"
ServerName www.example.com # Andere Direktiven hier ...
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example2"
ServerNamewww.example.org # Andere Direktiven hier ...
</VirtualHost>
Jede Anfrage an eine andere Adresse als 172.20.30.50 wird vom Hauptserver zugestellt.
- Eine Anfrage an 172.20.30.50 mit einem unbekannten Hostnamen oder ohne Host: Header wird von www.example.com zugestellt.
- Bereitstellung desselben Inhalts auf verschiedenen IP-Adressen (z. .B. einer internen und einer externen Adresse).
- Der Server-Rechner hat zwei IP-Adressen(192.168.1.1und 172.20.30.40)
- Der Rechner befindet sich zwischen einem internen (Intranet) und einem externen (Internet) Netz.
- Außerhalb des Netzes wird der Name server.example.com zur externen Adresse(172.20.30.40) aufgelöst, aber innerhalb des Netzes wird derselbe Name zur internen Adresse (192.168.1.1) aufgelöst.
Mit nur einem <VirtualHost>-Abschnitt kann der Server dazu gebracht werden, auf interne und externe Anfragen mit demselben Inhalt zu antworten.
<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot "/www/server1"
ServerName server.example.com ServerAlias server</VirtualHost>
Jetzt werden Anfragen aus beiden Netzen von demselben <VirtualHost> bedient.
- Anmerkung
Im internen Netzwerk kann man statt des voll qualifizierten Hostnamens server.example.com einfach den Nameserver verwenden.
Beachten Sie auch, dass Sie im obigen Beispiel die Liste der IP-Adressen durch * ersetzen können, was dazu führt, dass der Server auf alle Adressen gleich antwortet.
Verschiedene Websites auf verschiedenen Ports
Sie haben mehrere Domänen, die auf dieselbe IP-Adresse verweisen, und möchten auch mehrere Ports bedienen.
- Das nachstehende Beispiel zeigt, dass die Namenszuordnung erfolgt, nachdem die am besten passende Kombination aus IP-Adresse und Port ermittelt wurde.
Listen 80
Listen 8080
<VirtualHost 172.20.30.40:80>
ServerNamewww.example.com DocumentRoot "/www/domain-80"
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerNamewww.example.com DocumentRoot "/www/domain-8080"
</VirtualHost>
<VirtualHost 172.20.30.40:80>
ServerNamewww.example.org DocumentRoot "/www/otherdomain-80"
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerNamewww.example.org DocumentRoot "/www/otherdomain-8080"
</VirtualHost>
IP-basiertes virtuelles Hosting
Der Server hat zwei IP-Adressen(172.20.30.40 und 172.20.30.50), die zu den Namen www.example.com bzw.
- www.
- example.orgaufgelöst werden.
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example1"
ServerName www.example.com</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example2"
ServerName www.example.org</VirtualHost>
Anfragen an eine Adresse, die nicht in einer der <VirtualHost>-Direktiven angegeben ist (z. B. localhost), werden an den Hauptserver weitergeleitet, sofern ein solcher vorhanden ist.
Gemischte port- und ip-basierte virtuelle Hosts
Der Server-Rechner hat zwei IP-Adressen(172.20.30.40 und 172.20.30.50), die zu den Namen www.example.com bzw. www.example.org aufgelöst werden.
- In beiden Fällen wollen wir Hosts auf den Ports 80 und 8080 ausführen.
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080
<VirtualHost 172.20.30.40:80>
DocumentRoot "/www/example1-80"
ServerName www.example.com</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot "/www/example1-8080"
ServerName www.example.com</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot "/www/example2-80"
ServerName www.example.org</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot "/www/example2-8080"
ServerName www.example.org</VirtualHost>
Gemischte namensbasierte und IP-basierte vhosts
Jede Adresse, die im Argument eines virtuellen Hosts genannt wird und nie in einem anderen virtuellen Host auftaucht, ist ein rein IP-basierter virtueller Host.
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example1"
ServerName www.example.com</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example2"
ServerName www.example.org</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example3"
ServerName www.example.net</VirtualHost>
# IP-basiert
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example4"
ServerName www.example.edu</VirtualHost>
<VirtualHost 172.20.30.60>
DocumentRoot "/www/example5"
Servername www.example.gov</VirtualHost>
Gemeinsame Verwendung von Virtual_host und mod_proxy
Das folgende Beispiel ermöglicht es einem Front-End-Rechner, einen virtuellen Host an einen Server weiterzuleiten, der auf einem anderen Rechner läuft.
- Im Beispiel wird ein virtueller Host mit demselben Namen auf einem Rechner unter 192.168.111.2 konfiguriert.
- Die Anweisung ProxyPreserveHost On wird verwendet, damit der gewünschte Hostname durchgereicht wird, falls wir mehrere Hostnamen an einen einzelnen Rechner weiterleiten.
<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass "/" "http://192.168.111.2/"
ProxyPassReverse "/" "http://192.168.111.2/"
ServerName hostname.example.com</VirtualHost>
Verwendung von _Standard_vhosts
_Standard_ vhosts für alle Ports
Abfangen jeder Anfrage an eine nicht spezifizierte IP-Adresse und einen nicht spezifizierten Port, d. h. eine Kombination aus Adresse und Port, die für keinen anderen virtuellen Host verwendet wird.
<VirtualHost _default_:*>
DocumentRoot "/www/default"
</VirtualHost>
Die Verwendung eines solchen Standard-Vhosts mit einem Wildcard-Port verhindert effektiv, dass eine Anfrage an den Hauptserver geht.
Ein Standard-Vhost bedient niemals eine Anfrage, die an eine Adresse/Port gesendet wurde, die für namensbasierte Vhosts verwendet wird.
- Wenn die Anfrage einen unbekannten oder keinen Host:-Header enthielt, wird sie immer vom primären namensbasierten vhost bedient (der vhost für diese Adresse/Port, der in der Konfigurationsdatei an erster Stelle steht).
Sie können AliasMatch oder RewriteRule verwenden, um jede Anfrage auf eine einzelne Informationsseite (oder ein Skript) umzuschreiben.
_Standard_ vhosts für verschiedene Ports
Wie Setup 1, aber der Server lauscht auf mehreren Ports und wir wollen einen zweiten _Standard_ vhost für Port 80 verwenden.
<VirtualHost _default_:80>
DocumentRoot "/www/default80"
#...
</VirtualHost>
<syntaxhighlight lang="apache" line>
<VirtualHost _default_:*>
DocumentRoot "/www/default"
#...
</VirtualHost>
Der Standard-Vhost für Port 80 (der vor jedem Standard-Vhost mit einem Wildcard-Port stehen muss ) fängt alle Anfragen ab, die an eine nicht spezifizierte IP-Adresse gesendet wurden.
- Der Hauptserver wird nie zur Bearbeitung einer Anfrage verwendet.
_Standard_ vhosts für einen Port
Wir möchten einen Standard-Vhost für Port 80 haben, aber keine anderen Standard-Vhosts.
<VirtualHost _default_:80>
DocumentRoot "/www/default"
...
</VirtualHost>
Eine Anfrage an eine nicht spezifizierte Adresse an Port 80 wird vom Standard-Vhost bedient.
- Alle anderen Anfragen an eine nicht spezifizierte Adresse und einen nicht spezifizierten Port werden vom Hauptserver zugestellt.
Jede Verwendung von * in einer Deklaration eines virtuellen Hosts hat einen höheren Vorrang als _default_.
Migrieren eines namensbasierten vhosts zu einem IP-basierten vhost
Der namensbasierte vhost mit dem Hostnamen www.example.org (aus unserem namensbasierten Beispiel, Setup 2) sollte seine eigene IP-Adresse erhalten.
- Um Probleme mit Nameservern oder Proxies zu vermeiden, die die alte IP-Adresse für den namensbasierten vhost zwischengespeichert haben, wollen wir während einer Migrationsphase beide Varianten anbieten.
Die Lösung ist einfach, denn wir können die neue IP-Adresse (172.20.30.50) einfach in die VirtualHost-Richtlinieaufnehmen.
Listen 80
ServerNamewww.example.comDocumentRoot "/www/example1"
<VirtualHost 172.20.30.40 172.20.30.50>
DocumentRoot "/www/example2"
ServerNamewww.example.org # ...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example3"
ServerNamewww.example.net ServerAlias *.example.net # ...
</VirtualHost>
Der vhost kann nun über die neue Adresse (als IP-basierter vhost) und über die alte Adresse (als namensbasierter vhost) erreicht werden.
Verwendung der ServerPath-Richtlinie
Wir haben einen Server mit zwei namensbasierten vhosts.
- Um den richtigen virtuellen Host zu finden, muss ein Client den richtigen Host:Header senden.
- Alte HTTP/1.0-Clients senden einen solchen Header nicht und der Apache hat keine Ahnung, welchen vhost der Client zu erreichen versucht hat (und bedient die Anfrage vom primären vhost).
- Um so viel Abwärtskompatibilität wie möglich zu gewährleisten, erstellen wir einen primären vhost, der eine einzelne Seite mit Links mit einem URL-Präfix zu den namensbasierten virtuellen Hosts zurückgibt.
<VirtualHost 172.20.30.40>
# primary vhost
DocumentRoot "/www/subdomain"
RewriteEngine On
RewriteRule "." "/www/subdomain/index.html"
#...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/subdomain/sub1"
ServerName www.sub1.domain.tld ServerPath "/sub1/"
RewriteEngine On
RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
#...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/subdomain/sub2"
ServerNamewww.sub2.domain.tld ServerPath "/sub2/"
RewriteEngine On
RewriteRule "^(/sub2/.*)" "/www/subdomain$1"
# ...
</VirtualHost>
Aufgrund der ServerPath-Direktive wird eine Anfrage an die URL http://www.sub1.domain.tld/sub1/ immer vom sub1-vhost bedient. Eine Anfrage an die URL http://www.sub1.domain.tld/ wird nur dann vom sub1-vhost bedient, wenn der Client einen korrekten Host: Header gesendet hat.
- Wenn kein Host: Header gesendet wird, erhält der Client die Informationsseite vom primären Host.
Bitte beachten Sie, dass es eine Besonderheit gibt: Eine Anfrage an http://www.sub2.domain.tld/sub1/ wird auch dann vom sub1-vhost bedient, wenn der Client keinen Host: Header gesendet hat.
Die RewriteRule-Direktiven werden verwendet, um sicherzustellen, dass ein Client, der einen korrekten Host:- Header gesendet hat, beide URL-Varianten verwenden kann, d. h. mit oder ohne URL-Präfix.