Apache HTTP Server permet de créer des hôtes virtuels (aussi dénommés « serveurs virtuels »), c'est-à-dire des configurations différentes suivant le port, l'IP ou même le nom de domaine employé pour la connexion. Plus simplement, cela permet d'héberger des sites web différents de façon totalement transparente pour l'utilisateur sur une même machine.
Dans cette configuration, les différents hôtes seront différenciés par le nom de domaine utilisé.
Lors des requêtes faites au serveurs HTTP, les navigateurs envoient un certain nombre d'informations appelées en-têtes, celles-ci permettent au serveur de renvoyer une réponse « personnalisée » pour le client : langue, utilisation d'algorithmes de compression (gzip par exemple), …
Avec HTTP 1.0, une en-tête HOST est apparue1), elle contient le nom de domaine employé pour accéder au site. Apache se base sur cette en-tête pour déterminer quelle configuration employer.
Les hôtes virtuels sont définis dans la configuration d'Apache dans des sections VirtualHost.
Exemple de configuration où l'on créé deux hôtes virtuels pour une même adresse, www.domain.tld et www.domain2.tld :
NameVirtualHost 127.0.0.1:80 <VirtualHost 127.0.0.1:80> ServerName www.domain.tld ServerAlias domain.tld *.domain.tld DocumentRoot /www/domain </VirtualHost> <VirtualHost 127.0.0.1:80> ServerName www.domain2.tld ServerAlias domain2.tld *.domain2.tld DocumentRoot /www/domain </VirtualHost>
La directive NameVirtualHost précise à Apache qu'il va y avoir des hôtes virtuels nommés pour l'adresse 127.0.0.1 port 80, on aurait pu mettre « * » à la place de l'adresse ou à la place du port pour spécifier « n'importe lequel », ou même remplacer tout le paramètre par « * » pour que les entrées soient valides pour toutes adresses et tous ports.
Ensuite, la balise <VirtualHost 127.0.0.1:80> ouvre une section définissant un hôte virtuel nommé pour l'adresse 127.0.0.1:80 (le paramètre doit-être identique à celui de NameVirtualHost).
ServerName va définir le nom d'hôte : c'est sur ce nom qu'Apache va effectuer la correspondance, ServerAlias créé des alias pour le server et enfin DocumentRoot définit le répertoire racine du serveur.
Si vous avez un message d'avertissement ressemblant à ça « NameVirtualHost domain.tld:port has no VirtualHosts » c'est probablement parce que vous avez plusieurs directives NameVirtualHost identiques : ce n'est pas grave, cela devrait fonctionner quand même, c'est juste que ce n'est pas strictement correct selon le manuel d'Apache.
Création de deux hôtes disponibles sur l'adresse de 192.168.0.1:* : www.domain1.tld et www.domain2.tld, ainsi que de deux hôtes sur l'adresse 192.168.0.2:* : www1.domain3.tld et www2.domain3.tld.
NameVirtualHost 192.168.0.1:* NameVirtualHost 192.168.0.2:* <VirtualHost 192.168.0.1:*> ServerName www.domain1.tld DocumentRoot /www/www.domain1.tld </VirtualHost> <VirtualHost 192.168.0.1:*> ServerName www.domain2.tld ServerAlias domain2.tld *.domain2.tld DocumentRoot /www/www.domain2.tld </VirtualHost> <VirtualHost 192.168.0.2:*> ServerName www.domain3.tld DocumentRoot /www/www.domain3.tld </VirtualHost> <VirtualHost 192.168.0.2:*> ServerName www2.domain3.tld DocumentRoot /www/www2.domain3.tld </VirtualHost>