Les hôtes virtuels du serveur web Apache permettent d'héberger plusieurs domaines sur la même IP. Le champ Host: de la requête HTTP détermine l'hôte virtuel qui devra traiter la requête.
La génération automatique des domaines est utile si les <VirtualHost> sont nombreux et sensiblement les mêmes, par exemple :
NameVirtualHost 111.22.33.44 <VirtualHost 111.22.33.44> ServerName www.customer-1.com DocumentRoot /www/hosts/www.customer-1.com/docs ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin </VirtualHost> <VirtualHost 111.22.33.44> ServerName www.customer-2.com DocumentRoot /www/hosts/www.customer-2.com/docs ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin </VirtualHost> <VirtualHost 111.22.33.44> ServerName www.customer-N.com DocumentRoot /www/hosts/www.customer-N.com/docs ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin </VirtualHost>
L'idée de base est de remplacer la configuration <VirtualHost> statique par un mécanisme dynamique. Ainsi,
Un hôte virtuel est défini par :
Pour cela, cette information est insérée dynamiquement dans le chemin d'accès du fichier utilisé pour satisfaire la demande.
Il faut activer le module mod_vhost_alias par :
USER@MACHINE:~$ sudo a2enmod vhost_alias
Pour rendre dynamique un hôte virtuel, il faut modifier :
...
# obtenir le nom du serveur à partir de l'en-tête Host:
UseCanonicalName Off
# ce format de journal peut être divisé par hôte virtuel sur la base du premier champ
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
# inclure le nom du serveur dans les noms de fichiers
VirtualDocumentRoot /www/hosts/%0/docs
VirtualScriptAlias /www/hosts/%0/cgi-bin
...
Le nom du serveur qui est inséré dans le nom de fichier est déduit de l'adresse IP de l'hôte virtuel.
...
# obtenir le nom du serveur à partir de l'en-tête Host:
UseCanonicalName Off
# ce format de journal peut être divisé par hôte virtuel sur la base du premier champ
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
# include part of the server name in the filenames
VirtualDocumentRoot /www/hosts/%2/docs
# single cgi-bin directory
ScriptAlias /cgi-bin/ /www/std-cgi/
# obtenir le nom du serveur à partir du reverse DNS de l'adresse IP
UseCanonicalName DNS
# inclure l'adresse IP dans les journaux afin qu'ils puissent être scindés
LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
# inclure l'adresse IP dans les noms de fichiers
VirtualDocumentRootIP /var/www/html/hosts/%0/docs
VirtualScriptAliasIP /var/www/html/hosts/%0/cgi-bin
Par exemple, une adresse IP pour les pages d'accueil des clients les et un autre pour les commerciaux avec :
UseCanonicalName Off
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
<Directory /var/www/html/commercial>
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/html/homepages>
Options FollowSymLinks
AllowOverride None
</Directory>
<VirtualHost 111.22.33.44>
ServerName www.commercial.isp.com
CustomLog logs/access_log.commercial vcommon
VirtualDocumentRoot /var/www/html/commercial/%0/docs
VirtualScriptAlias /var/www/html/commercial/%0/cgi-bin
</VirtualHost>
<VirtualHost 111.22.33.45>
ServerName www.homepages.isp.com
CustomLog logs/access_log.homepages vcommon
VirtualDocumentRoot /var/www/html/homepages/%0/docs
ScriptAlias /cgi-bin/ /var/www/html/std-cgi/
</VirtualHost>
127.0.0.1 doc.localhost
ServerAdmin administrateur@domaine.fr UseCanonicalName Off LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon CustomLog logs/access_log vcommon <VirtualHost *:80> ServerName doc.localhost DocumentRoot /home/<USER>/www/doc </VirtualHost>
ServerAdmin administrateur@domaine.fr UseCanonicalName Off LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon CustomLog logs/access_log vcommon <VirtualHost *:80> ServerName doc.mondomaine.com DocumentRoot /home/<USER>/www/doc </VirtualHost>
<VirtualHost *:80> ServerName localhost ServerAlias *.localhost # DocumentRoot /home/nicolas/www VirtualDocumentRoot /home/nicolas/www/%-2 </VirtualHost> #<VirtualHost *:80> # ServerName cloud.localhost # DocumentRoot /home/nicolas/www/cloud #</VirtualHost>
mondomaine.tld/
|-- config
| |-- auth
| `-- ssl
|-- logs
| |-- access.log
| `-- error.log
`-- www
|-- subdir1
|-- subdir2
|-- subdir3
`-- subdir4
# Configuration HTTP du domaine mondomaine.com
<VirtualHost *:80>
ServerName mondomaine.com
ServerAlias *.mondomaine.com
ServerAlias *.mondomaine.net
ServerAlias *.mondomaine.fr
ServerAlias *.mondomaine.eu
ServerAlias *.mondomaine.info
ServerAdmin webmaster@mondomaine.com
DocumentRoot /var/www/mondomaine.com/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/mondomaine.com/www/>
Options FollowSymLinks
AllowOverride none
Order allow,deny
allow from all
</Directory>
########## Log Directives
ErrorLog /var/www/mondomaine.com/logs/error.log
CustomLog /var/www/mondomaine.com/logs/access.log vhost_combined
</VirtualHost>
# Configuration HTTPS du domaine mondomaine.com
<VirtualHost *:443>
ServerName mondomaine.com
ServerAlias *.mondomaine.com
ServerAlias *.mondomaine.net
ServerAlias *.mondomaine.fr
ServerAlias *.mondomaine.eu
ServerAlias *.mondomaine.info
ServerAdmin webmaster@mondomaine.com
DocumentRoot /var/www/mondomaine.com/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/mondomaine.com/www/>
Options FollowSymLinks
AllowOverride none
Order allow,deny
allow from all
</Directory>
########## Log Directives
ErrorLog /var/www/mondomaine.com/logs/error.log
CustomLog /var/www/mondomaine.com/logs/access.log vhost_combined
########## SSL Directives
SSLEngine on
SSLCertificateFile /var/www/mondomaine.com/config/mondomaine.com.pem
SSLCertificateKeyFile /var/www/mondomaine.com/config/mondomaine.com.pem
SSLCACertificateFile /var/www/mondomaine.com/config/ca.crt
</VirtualHost>
USER@MACHINE:~$ sudo a2ensite mondomaine.com
USER@MACHINE:~$ /etc/init.d/apache restart
NameVirtualHost *:80
NameVirtualHost *:443
<VirtualHost *:80>
RewriteEngine on
RewriteRule ^/(.*) http://www.mondomaine.com/$1 [R=301,L]
</VirtualHost>
On redirige tout le trafic vers le “vrai” domaine. Par exemple, toute requête vers http://ip_du_serveur, traitée par ce vhost, sera visiteur redirigée vers http://www.mondomaine.com/
USER@MACHINE:~$ a2ensite 0000-default