Serveur Apache HTTP Version 2.2

Apache > Serveur HTTP > Documentation > Version 2.2 > Serveurs virtuels

# Support Apache des serveurs virtuels par nom

Langues Disponibles: de | en | fr | ja | ko

Ce document décrit quand et comment utiliser des serveurs virtuels par nom.

### Voir aussi

- Support Apache des serveurs virtuels par IP
- Détails sur le fonctionnement des serveurs virtuels
- Configuration dynamique des hébergements virtuels de masse
- Exemples d'utilisations de VirtualHost
- Utilisation de la directive ServerPath

## Serveurs virtuels par nom vs. par IP

Les hébergements virtuels par IP utilisent l'adresse IP de la connexion afin de déterminer quel serveur virtuel doit répondre. Par conséquent, vous devez disposer d'adresses IP différentes pour chaque nom de domaine complet (FQDN) que vous hébergez. Avec un hébergement virtuel par nom, le serveur s'appuit sur les informations transmises par le client dans les en-têtes HTTP de ses requêtes. La technique présentée ici vous permet de disposer de serveurs virtuels différents partagés sur une même adresse IP.

L'hébergement virtuel par nom est habituellement plus simple, car il vous suffit de configurer votre serveur DNS pour que chaque domaine pointe sur l'adresse IP dont vous disposez, et de configurer votre serveur Apache HTTP afin qu'il reconnaisse ces domaines. Il réduit aussi la pénurie en adresses IP. Par conséquent, vous devriez utiliser l'hébergement virtuel par nom à moins d'avoir une raison spécifique de préférer l'hébergement virtuel par IP. Certaines de ces raisons vous sont exposées ci-après :

- Certains anciens navigateurs ne sont pas compatibles avec les serveurs virtuels par nom, car pour fonctionner, un client doit transmettre un champ d'en-tête HTTP Host. Cet en-tête est exigé pour HTTP/1.1, et peut être implémenté sur des navigateurs modernes HTTP/1.0 grâce à une extension. Si vous devez maintenir des clients obsolètes tout en utilisant l'hébergement virtuel par nom, il existe une technique qui est traitée à la fin de ce document.
- L'hébergement virtuel par nom ne peut pas être utilisé avec des serveurs sécurisés SSL à cause de la nature même du protocole SSL.
- Certains systèmes d'exploitation et équipements réseaux emploient des techniques de gestion de la bande passante qui ne peuvent pas différencier des domaines autrement que par des adresses IP séparées.

## Utilisation de serveurs virtuels par nom

Modules Apparentés | Directives Apparentées
--- | ---

- `core`

- `DocumentRoot`
- `NameVirtualHost`
- `ServerAlias`
- `ServerName`
- `ServerPath`
- `<VirtualHost>`

Pour utiliser des serveurs virtuels par nom, vous devez désigner l'adresse IP (et si possible le port) sur le serveur devant accepter les requêtes pour des domaines. Cette configuration utilise la directive `NameVirtualHost`. Dans un cas normal où n'importe quelle adresse IP peut être utilisée, vous pouvez ajouter `*` comme argument de la directive `NameVirtualHost`. Si vous prévoyez d'utiliser de multiples ports (comme l'emploi de SSL), vous devriez ajouter le port à cet argument tel que `*:80`. Notez que la simple mention d'une adresse IP dans une directive `NameVirtualHost` ne suffit pas à faire écouter le serveur sur cette IP. Consultez la page sur les liaisons pour plus de détails. Par ailleurs, chaque adresse IP spécifiée ici doit être associée avec une interface réseau sur le serveur.

L'étape suivante est la création d'une section `<VirtualHost>` pour chacun des serveurs à créer. L'argument de la directive `<VirtualHost>` doit être le même que celui de la directive `NameVirtualHost` (c'est-à-dire l'adresse IP ou `*` pour toutes les adresses). Dans chaque section `<VirtualHost>`, vous devez définir au minimum une directive `ServerName` pour désigner le serveur concerné et une directive `DocumentRoot` pour préciser l'emplacement sur le système de fichiers du contenu de ce serveur.

### Le serveur principal disparaît

Si vous ajoutez des serveurs virtuels à un serveur Web existant, vous devez également créer une section `<VirtualHost>` redéfinissant ce serveur existant. Les directives `ServerName` et `DocumentRoot` incluses dans ce serveur virtuel doivent être les mêmes que pour les directives globales `ServerName` et `DocumentRoot`. Positionnez ce serveur virtuel en premier dans le fichier de configuration pour en faire le serveur par défaut.

Par exemple, supposez que vous hébergez le domaine `www.domain.tld` et que vous souhaitez ajouter le serveur virtuel `www.otherdomain.tld` qui pointe sur la même adresse IP. Il vous suffit d'ajouter la configuration suivante à `httpd.conf` :

`NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
`

Autrement, vous pouvez spécifiez une adresse IP explicite à la place de `*` dans les deux directives `NameVirtualHost` et `<VirtualHost>`. Par exemple, cette méthode est utile si vous souhaitez faire tourner quelques serveurs virtuels par nom sur une même adresse IP, et d'autres, soit par IP, soit basés sur un autre jeu de serveurs virtuels par nom sur une autre adresse IP.

Plusieurs serveurs sont accessibles par plus d'un nom. Il suffit de placer la directive `ServerAlias` dans une section `<VirtualHost>`. Par exemple, dans la première section `<VirtualHost>` ci-dessus, la directive `ServerAlias` indique aux utilisateurs les autres noms permis pour accéder au même site Web :

`ServerAlias domain.tld *.domain.tld`

ainsi, toutes les requêtes portant sur un domaine `domain.tld` seront servies par le serveur virtuel `www.domain.tld`. Les caractères joker `*` et `?` peuvent être utilisés pour les correspondances. Bien entendu, vous ne pouvez pas inventer des noms et les placer dans une directive `ServerName` ou `ServerAlias`. Tout d'abord, votre serveur DNS doit être correctement configuré pour lier ces noms à une adresse IP associée avec votre serveur.

Finalement, vous pouvez affiner la configuration des serveurs virtuels en plaçant d'autres directives à l'intérieur des sections `<VirtualHost>`. La plupart des directives peut être placée dans ces sections en y changeant seulement la configuration du serveur virtuel associé. Pour déterminer si une directive particulière est permise, consultez la page de contexte. Le jeu de directives configurées dans le contexte du serveur principal (en dehors de toutes sections `<VirtualHost>`) sera utilisé seulement s'il n'y a pas de configuration contraire par un serveur virtuel.

Maintenant, lorsqu'une requête arrive, le serveur va d'abord tester si elle utilise une adresse IP qui correspond à `NameVirtualHost`. Si c'est le cas, il regardera chaque section `<VirtualHost>` avec l'adresse correspondante et essaiera d'en trouver une où le nom de domaine requis correspond à `ServerName` ou `ServerAlias`. S'il en trouve une, il utilisera sa configuration pour le serveur. Si aucun serveur virtuel ne correspond, alors le premier serveur virtuel listé dont l'adresse IP correspond sera employé.

En conséquence, le premier serveur virtuel listé est le serveur virtuel default. La directive `DocumentRoot` du serveur principal ne sera jamais employée lorsqu'une adresse IP correspond dans une directive `NameVirtualHost`. Si vous ne voulez pas avoir de configuration spéciale pour les requêtes qui ne sont pas attachées à un serveur virtuel en particulier, mettez cette configuration dans une section `<VirtualHost>` que vous placerez en premier dans le fichier de configuration.

## Compatibilité avec les navigateurs anciens

Comme mentionné plus tôt, certains clients ne transmettent pas les données nécessaires pour le bon fonctionnement des serveurs virtuels. Ces clients recevront toujours les pages du premier serveur virtuel listé pour cette adresse IP (le serveur virtuel par nom primaire).

### De combien plus anciens ?

Veuillez noter que quand nous disons plus anciens, nous disons vraiment plus anciens. Vous seriez malchanceux de rencontrer de tels navigateurs encore utilisés de nos jours. Toutes les versions actuelles des navigateurs transmettent leur en-tête `Host` comme exigé par les serveurs virtuels par nom.

Il existe une solution avec la directive `ServerPath`, bien que légèrement complexe :

Exemple de configuration :

`NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.domain.tld
ServerPath /domain
DocumentRoot /web/domain
</VirtualHost>
`

Qu'est-ce que cela signifie ? Il signifie qu'une requête pour tout URI qui commence par "`/domain`" sera servie par le serveur virtuel `www.domain.tld`. Ainsi, les pages sont accessibles à `http://www.domain.tld/domain/` pour tous les clients, bien que ceux qui transmettent un en-tête `Host:` peuvent également y accéder à `http://www.domain.tld/`.

Pour rendre cette technique fonctionnelle, mettez un lien dans votre serveur virtuel primaire vers `http://www.domain.tld/domain/`. Ensuite, dans les pages de ce serveur virtuel, assurez vous ne n'utiliser que des liens relatifs (par exemple, "`file.html`" ou "`../icons/image.gif`") ou des liens contenant le préfixe `/domain/` (par exemple, "`http://www.domain.tld/domain/misc/file.html`" ou "`/domain/misc/file.html`").

Cela requiert un peu de discipline, mais si vous suivez cette ligne de conduite, vous serez assuré que vos pages s'afficheront dans tous les navigateurs, nouveaux et anciens.

Langues Disponibles: de | en | fr | ja | ko