Je voudrais mettre en place un environnement où les hôtes virtuels Apache peuvent être créés dynamiquement sans recharger la configuration.
Je peux le faire avec mod_vhost_alias , j'ai configuré mon hôte virtuel par défaut quelque chose comme ça
<VirtualHost *>
UseCanonicalName Off
VirtualDocumentRoot /var/www/sandboxes/domains/%0
ServerName catchall.host
</VirtualHost>
Cela fonctionne très bien, mais si une demande est faite pour un nom d'hôte qui n'est pas actuellement configuré, j'obtiens une erreur 404 Not Found.
Ce que j'aimerais vraiment faire, c'est que ce VirtualHost ne démarre que si la racine du document existe, sinon essayez de faire correspondre un autre vhost (en d'autres termes, faites en sorte que la présence du VirtualDocumentRoot fonctionne de la même manière que l'utilisation d'un ServerAlias)
J'ai essayé d'en faire le deuxième vhost, le premier vhost ne gérant que toutes les demandes, mais cela n'a pas fonctionné - les demandes de domaines où un VirtualDocumentRoot était configuré tombaient vers le vhost par défaut.
Alors, comment puis-je avoir des vhosts configurés dynamiquement, mais avec un retour à un autre vhost pour ceux qui ne sont pas encore configurés?
la source
J'ai trouvé votre question lors de la recherche sur Google. J'ai eu exactement le même problème et j'ai appliqué le correctif tel que décrit dans la réponse de Paul . Cependant, pour mon application Web complexe, je n'étais pas satisfait du routage de toutes les demandes via une seule
notfound.php
.Au final, j'ai réussi à résoudre le problème sans scripts externes, uniquement en modifiant ma configuration VirtualHost.
Au début, mon VirtualHost était configuré comme ceci:
J'avais des URL comme
client1.domainname.com
,client2.domainname.com
etwhatever.domainname.com
qui a résolu à
/mnt/ramdisk/www/cms-client1-development/
,/mnt/ramdisk/www/cms-client2-development/
et/mnt/ramdisk/www/cms-whatever-development/
Cependant, une URL comme
nonexistent.domainname.com
me donnerait un 404 car le répertoire/mnt/ramdisk/www/cms-nonexistent-development/
n'existait pas. Je voulais que ces sous-domaines utilisent le répertoire/mnt/ramdisk/www/cms-default-development/
J'ai corrigé cela en utilisant
ModRewrite
etModProxy
:Ce que cela fait, c'est: saisir le sous-domaine (la partie précédente
.domainname.com
), l'insérer dans le chemin d'accès (le% 1) et les requêtes proxy vers l'URL par défaut uniquement si le répertoire n'existe pas.En utilisant un proxy, le processus est transparent et l'utilisateur pense qu'il visite http://nonexistent.domainname.com , alors qu'il affiche en fait le contenu de http://default.domainname.com/ .
la source
Je suis également tombé sur cette question en recherchant Google pour le remplacement dynamique d'Apache2 vhost et la réponse de Luc m'a beaucoup aidé à résoudre mon problème, mais je veux toujours montrer ce que j'ai fait pour atteindre mes objectifs, principalement parce que cela impliquait des travaux supplémentaires et parce que je pense que cela pourrait être utile pour tous les futurs googleurs ...
Mes objectifs
foo.com
devrait servir le même contenu quewww.foo.com
foo.com
àwww.foo.com
moins que lewww
ne soit pas disponible, repli sur défaut par défautDNS
J'ai quelques domaines (et tous leurs sous-domaines) pointant vers mon VPS, par exemple:
Système de fichiers
J'ai les répertoires suivants, les domaines contiennent des répertoires avec les noms des sous-domaines disponibles, le répertoire www est requis, mais la configuration devrait être capable de faire face à la situation où il n'est pas présent. Localhost est utilisé comme solution de repli par défaut:
Les tests
Traduire mes objectifs en cas testables:
La solution
Cette utilisation:
mod_rewrite
,mod_proxy_http
et ofcoursemod_vhost_alias
.Comment cela marche-t-il? Trois hôtes virtuels sont définis:
localhost
L'hôte local sert par défaut. Toutes les demandes qui ne peuvent pas être résolues sont traitées par localhost. La configuration d'un lien symbolique depuis localhost vers l'un de vos domaines revient à configurer ce site par défaut.
sous-domaine
Le sous-domaine vhost prend toutes les demandes sous la forme de
*.*.*
. Par défaut, toutes les demandes sont traitées/domain.com/sub
comme défini parVirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
.se retirer:
Le premier
RewriteRule
prend en charge les domaines inconnus, par exemple.domain.com
n'existe pas, en procurant le proxy au site Web localhost.Le second
RewriteRule
sert également de proxy à localhost lorsquedomain.com/sub
lesdomain.com/www
répertoires et ne sont pas présents.Le troisième
RewriteRule
proxy àdomain.com
quanddomain.com/sub
n'existe pas. Nous savonsdomain.com/www
qu'il existe en raison du deuxième bloc de réécriture.bare.domain
Le vhost bare.domain prend les
*.*
demandes et les sert/domain.com/www
Ici, le
RewriteRule
proxy vers localhost quanddomain.com
oudomain.com/www
n'existe pas.^ $%. * !!!
J'ai eu du mal à enrouler ma tête autour de tous ces signes
$
et%
signes dans leRewriteCond
etRewriteRule
je vais donc expliquer à leur sujet ici:*
enServerAlias
sont juste des jokers.%n
dans leVirtualDocumentRoot
sont issus de l' interpolation du nom du document .%n
dans le second seRewriteCond
réfère aux sélections(.*)
du premierRewriteCond
, par exemple. les parties du domaine demandé.%n
dans leRewriteRule
faire aussi.$1
dans leRewriteRule
fait référence à la sélection(.*)
au début duRewriteRule
. Qui capture tout depuis le domaine jusqu'à l'?
URL de demande. Toute chaîne de requête est automatiquement ajoutée à l'URL parmod_proxy
.la source
Juste en le jetant là-bas, j'obtiens le même résultat (moins la redirection localhost) que RemyNL, mais en incluant également l'adresse IP lors de la connexion directe:
la source