Serveur HTTP Apache Version 2.4

Ce document est un complément à la documentation de référence du module
mod_rewrite. Il décrit comment créer des serveurs
virtuels dynamiquement configurés en utilisant
mod_rewrite.

Serveurs virtuels pour des noms d'hôtes arbitraires
Configuration dynamique de serveurs
virtuels via mod_rewrite
Utilisation d'un fichier de configuration
du serveur virtuel séparéNous voulons créer automatiquement un serveur virtuel pour tout nom d'hôte qui peut être résolu dans notre domaine, sans avoir à créer de nouvelle section VirtualHost.
Dans cet exemple, nous supposons que nous utilisons le nom d'hôte
www.SITE.example.com pour chaque
utilisateur, et que nous servons leur contenu depuis
/home/SITE/www.
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteCond "${lowercase:%{HTTP_HOST}}" "^www\.([^.]+)\.example\.com$"
RewriteRule "^(.*)" "/home/%1/www$1"
La directive RewriteMap interne tolower permet de
s'assurer que les noms d'hôtes utilisés seront tous en minuscules, de
façon à éviter toute ambiguité dans la structure des répertoires qui
doit être créée.
Les contenus des parenthèses utilisées dans une directive RewriteCond sont enregistrés dans les
références arrières %1, %2, etc..., alors que
les contenus des parenthèses utilisées dans une directive RewriteRule le sont dans les
références arrières $1, $2, etc...
Comme c'est le cas pour de nombreuses techniques discutées dans ce
document, mod_rewrite n'est vraiment pas la meilleure méthode pour
accomplir cette tâche. Vous devez plutôt vous tourner vers
mod_vhost_alias, car ce dernier sera bien plus à même
de gérer tout ce qui est au delà du domaine des fichiers statiques,
comme les contenus dynamiques et la résolution des alias.
mod_rewriteCet extrait du fichier apache2.conf permet d'obtenir
le même résultat que le premier exemple.
La première moitié est très similaire à la partie correspondante
ci-dessus, excepté quelques modifications requises à des fins de
compatibilité ascendante et pour faire en sorte que la partie
mod_rewrite fonctionne correctement ; la seconde moitié
configure mod_rewrite pour effectuer le travail
proprement dit.
Comme mod_rewrite s'exécute avant tout autre module
de traduction d'URI (comme mod_alias), il faut lui
ordonner explicitement d'ignorer toute URL susceptible d'être
traitée par ces autres modules. Et comme ces règles auraient sinon
court-circuité toute directive ScriptAlias, nous devons
faire en sorte que mod_rewrite déclare explicitement
ces correspondances.
# extrait le nom de serveur de l'en-tête Host:
UseCanonicalName Off
# journaux dissociables
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon
<Directory "/www/hosts">
# ExecCGI est nécessaire ici car on ne peut pas forcer l'exécution
# des CGI à la manière de ScriptAlias
Options FollowSymLinks ExecCGI
</Directory>
RewriteEngine On
# un nom de serveur extrait d'un en-tête Host: peut être dans n'importe
# quelle casse
RewriteMap lowercase int:tolower
## on s'occupe tout d'abord des documents normaux :
# permet à Alias "/icons/" de fonctionner - répéter pour les autres
RewriteCond "%{REQUEST_URI}" "!^/icons/"
# permet aux CGIs de fonctionner
RewriteCond "%{REQUEST_URI}" "!^/cgi-bin/"
# le coeur du traitement
RewriteRule "^/(.*)$" "/www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1"
## on s'occupe maintenant des CGIs - on doit forcer l'utilisation d'un
# gestionnaire
RewriteCond "%{REQUEST_URI}" "^/cgi-bin/"
RewriteRule "^/(.*)$" "/www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1" [H=cgi-script]
Cette construction utilise des fonctionnalités plus avancées de
mod_rewrite pour effectuer la traduction depuis le
serveur virtuel vers la racine des documents, à partir d'un fichier
de configuration séparé. Elle est plus souple mais nécessite une
configuration plus compliquée.
Le fichier vhost.map devrait ressembler à ceci :
www.client-1.example.com /www/clients/1
www.client-2.example.com /www/clients/2
# ...
www.client-N.example.com /www/clients/N
On doit ajouter à apache2.conf :
RewriteEngine on
RewriteMap lowercase int:tolower
# définit le fichier de correspondances
RewriteMap vhost "txt:/www/conf/vhost.map"
# on s'occupe des alias comme ci-dessus
RewriteCond "%{REQUEST_URI}" "!^/icons/"
RewriteCond "%{REQUEST_URI}" "!^/cgi-bin/"
RewriteCond "${lowercase:%{SERVER_NAME}}" "^(.+)$"
# on effectue ici la remise en correspondance à base de fichier
RewriteCond "${vhost:%1}" "^(/.*)$"
RewriteRule "^/(.*)$" "%1/docs/$1"
RewriteCond "%{REQUEST_URI}" "^/cgi-bin/"
RewriteCond "${lowercase:%{SERVER_NAME}}" "^(.+)$"
RewriteCond "${vhost:%1}" "^(/.*)$"
RewriteRule "^/cgi-bin/(.*)$" "%1/cgi-bin/$1" [H=cgi-script]