Zum Inhalt springen

Apache/HTTP/Vhost/Beispiele

Aus Foxwiki

Apache/HTTP/Virtuelle Server/Beispiele topic - Beschreibung

Beschreibung

Anhang

Siehe auch

Links

Weblinks


TMP

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>
<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.