Ich bin auch auf diese Frage gestoßen, die nach apache2 dynamic vhost fallback gegoogelt hat, und Lucs Antwort hat mir sehr bei der Lösung meines Problems geholfen, aber ich möchte immer noch zeigen, was ich getan habe, um meine Ziele zu erreichen, hauptsächlich, weil es einige zusätzliche Arbeiten beinhaltete und weil ich es denke könnte für zukünftige Googler hilfreich sein ...
Meine Ziele
- dynamisches vhosting für alle Domains und Subdomains, die auf meinen VPS verweisen
foo.com
sollte den gleichen Inhalt wie dienen www.foo.com
- Fallback für unbekannte Domains auf eine Art Standard
- Fallback für unbekannte Subdomains von
foo.com
bis, www.foo.com
sofern das www
nicht nicht verfügbar ist, stattdessen Fallback auf Standard
DNS
Ich habe ein paar Domains (und alle ihre Subdomains), die auf meinen VPS zeigen, zum Beispiel:
- foo.com
- bar.com
- foobar.com
Dateisystem
Ich habe die folgenden Verzeichnisse, Domänen enthalten Verzeichnisse mit den Namen der verfügbaren Subdomänen, das Verzeichnis www ist erforderlich, aber die Konfiguration sollte in der Lage sein, mit der Situation umzugehen, in der es nicht vorhanden ist. Localhost wird als Standard-Fallback verwendet:
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
Tests
Meine Ziele in überprüfbare Fälle übersetzen:
- foo.com sollte von foo.com/www aus bedient werden
- www.foo.com sollte von foo.com/www aus bedient werden
- bar.foo.com sollte von foo.com/bar aus bedient werden
- foo.foo.com sollte von foo.com/www aus bedient werden (foo.com/foo existiert nicht)
- bar.com sollte von localhost aus bedient werden (bar.com/www existiert nicht)
- www.bar.com sollte von localhost aus bedient werden (bar.com/www existiert nicht)
- foo.bar.com sollte von bar.com/foo aus bedient werden
- bar.bar.com sollte von localhost aus bedient werden (bar.com/bar existiert nicht)
- foobar.com sollte von localhost aus bedient werden (foobar.com existiert nicht)
- www.foobar.com sollte von localhost aus bedient werden (foobar.com existiert nicht)
- foo.foobar.com sollte von localhost aus bedient werden (foobar.com existiert nicht)
Die Lösung
Diese verwendet: mod_rewrite
, mod_proxy_http
und natürlich mod_vhost_alias
.
ServerName my.domain
ServerAdmin admin@my.domain
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/localhost
</VirtualHost>
<VirtualHost *:80>
ServerName sub.domain
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3 !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteCond /var/www/%2.%3/www !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName bare.domain
ServerAlias *.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
RewriteCond /var/www/%1.%2 !-d [OR]
RewriteCond /var/www/%1.%2/www !-d
RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>
Wie funktioniert das? Es sind drei virtuelle Hosts definiert:
localhost
Der localhost dient als Standard. Alle Anfragen, die nicht auflösbar sind, werden von localhost bearbeitet. Das Einrichten eines Symlinks von localhost zu einer Ihrer Domains entspricht dem standardmäßigen Einrichten dieser Site.
Subdomain
Die Subdomain vhost nimmt alle Anfragen in Form von entgegen *.*.*
. Standardmäßig werden alle Anforderungen wie von /domain.com/sub
definiert VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
.
Zurückfallen:
Der erste RewriteRule
kümmert sich um unbekannte Domänen, z. domain.com
Verzeichnis existiert nicht, indem Sie die localhost-Website vertreten.
Der zweite ist RewriteRule
auch ein Proxy für localhost, wenn sowohl das domain.com/sub
als auch das domain.com/www
Verzeichnis nicht vorhanden sind.
Der dritte RewriteRule
Stellvertreter für domain.com
wann domain.com/sub
existiert nicht. Wir wissen, domain.com/www
dass es aufgrund des zweiten Umschreibungsblocks existiert.
bare.domain
Der bare.domain vhost nimmt die *.*
Anfragen entgegen und bedient sie/domain.com/www
Hier wird der RewriteRule
Willensvertreter zu localhost, wenn domain.com
oder domain.com/www
nicht vorhanden.
^ $%. * !!!
Ich hatte einige Probleme, meinen Kopf um all diese $
und %
Zeichen in der zu wickeln, RewriteCond
und RewriteRule
deshalb werde ich sie hier erklären:
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
- Die
*
in der ServerAlias
sind nur Platzhalter.
- Die
%n
in der VirtualDocumentRoot
sind aus dem Dokumentnamen Interpolation .
- Die
%n
in der zweiten RewriteCond
beziehen sich auf die Auswahl (.*)
aus der ersten RewriteCond
, z. die Teile der angeforderten Domain.
- Die
%n
in der RewriteRule
es auch tun.
- Das
$1
in RewriteRule
bezieht sich auf die Auswahl (.*)
am Anfang des RewriteRule
. Welches erfasst alles von der Domain bis zur ?
in der Anfrage URL. Jeder Querystring wird automatisch zur URL von hinzugefügt mod_proxy
.