Serveur Apache HTTP Version 2.2
Ce document est un compl�ment � la documentation de r�f�rence du module
mod_rewrite
. Il d�crit les concepts de base dont la
connaissance est n�cessaire pour l'utilisation de
mod_rewrite
. D'autres documents entrent d'avantage dans
les d�tails, mais celui-ci devrait aider le d�butant � se mouiller les
pieds.
Le module Apache mod_rewrite
est un module puissant
et sophistiqu� qui permet la r��criture des URLs. Gr�ce � lui, vous
pouvez effectuer quasiment tous les types de r��criture d'URLs dont vous
avez besoin. Il est cependant assez complexe, et peut para�tre
intimidant au d�butant. Certains ont aussi tendance � traiter les
r�gles de r��criture comme des incantations magiques, et � les utiliser
sans vraiment comprendre leur mani�re d'agir.
Ce document a pour ambition d'�tre suffisamment explicite pour permettre la compr�hension, et non la copie en aveugle, de ce qui suit.
Gardez � l'esprit que de nombreuses t�ches de manipulation d'URLs
courantes n'ont pas besoin de la puissance et de la complexit� de
mod_rewrite
. Pour les t�ches simples, voir
mod_alias
et la documentation sur la Mise en correspondance des URLs avec le
syst�me de fichiers.
Enfin, avant de proc�der, assurez-vous d'avoir configur� le niveau de
journalisation de mod_rewrite
� un des niveaux de trace
via la directive LogLevel
. Bien que
ceci risque de vous submerger sous une �norme quantit� d'informations,
le d�bogage des probl�mes avec la configuration de
mod_rewrite
est � ce prix car vous verrez alors
exactement comment chaque r�gle est trait�e.
mod_rewrite utilise le vocabulaire des Expressions rationnelles compatibles Perl. Ce document n'a pas pour pr�tention d'�tre une r�f�rence d�taill�e des expressions rationnelles. A cet effet, nous recommandons les pages de manuel de PCRE, la page de manuel des expressions rationnelles Perl, et l'ouvrage Mastering Regular Expressions, by Jeffrey Friedl.
Dans ce document, nous avons pour but de vous fournir suffisamment de
vocabulaire des expressions rationnelles pour vous mettre le pied �
l'�trier, sans �tre d�pass�, en esp�rant que les directives RewriteRule
vous appara�tront comme des
formules scientifiques, plut�t que comme des incantations magiques.
Vous trouverez dans ce qui suit le minimum � conna�tre pour �tre en
mesure d'�crire des expressions rationnelles et des r�gles RewriteRule
. Ceci ne repr�sente
certainement pas un vocabulaire des expressions rationnelles complet,
mais constitue un bon point de d�part, et devrait vous aider �
d�chiffrer les expressions rationnelles simples, et � �crire vos propres
expressions.
Motif | Signification | Exemple |
---|---|---|
. | Correspond � tout caract�re unique | c.t correspondra � cat ,
cot , cut , etc. |
+ | R�p�te le caract�re de correspondance pr�c�dent une ou plusieurs fois | a+ correspond � a , aa ,
aaa , etc. |
* | R�p�te le caract�re de correspondance pr�c�dent z�ro ou plusieurs fois | a* correspond � tout ce � quoi correspond
a+ , mais correspond aussi � la cha�ne vide. |
? | Rend la correspondance optionnelle. |
colou?r correspondra � color et colour . |
^ | Appel� ancrage, correspond au d�but de la cha�ne | ^a correspond � une cha�ne qui commence par
a |
$ | L'autre ancrage, correspond � la fin de la cha�ne. | a$ correspond � une cha�ne qui se termine par
a . |
( ) | Regroupe plusieurs caract�res en une seule entit�, et conserve une correspondance � des fins d'utilisation dans une r�f�rence arri�re. | (ab)+
correspond � ababab - � savoir, le +
s'applique au groupe.
Pour plus de d�tails sur les r�f�rences arri�res, voir ci-dessous. |
[ ] | Une classe de caract�res - correspond � un des caract�res de la classe | c[uoa]t correspond � cut ,
cot ou cat . |
[^ ] | N�gation de la classe de caract�res - correspond � tout caract�re ne faisant pas partie de la classe | c[^/]t correspond � cat ou
c=t mais pas � c/t |
Avec mod_rewrite
, le caract�re !
peut
pr�fixer une expression rationnelle afin d'en exprimer la n�gation.
Autrement dit, une cha�ne ne correspondra que si elle ne correspond pas
� l'expression situ�e apr�s le !
.
Vous devez vous souvenir d'une chose importante : chaque fois
que vous utilisez des parenth�ses dans un Mod�le ou dans
un des mod�les de conditions, des r�f�rences arri�res
sont cr��es en interne et peuvent �tre rappel�es via les cha�nes
$N
et %N
(voir ci-dessous). Ces
r�f�rences sont disponibles lors de la cr�ation des cha�nes de
Substitution et des Cha�nes de test comme indiqu� dans les chapitres suivants.
La figure 1
montre � quels endroits les r�f�rences arri�res sont suceptibles
d'�tre d�velopp�es, et illustre le flux des comparaisons
effectu�es par les r�gles RewriteRule et
RewriteCond. Nous verrons comment utiliser ces r�f�rences arri�res
dans les chapitres suivant, donc ne vous effrayez pas si cela vous
para�t un peu compliqu� au premier abord.
Figure 1 : Le cheminement d'une r�f�rence arri�re �
travers une r�gle.
Dans cet exemple, une requ�te pour /test/1234
sera
traduite en
/admin.foo?page=test&id=1234&host=admin.example.com
.
Une r�gle de r��criture RewriteRule
est constitu�e de trois
arguments s�par�s par des espaces. Les arguments sont :
Le Mod�le est une expression rationnelle. Pour la premi�re r�gle de r��criture ou jusqu'� ce qu'une substitution intervienne, elle est tout d'abord compar�e au chemin de l'URL de la requ�te entrante (la partie situ�e apr�s le nom d'h�te mais avant tout point d'interrogation qui indique le d�but d'une cha�ne de requ�te), ou dans un contexte de r�pertoire, au chemin de la requ�te relatif au r�pertoire pour lequel la r�gle a �t� d�finie. Lorsqu'une substitution a �t� effectu�e, les r�gles suivantes s'appliquent � la valeur de substitution.
Figure 2 : Syntaxe de la directive RewriteRule.
La cha�ne de Substitution peut, quant � elle, �tre de trois types :
RewriteRule ^/jeux.* /usr/local/jeux/web
Ceci peut faire correspondre une requ�te � toute localisation voulue de
votre syst�me de fichiers, un peu comme la directive Alias
.
RewriteRule ^/foo$ /bar
Si la directive DocumentRoot
a
pour valeur /usr/local/apache2/htdocs
, cette r�gle va faire
correspondre les requ�tes pour http://example.com/foo
au
chemin /usr/local/apache2/htdocs/bar
.
RewriteRule ^/produits/vues$ http://site2.example.com/voirproduits.html [R]
Ceci informe le client qu'il doit effectuer une nouvelle requ�te vers l'URL sp�cifi�e.
La cha�ne de Substitution peut aussi contenir des r�f�rences arri�res vers des parties du chemin d'URL entrant correspondant au Mod�le. Consid�rons ce qui suit :
RewriteRule ^/produits/(.*)/view$ /var/web/produitsdb/$1
La variable $1
sera remplac�e par tout texte
correspondant � l'expression situ�e entre les parenth�ses dans le
Mod�le. Par exemple, une requ�te pour
http://example.com/produits/r14df/vue
correspondra au
chemin /var/web/produitsdb/r14df
.
S'il y a plus d'une expression entre parenth�ses, elle seront
accessibles selon leur ordre d'apparition via les variables
$1
, $2
, $3
, etc...
Le comportement d'une r�gle RewriteRule
peut �tre modifi� par la
pr�sence d'un ou plusieurs drapeaux en fin de r�gle. Par exemple, les
conditions de correspondance d'une r�gle peuvent �tre rendues
insensibles � la casse par la pr�sence du drapeau [NC]
:
RewriteRule ^puppy.html petitchien.html [NC]
Pour une liste des drapeaux disponibles, leurs significations, et des exemples, voir le document Drapeaux de r��criture.
Il est possible d'utiliser une ou plusieurs directives RewriteCond
pour restreindre les types
de requ�tes auxquelles devra s'appliquer la r�gle RewriteRule
suivante. Le premier
argument est une variable d�crivant une caract�ristique de la requ�te,
le second argument est une expression rationnelle
qui doit correspondre � la variable, et un troisi�me argument optionnel
est une liste de drapeaux qui modifient la mani�re dont la
correspondance est �valu�e.
Figure 3 : Syntaxe de la directive RewriteCond
Par exemple, pour renvoyer toutes les requ�tes en provenance d'une certaine tranche d'adresses IP vers un autre serveur, vous pouvez utiliser :
RewriteCond %{REMOTE_ADDR} ^10\.2\.
RewriteRule (.*) http://intranet.example.com$1
Si vous sp�cifiez plus d'une directive RewriteCond
, ces directives
doivent toutes �tre satisfaites pour que la r�gle RewriteRule
suivante s'applique. Par exemple,
pour interdire les requ�tes qui contiennent le mot "hack" dans la cha�ne
de requ�te, sauf si elles contiennent aussi un cookie contenant le mot
"go", vous pouvez utiliser :
RewriteCond %{QUERY_STRING} hack
RewriteCond %{HTTP_COOKIE} !go
RewriteRule .* - [F]
Notez que le point d'exclamation indique une correspondance n�gative ; ainsi, la r�gle n'est appliqu�e que si le cookie ne contient pas "go"
Les correspondances dans les expressions rationnelles contenues dans
les directives RewriteCond
peuvent constituer des parties de la cha�ne de Substitution
de la r�gle RewriteRule
via
les variables %1
, %2
, etc... Par
exemple, ce qui suit va diriger la requ�te vers un r�pertoire diff�rent
en fonction du nom d'h�te utilis� pour acc�der au site :
RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/(.*) /sites/%1/$1
Si la requ�te concernait http://example.com/foo/bar
,
alors %1
contiendrait example.com
et
$1
contiendrait foo/bar
.
La directive RewriteMap
permet en quelque sorte de faire appel � une fonction externe pour
effectuer la r��criture � votre place. Tout ceci est d�crit plus en
d�tails dans la Documentation
suppl�mentaire sur RewriteMap.
La r��criture est en g�n�ral d�finie au niveau de la configuration du
serveur principal (en dehors de toute section <Directory>
) ou dans une section <VirtualHost>
. Il s'agit l� de la
mani�re la plus simple de mettre en oeuvre la r��criture et nous la
recommandons. Il est possible, cependant, de mettre en oeuvre la
r��criture au sein d'une section <Directory>
ou d'un fichier .htaccess
; ce type de
configuration est cependant plus complexe. Cette technique est appel�e
r��criture par r�pertoire.
La principale diff�rence avec les r��critures au niveau du serveur r�side
dans le fait que le pr�fixe du chemin du r�pertoire contenant le fichier
.htaccess
est supprim� avant la mise en correspondance dans
la r�gle RewriteRule
. De
plus, on doit utiliser la directive RewriteBase
pour s'assurer que la
requ�te est correctement mise en correspondance.