A quoi servent les Vhost ?
Les Vhost sont un outil qui permet à un serveur Apache de répondre à des requêtes de façon différentes en fonction du domaine ou sous-domaine concerné. Pour cela, les navigateurs WEB envoie dans les entêtes HTTP la spécification 'Host:' qui est implémentée par défaut dans HTTP1.1 et que l'on peut ajouter comme extension aux navigateurs HTTP1.0.
Les domaines http://www.domaine1.com et http://www.domaine2.com sont liés par les serveurs DNS à une adresse IP. On peut indiquer la même adresse IP pour deux domaines, à condition d'utiliser la méthode Virtual Host, sous peine d'avoir le même site répondant à deux URL différentes.
Ce mécanisme puissant permet de repartir les requêtes en fonction de nom de domaine sur plusieurs machines, de varier les consignes de sécurité, on simplement de personnaliser différents sous-domaines
Nous allons voir dans cet article les prérequis à son utilisation, puis comment installer les hôtes virtuels pour un domaine ou des sous-domaines, et enfin nous verrons comment se servir de cette différenciation.
1.0 - Configuration d'Apache
Afin de se servir des Vhosts, il va falloir activer le mod vhost_alias_module à l'aide de LoadModule qui se trouve aux alentours de la ligne 130 dans le fichier 'httpd.conf' Ce mode est normalement activé par défaut. Si ce n'est pas le cas, enlevez le # devant la ligne 'LoadModule vhost_alias_module modules/mod_vhost_alias.so' ou copiez la si elle n'existe pas. Pour ceux qui ne trouverait pas le fichier de configuration, il se trouve dans '%ApacheRoot%/conf/http.conf'.
Pour simplifier la mise en place des Hôtes Virtuels, nous faire cela dans un fichier annexe nommé 'Vhost.conf' a placer dans le répertoire '%ApacheRoot%/conf/'
Pour que le serveur aille verifier notre second fichier de configuration, il faudra ajouter à la fin de 'httpd.conf' la ligne :
#VHOSTS CONFIGURATION
include conf/vhost.conf
2.0 - Installer les hôtes virtuels
Le vhosts nécessite qu'on les déclare préalablement au moyen de 'NameVirtualHost host:port'.
Le tag 'port' est facultatif, par defaut, c'est celui indiqué au début de 'httpd.conf', le port 80 si vous ne l'avez pas changé.Sinon, indiquer le port d'écoute de l'hôte virtuel à cet emplacement. Le tag 'host' est obligatoire. Il doit être remplacé par l'adresse IP d'où proviendront les requêtes HTTP. On peut aussi écrire le nom hostname du vhost (ex: 'www.domaine1.com') ou alors simplement mettre une étoile (*) qui indique que le serveur Apache répondra aux requêtes provenant sur n'importe quel adresse ip.
Attention: il peut être interressant d'indiquer une adresse ip fixe dans le cas ou le serveur réponde aux requêtes venant d'une carte réseau reliée à l'Intranet, et d'une autre reliée à Internet. Sinon, il est préférable de placer une étoile (*).
si vous indiquez une adresse ip fixe, quand votre adresse ip changera, le serveur ne répondra plus aux requêtes du Vhost si vous ne le redemarrez pas.
si vous utilisez un domaine dynamique de type DynDns ou NoIp.com, sachez que Apache va transformer ce nom en adresse IP à son démarrage. Si l'IP du domaine change, Apache ne répondera plus.
Pour pouvoir utiliser les vhost avec les sous-domaine, il faut qu'un ping sur 'sous.domaine.com' renvoi la même adresse IP que 'domaine.com'
2.1 ? Les hôtes statics
Ensuite, nous allons écrire les balises '<VirtualHost host:port></VirtualHost>' dans le fichier 'vhost.conf' où host et port DEVRONT avoir été nommé par 'NameVirtualHost' pour éviter un mauvais fonctionnement des avertissements logs au démarrage d'Apache.
Dans le cas de plusieurs domaines, écrivez :
NameVirtualHost *
<VirtualHost *:80>
ServerAlias http://www.domaine1.com
DocumentRoot d:/web/www1/
</VirtualHost>
<VirtualHost *:80>
ServerAlias http://www.domaine2.com
DocumentRoot d:/web/www2/
</VirtualHost>
Ou pour plusieurs sous-domaines:
NameVirtualHost *
<VirtualHost *:80>
ServerAlias www1.domaine.com
DocumentRoot d:/web/www1/
</VirtualHost>
<VirtualHost *:80>
ServerAlias www2.domaine.com
DocumentRoot d:/web/www2/
</VirtualHost>
Pour tout les sous-domaines :
NameVirtualHost *
<VirtualHost *:80>
ServerAlias *.domaine.com
DocumentRoot d:/web/sous-domaines/
</VirtualHost>
La directive 'ServerAlias' indique à Apache que la configuration qui suit ne concernera que les demandes venant de domaine précisé. Dans le dernier cas, tout les requêtes concernant un sous-domaine de 'domaine.com' seront dirigés vers le 'd:/web/sous-domaines/'.
2.2 - Les hôtes dynamiques
Encore une fois, Apache n'a pas fait la moitié des choses. Dans les exemples précédents, l'ajout d'un domaine ou sous domaine nécessite la modification de notre fichier 'vhost.conf'. Une fonction très interréssante du mod vhost est 'VirtualDocumentRoot' qui permet ne spécifier le repertoire racine en fonction du nom d'hôte recherché.
NameVirtualHost *
<VirtualHost *:80>
ServerName nwh.ath.cx
ServerAlias *.nwh.ath.cx
VirtualDocumentRoot d:/web/%1/
</VirtualHost>
La directive 'ServerName' indique à quel hôte est rattaché le sous-domaine. Ecrivez simplement le nom de domaine.
Pour utiliser les racines virtuels, il est bon de s'avoir certains codes :
%0
nom complet de l'hôte: http://www.domaine.com
%1
1ère partie du domaine: www
%2
2ème partie du domaine: domaine
%3
3ème partie du domaine: com
%2.1
1ère lettre de la 2ème partie: d
%2.2
2ème lettre de la 2ème partie: o
%2+
2ème partie et suite: domaine.com
%2.-3
3ème lettre en partant de la fin de la 2ème partie: i
Classiquement, les gros hebergeurs comme free classent les sites web ainsi:
/usr/%1.1/%1.2/%1.3/%1
Ce qui pour le site 'triptika.free.fr' donne '/usr/t/r/i/triptika/'
Pour les sites personnels, le premier exemple de 'VirtualDocumentRoot' est le plus commun.
2.3? Des hôtes différents
Apache permet également d'utiliser une seule adresse IP mais plusieurs domaines correspondant derrière à plusieurs machine.
NameVirtualHost *
<VirtualHost *:80>
ServerAlias www1.domaine.com
DocumentRoot d:/web/www1/
</VirtualHost>
<VirtualHost *:80>
ServerAlias www2.domaine.com
VirtualDocumentRootIP d:/web/%0/
</VirtualHost>
Toutes les demandes concernant le sous-domaine www2.domaine.com seront redirigée dynamiquement vers le root d:/web.
Si on se connecte ici sur www2.domain.com avec l'ip 1.2.3.4, le root sera
d:/web/1/
3.0- Utilisation avancée des hôtes virtuels
Pour utiliser les capacités offertes par le module vhost, nous allons personnaliser chaque vhost.
NameVirtualHost *
<VirtualHost *:80>
ServerAdmin admin@domaine1.com
ServerAlias www1.domaine.com
DocumentRoot d:/web/www1/
RewriteEngine On
RewriteLog d:/web/log1/rewrite.log
SetOuputFiler INJECTION
InjectAfter '>'
InjectString '<b>Vous naviguez sur domaine1</b>'
</VirtualHost>
<VirtualHost *:80>
ServerAdmin admin@domaine2.com
ServerAlias www2.domaine.com
DocumentRoot d:/web/www2/
ErrorLog d:/web/log2/error.log
TransfertLog d:/web/log2/acces.log
php_value open_base_dir d:/web/www2/
</VirtualHost>
Une grande partie des directives de 'httpd.conf' peuvent être specialement definies entre deux balises '<Virtual Host>' ce qui vous permet de personnaliser en profondeur chaque hôte virtuel pour lui permettre ou non l'execution de script '.cgi', pour changer le repertoire de 'perl.exe', ou encore injecter du texte dans un des deux domaine (ici domaine1).
4.0 - Conclusion
Ce module permet à Apache d'offrir encore plus de fonctions très interressantes pour une organisation plus lisible des URL d'un domaine, ou encore pour sécurisé le serveur en le divisant en plusieurs 'sous-serveurs' n'ayant pas les mêmes droits. Tout ce qui a été présenté ici a été appris grace à la documentation apache et peut-être approfondit grâce à celle-ci


