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 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 ## 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 ^/(.*)$ %1/cgi-bin/$1 [H=cgi-script]