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