Apache HTTP Server Version 2.5

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".
Virtuelle Hosts für beliebige Hostnamen
Dynamische virtuelle Hosts mit
mod_rewrite
Verwendung einer separaten Konfigurationsdatei für virtuelle HostsWir 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.
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond ${lowercase:%{HTTP_HOST}} ^([^.]+)\.example\.com$
RewriteRule ^(.*) /home/%1/www$1
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.
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]
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]