Serveur Apache HTTP 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
.
mod_rewrite
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_rewrite
Cet extrait du fichier httpd.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 à httpd.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]