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