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
- vhosting dynamique pour tous les domaines et sous-domaines pointant vers mon VPS
foo.com devrait servir le même contenu que www.foo.com
- repli des domaines inconnus vers une sorte de défaut
- repli pour les sous-domaines inconnus de à
foo.comà www.foo.commoins que le wwwne soit pas disponible, repli sur défaut par défaut
DNS
J'ai quelques domaines (et tous leurs sous-domaines) pointant vers mon VPS, par exemple:
- foo.com
- bar.com
- foobar.com
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:
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
Les tests
Traduire mes objectifs en cas testables:
- foo.com doit être servi à partir de foo.com/www
- www.foo.com doit être servi à partir de foo.com/www
- bar.foo.com devrait être servi à partir de foo.com/bar
- foo.foo.com doit être servi à partir de foo.com/www (foo.com/foo n'existe pas)
- bar.com doit être servi depuis localhost (bar.com/www n'existe pas)
- www.bar.com doit être servi depuis localhost (bar.com/www n'existe pas)
- foo.bar.com doit être servi à partir de bar.com/foo
- bar.bar.com doit être servi depuis localhost (bar.com/bar n'existe pas)
- foobar.com doit être servi depuis localhost (foobar.com n'existe pas)
- www.foobar.com doit être servi depuis localhost (foobar.com n'existe pas)
- foo.foobar.com doit être servi depuis localhost (foobar.com n'existe pas)
La solution
Cette utilisation: mod_rewrite, mod_proxy_httpet ofcourse 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>
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/subcomme défini par VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3.
se retirer:
Le premier RewriteRuleprend en charge les domaines inconnus, par exemple. domain.comn'existe pas, en procurant le proxy au site Web localhost.
Le second RewriteRulesert également de proxy à localhost lorsque domain.com/subles domain.com/wwwrépertoires et ne sont pas présents.
Le troisième RewriteRuleproxy à domain.comquand domain.com/subn'existe pas. Nous savons domain.com/wwwqu'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 RewriteRuleproxy vers localhost quand domain.comou domain.com/wwwn'existe pas.
^ $%. * !!!
J'ai eu du mal à enrouler ma tête autour de tous ces signes $et %signes dans le RewriteCondet RewriteRuleje vais donc expliquer à leur sujet ici:
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]
- L'
*en ServerAliassont juste des jokers.
- Les
%ndans le VirtualDocumentRootsont issus de l' interpolation du nom du document .
- Le
%ndans le second se RewriteCondréfère aux sélections (.*)du premier RewriteCond, par exemple. les parties du domaine demandé.
- Le
%ndans le RewriteRulefaire aussi.
- Le
$1dans le RewriteRulefait référence à la sélection (.*)au début du RewriteRule. Qui capture tout depuis le domaine jusqu'à l' ?URL de demande. Toute chaîne de requête est automatiquement ajoutée à l'URL par mod_proxy.