Ich möchte eine Umgebung einrichten, in der virtuelle Apache-Hosts dynamisch erstellt werden können, ohne die Konfiguration neu zu laden.
Ich kann dies mit mod_vhost_alias tun . Ich habe meinen virtuellen Standardhost so eingerichtet
<VirtualHost *>
UseCanonicalName Off
VirtualDocumentRoot /var/www/sandboxes/domains/%0
ServerName catchall.host
</VirtualHost>
Das funktioniert einwandfrei, aber wenn eine Anfrage nach einem Hostnamen gestellt wird, der derzeit nicht eingerichtet ist, wird der Fehler 404 Not Found angezeigt.
Was ich wirklich gerne tun würde, ist, diesen VirtualHost nur dann einzuschalten, wenn das Dokumentstammverzeichnis vorhanden ist. Andernfalls sollte er versuchen, mit einem anderen vhost übereinzustimmen (mit anderen Worten, das Vorhandensein des VirtualDocumentRoot funktioniert auf die gleiche Weise wie die Verwendung von a ServerAlias)
Ich habe versucht, dies zum zweiten vhost zu machen, wobei der erste vhost nur alle Anforderungen verarbeitet, aber dies hat nicht funktioniert - Anforderungen für Domänen, in denen ein VirtualDocumentRoot konfiguriert wurde, fielen auf den Standard-vhost durch.
Wie kann ich also vhosts dynamisch konfigurieren, aber mit einem Fallback auf einen anderen vhost für alle, die noch nicht konfiguriert sind?
quelle
Ich habe deine Frage beim Googeln gefunden. Ich hatte genau das gleiche Problem und wendete das Update an, wie in Pauls Antwort beschrieben . Für meine komplexe Web-App war ich jedoch nicht zufrieden damit, alle Anfragen über eine einzige zu leiten
notfound.php
.Am Ende konnte ich das Problem ohne externe Skripte beheben, indem ich nur meine VirtualHost-Konfiguration bearbeitete.
Zuerst wurde mein VirtualHost folgendermaßen konfiguriert:
Ich hatte URLs mag
client1.domainname.com
,client2.domainname.com
undwhatever.domainname.com
die beschlossen
/mnt/ramdisk/www/cms-client1-development/
,/mnt/ramdisk/www/cms-client2-development/
und/mnt/ramdisk/www/cms-whatever-development/
Eine URL wie
nonexistent.domainname.com
würde mir jedoch eine 404 geben, da das Verzeichnis/mnt/ramdisk/www/cms-nonexistent-development/
nicht vorhanden war. Ich wollte, dass diese Subdomains das Verzeichnis verwenden/mnt/ramdisk/www/cms-default-development/
Ich habe dies mit
ModRewrite
und behobenModProxy
:Dies bedeutet: Nehmen Sie die Subdomain (den vorherigen Teil
.domainname.com
), fügen Sie diese in den Pfad (% 1) ein und senden Sie Proxy-Anforderungen an die Standard-URL nur, wenn das Verzeichnis nicht vorhanden ist.Durch die Verwendung eines Proxys ist der Prozess transparent und der Benutzer glaubt, http://nonexistent.domainname.com zu besuchen , während er den Inhalt von http://default.domainname.com/ anzeigt .
quelle
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
foo.com
sollte den gleichen Inhalt wie dienenwww.foo.com
foo.com
bis,www.foo.com
sofern daswww
nicht nicht verfügbar ist, stattdessen Fallback auf StandardDNS
Ich habe ein paar Domains (und alle ihre Subdomains), die auf meinen VPS zeigen, zum Beispiel:
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:
Tests
Meine Ziele in überprüfbare Fälle übersetzen:
Die Lösung
Diese verwendet:
mod_rewrite
,mod_proxy_http
und natürlichmod_vhost_alias
.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
definiertVirtualDocumentRoot /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 dasdomain.com/sub
als auch dasdomain.com/www
Verzeichnis nicht vorhanden sind.Der dritte
RewriteRule
Stellvertreter fürdomain.com
wanndomain.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, wenndomain.com
oderdomain.com/www
nicht vorhanden.^ $%. * !!!
Ich hatte einige Probleme, meinen Kopf um all diese
$
und%
Zeichen in der zu wickeln,RewriteCond
undRewriteRule
deshalb werde ich sie hier erklären:*
in derServerAlias
sind nur Platzhalter.%n
in derVirtualDocumentRoot
sind aus dem Dokumentnamen Interpolation .%n
in der zweitenRewriteCond
beziehen sich auf die Auswahl(.*)
aus der erstenRewriteCond
, z. die Teile der angeforderten Domain.%n
in derRewriteRule
es auch tun.$1
inRewriteRule
bezieht sich auf die Auswahl(.*)
am Anfang desRewriteRule
. Welches erfasst alles von der Domain bis zur?
in der Anfrage URL. Jeder Querystring wird automatisch zur URL von hinzugefügtmod_proxy
.quelle
Wenn ich es einfach rauswerfe, erhalte ich das gleiche Ergebnis (abzüglich der Localhost-Umleitung) wie RemyNL, aber auch die IP-Adresse, wenn ich eine direkte Verbindung herstelle:
quelle