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.com
moins que le www
ne 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_http
et 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/sub
comme défini par VirtualDocumentRoot /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 lorsque domain.com/sub
les domain.com/www
répertoires et ne sont pas présents.
Le troisième RewriteRule
proxy à domain.com
quand domain.com/sub
n'existe pas. Nous savons domain.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 quand domain.com
ou domain.com/www
n'existe pas.
^ $%. * !!!
J'ai eu du mal à enrouler ma tête autour de tous ces signes $
et %
signes dans le RewriteCond
et RewriteRule
je 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 ServerAlias
sont juste des jokers.
- Les
%n
dans le VirtualDocumentRoot
sont issus de l' interpolation du nom du document .
- Le
%n
dans le second se RewriteCond
réfère aux sélections (.*)
du premier RewriteCond
, par exemple. les parties du domaine demandé.
- Le
%n
dans le RewriteRule
faire aussi.
- Le
$1
dans le RewriteRule
fait 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
.