<-
Apache > HTTP-Server > Dokumentation > Version 2.5 > Rewrite

Dynamische Massen-Virtual-Hosts mit mod_rewrite

Verfügbare Sprachen:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

Dieses Dokument ergänzt die mod_rewrite Referenzdokumentation. Es beschreibt, wie Sie mod_rewrite verwenden können, um dynamisch konfigurierte virtuelle Hosts zu erstellen.

mod_rewrite ist normalerweise nicht der beste Weg, um virtuelle Hosts zu konfigurieren. Sie sollten zuerst die Alternativen in Betracht ziehen, bevor Sie auf mod_rewrite zurückgreifen. Siehe auch das Dokument "Wie man mod_rewrite vermeidet".

Siehe auch

top

Virtuelle Hosts für beliebige Hostnamen

Beschreibung:

Wir möchten automatisch einen virtuellen Host für jeden Hostnamen erstellen, der in unserer Domain aufgelöst wird, ohne für jeden eine neue VirtualHost-Sektion erstellen zu müssen.

In diesem Rezept nehmen wir an, dass wir den Hostnamen SITE.example.com für jeden Benutzer verwenden und deren Inhalte aus /home/SITE/www ausliefern. Wir möchten jedoch, dass www.example.com von dieser Zuordnung ausgenommen wird.

Lösung:
RewriteEngine on

RewriteMap    lowercase int:tolower

RewriteCond   %{HTTP_HOST} !^www\.
RewriteCond   ${lowercase:%{HTTP_HOST}}   ^([^.]+)\.example\.com$
RewriteRule   ^(.*)    /home/%1/www$1
Diskussion
Sie müssen sich um die DNS-Auflösung kümmern - Apache übernimmt keine Namensauflösung. Sie müssen entweder CNAME-Einträge für jeden Hostnamen oder einen DNS-Wildcard-Eintrag erstellen. Die Erstellung von DNS-Einträgen liegt außerhalb des Umfangs dieses Dokuments.

Die interne tolower-RewriteMap-Direktive wird verwendet, um sicherzustellen, dass alle verwendeten Hostnamen in Kleinbuchstaben sind, sodass keine Mehrdeutigkeit in der Verzeichnisstruktur entsteht, die erstellt werden muss.

Klammern in einer RewriteCond werden in die Rückreferenzen %1, %2 usw. erfasst, während Klammern in RewriteRule in die Rückreferenzen $1, $2 usw. erfasst werden.

Die erste RewriteCond prüft, ob der Hostname mit www. beginnt, und wenn ja, wird die Umschreibung übersprungen.

Wie bei vielen in diesem Dokument besprochenen Techniken ist mod_rewrite wirklich nicht der beste Weg, um diese Aufgabe zu erledigen. Sie sollten stattdessen die Verwendung von mod_vhost_alias in Betracht ziehen, da es alles jenseits der Auslieferung statischer Dateien wesentlich eleganter handhabt, wie dynamische Inhalte und Alias-Auflösung.

top

Dynamische virtuelle Hosts mit mod_rewrite

Dieser Auszug aus httpd.conf bewirkt dasselbe wie das erste Beispiel. Die erste Hälfte ist dem entsprechenden Teil oben sehr ähnlich, mit einigen Änderungen, die für die Abwärtskompatibilität und die korrekte Funktionsweise des mod_rewrite-Teils erforderlich sind; die zweite Hälfte konfiguriert mod_rewrite für die eigentliche Arbeit.

Da mod_rewrite vor anderen URI-Übersetzungsmodulen (z.B. mod_alias) läuft, muss mod_rewrite angewiesen werden, alle URLs, die von diesen Modulen verarbeitet worden wären, explizit zu ignorieren. Und da diese Regeln ansonsten alle ScriptAlias-Direktiven umgehen würden, müssen wir mod_rewrite diese Zuordnungen explizit durchführen lassen.

# Den Servernamen aus dem Host:-Header ermitteln
UseCanonicalName Off

# Aufteilbare Protokolldateien
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon

<Directory "/www/hosts">
    # ExecCGI wird hier benötigt, da wir die CGI-Ausführung
    # nicht so erzwingen können wie ScriptAlias es tut
    Options FollowSymLinks ExecCGI
</Directory>

RewriteEngine On

# Ein vom Host:-Header abgeleiteter ServerName kann beliebige Groß-/Kleinschreibung haben
RewriteMap  lowercase  "int:tolower"

## Zuerst normale Dokumente behandeln:
# Alias /icons/ zulassen - für andere Aliase wiederholen
RewriteCond  "%{REQUEST_URI}"  "!^/icons/"
# CGIs zulassen
RewriteCond  "%{REQUEST_URI}"  "!^/cgi-bin/"
# Die Magie ausführen
RewriteRule  "^/(.*)$"         "/www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1"

## Nun CGIs behandeln - wir müssen einen Handler erzwingen
RewriteCond  "%{REQUEST_URI}"  "^/cgi-bin/"
RewriteRule  "^/(.*)$"         "/www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1"  [H=cgi-script]
top

Verwendung einer separaten Konfigurationsdatei für virtuelle Hosts

Diese Anordnung verwendet fortgeschrittenere mod_rewrite-Funktionen, um die Übersetzung vom virtuellen Host zum Document Root aus einer separaten Konfigurationsdatei abzuleiten. Dies bietet mehr Flexibilität, erfordert aber eine kompliziertere Konfiguration.

Die vhost.map-Datei sollte in etwa so aussehen:

customer-1.example.com /www/customers/1
customer-2.example.com /www/customers/2
# ...
customer-N.example.com /www/customers/N

Die httpd.conf sollte Folgendes enthalten:

RewriteEngine on

RewriteMap   lowercase  "int:tolower"

# Die Map-Datei definieren
RewriteMap   vhost      "txt:/www/conf/vhost.map"

# Aliase wie oben behandeln
RewriteCond  "%{REQUEST_URI}"               "!^/icons/"
RewriteCond  "%{REQUEST_URI}"               "!^/cgi-bin/"
RewriteCond  "${lowercase:%{SERVER_NAME}}"  "^(.+)$"
# Dies führt die dateibasierte Neuzuordnung durch
RewriteCond  "${vhost:%1}"                  "^(/.*)$"
RewriteRule  "^/(.*)$"                      "%1/docs/$1"

RewriteCond  "%{REQUEST_URI}"               "^/cgi-bin/"
RewriteCond  "${lowercase:%{SERVER_NAME}}"  "^(.+)$"
RewriteCond  "${vhost:%1}"                  "^(/.*)$"
RewriteRule  "^/cgi-bin/(.*)$"                      "%1/cgi-bin/$1" [H=cgi-script]

Verfügbare Sprachen:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn