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.combis, www.foo.comsofern das wwwnicht 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_httpund 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/subdefiniert VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3.
Zurückfallen:
Der erste RewriteRulekümmert sich um unbekannte Domänen, z. domain.comVerzeichnis existiert nicht, indem Sie die localhost-Website vertreten.
Der zweite ist RewriteRuleauch ein Proxy für localhost, wenn sowohl das domain.com/subals auch das domain.com/wwwVerzeichnis nicht vorhanden sind.
Der dritte RewriteRuleStellvertreter für domain.comwann domain.com/subexistiert nicht. Wir wissen, domain.com/wwwdass 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 RewriteRuleWillensvertreter zu localhost, wenn domain.comoder domain.com/wwwnicht vorhanden.
^ $%. * !!!
Ich hatte einige Probleme, meinen Kopf um all diese $und %Zeichen in der zu wickeln, RewriteCondund RewriteRuledeshalb 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 ServerAliassind nur Platzhalter.
- Die
%nin der VirtualDocumentRootsind aus dem Dokumentnamen Interpolation .
- Die
%nin der zweiten RewriteCondbeziehen sich auf die Auswahl (.*)aus der ersten RewriteCond, z. die Teile der angeforderten Domain.
- Die
%nin der RewriteRulees auch tun.
- Das
$1in RewriteRulebezieht 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.