Apache/HTTP/Virtuelle Server/Beispiele: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
 
(15 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


Running several name-based web sites on a single IP address.
; 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.


Your server has multiple hostnames that resolve to a single address, and you want to respond differently for www.example.com and www.example.org.
# Sicherstellen, dass Apache auf Port 80 lauscht
Note
<syntaxhighlight lang="apache" line>
 
Creating virtual host configurations on your Apache server does not magically cause DNS entries to be created for those host names. You must have the names in DNS, resolving to your IP address, or nobody else will be able to see your web site. You can put entries in your hosts file for local testing, but that will work only from the machine with those hosts entries.
 
# Ensure that Apache listens on port 80
<syntaxhighlight lang=apache line>
Listen 80
Listen 80
<VirtualHost *:80>
<VirtualHost *:80>
    DocumentRoot "/www/example1"
DocumentRoot "/www/example1"
    ServerName www.example.com
ServerName www.example.com  
 
# Andere Direktiven hier
    # Other directives here
</VirtualHost>
</VirtualHost>
</syntaxhighlight>


<syntaxhighlight lang="apache" line>
<VirtualHost *:80>
<VirtualHost *:80>
    DocumentRoot "/www/example2"
DocumentRoot "/www/example2"
    ServerName www.example.org
ServerNamewww.example.org  
 
# Andere Direktiven hier
    # Other directives here
</VirtualHost>
</VirtualHost>
</syntaxhighlight>
</syntaxhighlight>


The asterisks match all addresses, so the main server serves no requests. Due to the fact that the virtual host with ServerName www.example.com is first in the configuration file, it has the highest priority and can be seen as the default or primary server. That means that if a request is received that does not match one of the specified ServerName directives, it will be served by this first <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.


The above configuration is what you will want to use in almost all name-based virtual hosting situations. The only thing that this configuration will not work for, in fact, is when you are serving different content based on differing IP addresses or ports.
Die obige Konfiguration sollten Sie in fast allen Fällen verwenden, in denen ein virtuelles Hosting auf Namen basiert.
Note
* Die einzige Sache, für die diese Konfiguration nicht funktioniert, ist, wenn Sie unterschiedliche Inhalte auf der Grundlage unterschiedlicher IP-Adressen oder Ports bereitstellen.


You may replace * with a specific IP address on the system. Such virtual hosts will only be used for HTTP requests received on connection to the specified IP address.
; 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.


However, it is additionally useful to use * on systems where the IP address is not predictable - for example if you have a dynamic IP address with your ISP, and you are using some variety of dynamic DNS solution. Since * matches any IP address, this configuration would work without changes whenever your IP address changes.
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.
top
* Da * mit jeder IP-Adresse übereinstimmt, würde diese Konfiguration ohne Änderungen funktionieren, wenn sich Ihre IP-Adresse ändert.
Name-based hosts on more than one IP address.
Note


Any of the techniques discussed here can be extended to any number of IP addresses.
=== Namensbasierte Hosts auf mehr als einer IP-Adresse ===


The server has two IP addresses. On one (172.20.30.40), we will serve the "main" server, server.example.com and on the other (172.20.30.50), we will serve two or more virtual hosts.
;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


# This is the "main" server running on 172.20.30.40
# Dies ist der "Haupt"-Server, der auf 172.20.30.40 läuft
ServerName server.example.com
ServerName server.example.comDocumentRoot "/www/mainserver"
DocumentRoot "/www/mainserver"


<VirtualHost 172.20.30.50>
<VirtualHost 172.20.30.50>
    DocumentRoot "/www/example1"
DocumentRoot "/www/example1"
    ServerName www.example.com
ServerName www.example.com # Andere Direktiven hier ...
 
    # Other directives here ...
</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.50>
<VirtualHost 172.20.30.50>
    DocumentRoot "/www/example2"
DocumentRoot "/www/example2"
    ServerName www.example.org
ServerNamewww.example.org # Andere Direktiven hier ...
 
    # Other directives here ...
</VirtualHost>
</VirtualHost>
</syntaxhighlight>


Any request to an address other than 172.20.30.50 will be served from the main server. A request to 172.20.30.50 with an unknown hostname, or no Host: header, will be served from www.example.com.
Jede Anfrage an eine andere Adresse als 172.20.30.50 wird vom Hauptserver zugestellt.
top
* Eine Anfrage an 172.20.30.50 mit einem unbekannten Hostnamen oder ohne Host: Header wird von www.example.com zugestellt.
Serving the same content on different IP addresses (such as an internal and external address).
* Bereitstellung desselben Inhalts auf verschiedenen IP-Adressen (z.&nbsp;.B.&nbsp;einer internen und einer externen Adresse).


The server machine has two IP addresses (192.168.1.1 and 172.20.30.40). The machine is sitting between an internal (intranet) network and an external (internet) network. Outside of the network, the name server.example.com resolves to the external address (172.20.30.40), but inside the network, that same name resolves to the internal address (192.168.1.1).
; 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.
The server can be made to respond to internal and external requests with the same content, with just one <VirtualHost> section.
* 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"
DocumentRoot "/www/server1"
    ServerName server.example.com
ServerName server.example.com ServerAlias server</VirtualHost>
    ServerAlias server
</syntaxhighlight>
</VirtualHost>


Now requests from both networks will be served from the same <VirtualHost>.
Jetzt werden Anfragen aus beiden Netzen von demselben <VirtualHost> bedient.
Note:


On the internal network, one can just use the name server rather than the fully qualified host name server.example.com.
; Anmerkung
Im internen Netzwerk kann man statt des voll qualifizierten Hostnamens server.example.com einfach den Nameserver verwenden.


Note also that, in the above example, you can replace the list of IP addresses with *, which will cause the server to respond the same on all addresses.
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.
top
Running different sites on different ports.


You have multiple domains going to the same IP and also want to serve multiple ports. The example below illustrates that the name-matching takes place after the best matching IP address and port combination is determined.
=== 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>
    ServerName www.example.com
ServerNamewww.example.com DocumentRoot "/www/domain-80"
    DocumentRoot "/www/domain-80"
</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40:8080>
<VirtualHost 172.20.30.40:8080>
    ServerName www.example.com
ServerNamewww.example.com DocumentRoot "/www/domain-8080"
    DocumentRoot "/www/domain-8080"
</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40:80>
<VirtualHost 172.20.30.40:80>
    ServerName www.example.org
ServerNamewww.example.org DocumentRoot "/www/otherdomain-80"
    DocumentRoot "/www/otherdomain-80"
</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40:8080>
<VirtualHost 172.20.30.40:8080>
    ServerName www.example.org
ServerNamewww.example.org DocumentRoot "/www/otherdomain-8080"
    DocumentRoot "/www/otherdomain-8080"
</VirtualHost>
</VirtualHost>
</syntaxhighlight>


top
== IP-basiertes virtuelles Hosting ==
IP-based virtual hosting
 
The server has two IP addresses (172.20.30.40 and 172.20.30.50) which resolve to the names www.example.com and www.example.org respectively.


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"
DocumentRoot "/www/example1"
    ServerName www.example.com
ServerName www.example.com</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.50>
<VirtualHost 172.20.30.50>
    DocumentRoot "/www/example2"
DocumentRoot "/www/example2"
    ServerName www.example.org
ServerName www.example.org</VirtualHost>
</VirtualHost>
</syntaxhighlight>


Requests for any address not specified in one of the <VirtualHost> directives (such as localhost, for example) will go to the main server, if there is one.
Anfragen an eine Adresse, die nicht in einer der <VirtualHost>-Direktiven angegeben ist (z.&nbsp;B.&nbsp;localhost), werden an den Hauptserver weitergeleitet, sofern ein solcher vorhanden ist.
top
Mixed port-based and ip-based virtual hosts


The server machine has two IP addresses (172.20.30.40 and 172.20.30.50) which resolve to the names www.example.com and www.example.org respectively. In each case, we want to run hosts on ports 80 and 8080.
=== 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"
DocumentRoot "/www/example1-80"
    ServerName www.example.com
ServerName www.example.com</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40:8080>
<VirtualHost 172.20.30.40:8080>
    DocumentRoot "/www/example1-8080"
DocumentRoot "/www/example1-8080"
    ServerName www.example.com
ServerName www.example.com</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.50:80>
<VirtualHost 172.20.30.50:80>
    DocumentRoot "/www/example2-80"
DocumentRoot "/www/example2-80"
    ServerName www.example.org
ServerName www.example.org</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.50:8080>
<VirtualHost 172.20.30.50:8080>
    DocumentRoot "/www/example2-8080"
DocumentRoot "/www/example2-8080"
    ServerName www.example.org
ServerName www.example.org</VirtualHost>
</VirtualHost>
</syntaxhighlight>
 
top
Mixed name-based and IP-based vhosts
 
Any address mentioned in the argument to a virtualhost that never appears in another virtual host is a strictly IP-based virtual host.


== 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"
DocumentRoot "/www/example1"
    ServerName www.example.com
ServerName www.example.com</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40>
<VirtualHost 172.20.30.40>
    DocumentRoot "/www/example2"
DocumentRoot "/www/example2"
    ServerName www.example.org
ServerName www.example.org</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40>
<VirtualHost 172.20.30.40>
    DocumentRoot "/www/example3"
DocumentRoot "/www/example3"
    ServerName www.example.net
ServerName www.example.net</VirtualHost>
</VirtualHost>


# IP-based
# IP-basiert
<VirtualHost 172.20.30.50>
<VirtualHost 172.20.30.50>
    DocumentRoot "/www/example4"
DocumentRoot "/www/example4"
    ServerName www.example.edu
ServerName www.example.edu</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.60>
<VirtualHost 172.20.30.60>
    DocumentRoot "/www/example5"
DocumentRoot "/www/example5"
    ServerName www.example.gov
Servername www.example.gov</VirtualHost>
</VirtualHost>
</syntaxhighlight>
 
top
Using Virtual_host and mod_proxy together
 
The following example allows a front-end machine to proxy a virtual host through to a server running on another machine. In the example, a virtual host of the same name is configured on a machine at 192.168.111.2. The ProxyPreserveHost On directive is used so that the desired hostname is passed through, in case we are proxying multiple hostnames to a single machine.


== 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
ProxyPreserveHost On
    ProxyPass       "/" "http://192.168.111.2/"
ProxyPass "/" "http://192.168.111.2/"
    ProxyPassReverse "/" "http://192.168.111.2/"
ProxyPassReverse "/" "http://192.168.111.2/"
    ServerName hostname.example.com
ServerName hostname.example.com</VirtualHost>
</VirtualHost>
</syntaxhighlight>


top
== Verwendung von _Standard_vhosts ==
Using _default_ vhosts
_Standard_ vhosts für alle Ports
_default_ vhosts for all ports
 
Catching every request to any unspecified IP address and port, i.e., an address/port combination that is not used for any other virtual host.


Abfangen jeder Anfrage an eine nicht spezifizierte IP-Adresse und einen nicht spezifizierten Port, d.&nbsp;h.&nbsp;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"
DocumentRoot "/www/default"
</VirtualHost>
</VirtualHost>
</syntaxhighlight>


Using such a default vhost with a wildcard port effectively prevents any request going to the main server.
Die Verwendung eines solchen Standard-Vhosts mit einem Wildcard-Port verhindert effektiv, dass eine Anfrage an den Hauptserver geht.


A default vhost never serves a request that was sent to an address/port that is used for name-based vhosts. If the request contained an unknown or no Host: header it is always served from the primary name-based vhost (the vhost for that address/port appearing first in the configuration file).
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).


You can use AliasMatch or RewriteRule to rewrite any request to a single information page (or script).
Sie können AliasMatch oder RewriteRule verwenden, um jede Anfrage auf eine einzelne Informationsseite (oder ein Skript) umzuschreiben.
_default_ vhosts for different ports


Same as setup 1, but the server listens on several ports and we want to use a second _default_ vhost for port 80.
=== _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"
DocumentRoot "/www/default80"
    # ...
#...
</VirtualHost>
</VirtualHost>
 
<syntaxhighlight lang="apache" line>
<VirtualHost _default_:*>
<VirtualHost _default_:*>
    DocumentRoot "/www/default"
DocumentRoot "/www/default"
    # ...
#...
</VirtualHost>
</VirtualHost>
</syntaxhighlight>


The default vhost for port 80 (which must appear before any default vhost with a wildcard port) catches all requests that were sent to an unspecified IP address. The main server is never used to serve a request.
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.
_default_ vhosts for one port
* Der Hauptserver wird nie zur Bearbeitung einer Anfrage verwendet.


We want to have a default vhost for port 80, but no other default vhosts.
=== _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"
DocumentRoot "/www/default"
...
...
</VirtualHost>
</VirtualHost>
</syntaxhighlight>


A request to an unspecified address on port 80 is served from the default vhost. Any other request to an unspecified address and port is served from the main server.
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.


Any use of * in a virtual host declaration will have higher precedence than _default_.
Jede Verwendung von * in einer Deklaration eines virtuellen Hosts hat einen höheren Vorrang als _default_.
top
Migrating a name-based vhost to an IP-based vhost


The name-based vhost with the hostname www.example.org (from our name-based example, setup 2) should get its own IP address. To avoid problems with name servers or proxies who cached the old IP address for the name-based vhost we want to provide both variants during a migration phase.
=== 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.


The solution is easy, because we can simply add the new IP address (172.20.30.50) to the VirtualHost directive.
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
ServerName www.example.com
ServerNamewww.example.comDocumentRoot "/www/example1"
DocumentRoot "/www/example1"


<VirtualHost 172.20.30.40 172.20.30.50>
<VirtualHost 172.20.30.40 172.20.30.50>
    DocumentRoot "/www/example2"
DocumentRoot "/www/example2"
    ServerName www.example.org
ServerNamewww.example.org # ...
    # ...
</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40>
<VirtualHost 172.20.30.40>
    DocumentRoot "/www/example3"
DocumentRoot "/www/example3"
    ServerName www.example.net
ServerNamewww.example.net ServerAlias *.example.net # ...
    ServerAlias *.example.net
    # ...
</VirtualHost>
</VirtualHost>
</syntaxhighlight>


The vhost can now be accessed through the new address (as an IP-based vhost) and through the old address (as a name-based vhost).
Der vhost kann nun über die neue Adresse (als IP-basierter vhost) und über die alte Adresse (als namensbasierter vhost) erreicht werden.
top
Using the ServerPath directive


We have a server with two name-based vhosts. In order to match the correct virtual host a client must send the correct Host: header. Old HTTP/1.0 clients do not send such a header and Apache has no clue what vhost the client tried to reach (and serves the request from the primary vhost). To provide as much backward compatibility as possible we create a primary vhost which returns a single page containing links with an URL prefix to the name-based virtual hosts.
=== 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
# primary vhost
    DocumentRoot "/www/subdomain"
DocumentRoot "/www/subdomain"
    RewriteEngine On
RewriteEngine On
    RewriteRule "." "/www/subdomain/index.html"
RewriteRule "." "/www/subdomain/index.html"
    # ...
#...
</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40>
<VirtualHost 172.20.30.40>
    DocumentRoot "/www/subdomain/sub1"
DocumentRoot "/www/subdomain/sub1"
    ServerName www.sub1.domain.tld
ServerName www.sub1.domain.tld ServerPath "/sub1/"
    ServerPath "/sub1/"
RewriteEngine On
    RewriteEngine On
RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
    RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
#...
    # ...
</VirtualHost>
</VirtualHost>


<VirtualHost 172.20.30.40>
<VirtualHost 172.20.30.40>
    DocumentRoot "/www/subdomain/sub2"
DocumentRoot "/www/subdomain/sub2"
    ServerName www.sub2.domain.tld
ServerNamewww.sub2.domain.tld ServerPath "/sub2/"
    ServerPath "/sub2/"
RewriteEngine On
    RewriteEngine On
RewriteRule "^(/sub2/.*)" "/www/subdomain$1"
    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.


Due to the ServerPath directive a request to the URL http://www.sub1.domain.tld/sub1/ is always served from the sub1-vhost.
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.
A request to the URL http://www.sub1.domain.tld/ is only served from the sub1-vhost if the client sent a correct Host: header. If no Host: header is sent the client gets the information page from the primary host.


Please note that there is one oddity: A request to http://www.sub2.domain.tld/sub1/ is also served from the sub1-vhost if the client sent no Host: header.
Die RewriteRule-Direktiven werden verwendet, um sicherzustellen, dass ein Client, der einen korrekten Host:- Header gesendet hat, beide URL-Varianten verwenden kann, d.&nbsp;h.&nbsp;mit oder ohne URL-Präfix.


The RewriteRule directives are used to make sure that a client which sent a correct Host: header can use both URL variants, i.e., with or without URL prefix.
[[Kategorie:Apache/HTTP/Virtuelle Server]]

Aktuelle Version vom 5. Mai 2024, 19: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.
  1. 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.