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 l'utilisation de la
directive RewriteMap
, et
fournit des exemples pour chacun des diff�rents types de
RewriteMap
.
La directive RewriteMap
d�finit une fonction externe qui peut �tre appel�e depuis une
directive RewriteRule
ou
RewriteCond
pour
accomplir une r��criture trop compliqu�e, ou trop sp�cialis�e pour
�tre effectu�e � partir d'expressions rationnelles. Vous trouverez
ci-dessous les diff�rents types disponibles pour la source de
donn�es, ceux-ci �tant par ailleurs �num�r�s dans la documentation de
r�f�rence de RewriteMap
.
La syntaxe de la directive RewriteMap
est la suivante
:
RewriteMap MapName MapType:MapSource
L'argument MapName est un nom arbitraire que vous associez � la table de correspondances, et que vous pourrez utilisez par la suite dans les directives de r��criture. Les recherches dans la table de correspondance s'effectuent en respectant cette syntaxe :
${
nom-map :
cl�-recherche
}
${
nom-map :
cl�-recherche |
DefaultValue }
Lorsque cette syntaxe est employ�e, la table de correspondances nom-map est consult�e et la cl� cl�-recherche recherch�e. Si la cl� est trouv�e, la fonction de recherche dans la table de correspondance est remplac�e par SubstValue, ou par DefaultValue dans le cas contraire, ou par la cha�ne vide si aucune DefaultValue n'a �t� sp�cifi�e.
Par exemple, vous pouvez d�finir une directive
RewriteMap
comme suit :
RewriteMap examplemap txt:/path/to/file/map.txt
Vous pourrez par la suite utiliser cette table de correspondances
dans une directive RewriteRule
comme suit :
RewriteRule ^/ex/(.*) ${examplemap:$1}
Il est possible de sp�cifier une valeur par d�faut qui sera utilis�e si la recherche dans la table de correspondances est infructueuse :
RewriteRule ^/ex/(.*) ${examplemap:$1|/not_found.html}
Vous ne pouvez utiliser la directive RewriteMap
ni dans
les sections <Directory>, ni dans les fichiers
.htaccess
. Vous devez d�clarer la table de correspondances
au niveau du serveur principal ou dans un contexte de serveur virtuel.
En revanche, si vous ne pouvez pas d�clarer la table dans une section
<Directory> ou dans un fichier .htaccess
, vous
pourrez y faire r�f�rence dans ces contextes, une fois cette table
cr��e.
Les sections suivantes d�crivent les diff�rents types de tables de correspondances type-map disponibles, et fournissent des exemples pour chacun d'entre eux.
Lorsqu'un type-map txt
est utilis�, la source-map
est un chemin du syst�me de fichiers vers un fichier de
correspondances au format texte, contenant sur chaque ligne une
paire cl�/valeur s�par�es par un espace. Il est possible d'ins�rer
des commentaires sous la forme de cha�nes commen�ant par le caract�re
'#'.
Voici un exemple d'entr�es valides dans un fichier de correspondances :
# Ligne de commentaires
cl� valeur-substitution
cl� valeur-substitution # commentaire
Lorsque la table de correspondance fait l'objet d'une recherche, la valeur sp�cifi�e est recherch�e dans le premier champ, et si elle est trouv�e, la valeur de substitution est renvoy�e.
Par exemple, nous pourrions utiliser un fichier de correspondances pour traduire des noms de produits en identifiants produits pour obtenir des URLs plus simples � m�moriser, en utilisant la recette suivante :
Product to ID configuration
RewriteMap product2id txt:/etc/apache2/productmap.txt RewriteRule ^/product/(.*) /prods.php?id=${product2id:$1|NOTFOUND} [PT]
Nous supposons ici que le script prods.php
sait quoi
faire lorsqu'il re�oit un argument id=NOTFOUND
, dans
le cas o� le produit ne se trouve pas dans la table de
correspondances.
Le fichier /etc/apache2/map-produit.txt
contient ce
qui suit :
##
## map-produit.txt - Fichier de correspondances Produit - Identifiant
##
TELEVISION 993
STEREO 198
CANNE-A-PECHE 043
BALLON-BASKET 418
TELEPHONE 328
Ainsi, lorsqu'une requ�te pour
http://example.com/produit/TELEVISION
arrive, elle est
transform�e en interne en /prods.php?id=993
.
.htaccess
, vous devrez supprimer le
slash de d�but dans le mod�le de r��criture afin que ce dernier
puisse correspondre � toute URL :
RewriteRule ^product/(.*) /prods.php?id=${product2id:$1|NOTFOUND} [PT]
Les cl�s de recherche sont mises en cache par httpd jusqu'� ce que
le mtime
(date de modification) du fichier de
correspondances soit modifi�, ou que le serveur httpd soit
red�marr�, ce qui am�liore les performances pour les tables de
correspondances consult�es par de nombreuses requ�tes.
Lorsque le type-map sp�cifi� est rnd
, la source est
un chemin du syst�me de fichiers vers un fichier de correspondances
au format texte dont chaque ligne contient une cl�, et une ou
plusieurs valeurs s�par�es par le caract�re |
. Si une
cl� convient, une des valeurs correspondantes sera choisie de
mani�re al�atoire.
Par exemple, vous pouvez utiliser le fichier de correspondances et les directives suivants pour impl�menter une r�partition de charge al�atoire entre plusieurs serveurs d'arri�re-plan, par l'interm�diaire d'un mandataire inverse. Les images sont envoy�es vers un des serveurs de l'ensemble 'statique', tandis que tout le reste est envoy� vers un des serveurs de l'ensemble 'dynamique'.
##
## map.txt -- table de r��criture
##
statique www1|www2|www3|www4
dynamique www5|www6
Directives de configuration
RewriteMap servers rnd:/path/to/file/map.txt RewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1 [NC,P,L] RewriteRule ^/(.*) http://${servers:dynamic}/$1 [P,L]
Ainsi, lorsqu'une image est demand�e et que la premi�re r�gle
convient, RewriteMap
recherche la cha�ne
statique
dans le fichier de correspondances qui
renvoie un des noms de serveurs sp�cifi�s de mani�re al�atoire,
ce dernier �tant utilis� dans la cible de la r�gle
RewriteRule
.
Si vous voulez qu'un des serveurs soit plus souvent sollicit� que les autres (par exemple s'il poss�de plus de m�moire, et peut donc traiter d'avantage de requ�tes), sp�cifiez-le plusieurs fois dans la liste des serveurs.
statique www1|www1|www2|www3|www4
Lorsque le type-map dbm
est utilis�, la source est
un chemin du syst�me de fichiers vers un fichier de donn�es DBM
contenant des paires cl�/valeur permettant d'effectuer la
correspondance. Le fonctionnement est identique � celui du type-map
txt
, mais beaucoup plus rapide car un fichier DBM est
index�, alors qu'un fichier texte ne l'est pas. L'acc�s � la cl�
recherch�e est donc plus rapide.
Vous pouvez �ventuellement sp�cifier un type dbm particulier :
RewriteMap examplemap dbm=sdbm:/etc/apache/mapfile.dbm
Ce type peut �tre choisi parmi sdbm, gdbm, ndbm ou db. Il est cependant recommand� d'utiliser l'utilitaire httxt2dbm fourni avec le serveur HTTP Apache, car il utilise la biblioth�que DBM appropri�e, � savoir celle qui a �t� utilis�e lors de la compilation de httpd.
Pour cr�er un fichier dbm, cr�ez tout d'abord un fichier de
correspondances au format texte comme d�crit dans la section txt. Traitez ensuite ce fichier avec
httxt2dbm
:
$ httxt2dbm -i fichier-map.txt -o fichier-map.map
Vous pouvez alors faire r�f�rence au fichier obtenu dans votre
directive RewriteMap
:
RewriteMap mapname dbm:/etc/apache/mapfile.map
Notez qu'avec certains types dbm, plusieurs fichiers poss�dant le
m�me nom de base sont cr��s. Par exemple, vous pouvez obtenir deux
fichiers nomm�s fichier-map.map.dir
et
fichier-map.map.pag
. Ceci est tout � fait normal, et vous
ne devez utiliser que le nom de base fichier-map.map
dans votre
directive RewriteMap
.
Les cl�s de recherche sont mises en cache par httpd jusqu'� ce que
le mtime
(date de modification) du fichier de
correspondances soit modifi�, ou que le serveur httpd soit
red�marr�, ce qui am�liore les performances pour les tables de
correspondances consult�es par de nombreuses requ�tes.
Lorsque le type-map int
est sp�cifi�, la source est
une des fonctions RewriteMap internes disponibles. Les d�veloppeurs
de modules peuvent fournir des fonctions internes suppl�mentaires en
les enregistrant via l'API ap_register_rewrite_mapfunc
.
Les fonctions fournies par d�faut sont :
Pour utiliser une de ces fonctions, cr�ez une
RewriteMap
faisant r�f�rence � cette fonction int, et
utilisez-la dans votre r�gle RewriteRule
:
Redirige un URI vers son �quivalent en minuscules
RewriteMap lc int:tolower RewriteRule (.*?[A-Z]+.*) ${lc:$1} [R]
Notez que cet exemple n'est fourni qu'� titre d'illustration,
et ne constitue en aucun cas une recommandation. Si vous voulez
rendre des URLs insensibles � la casse, vous devez plut�t vous
tourner vers mod_speling
.
Lorque le type-map prg
est sp�cifi�, la source est
un chemin du syst�me de fichiers vers un programme ex�cutable
destin� � effectuer la mise en correspondance. Il peut s'agir d'un
fichier binaire compil�, ou d'un programme en langage interpr�t�
comme Perl ou Python.
Ce programme est lanc� une fois au d�marrage du serveur HTTP
Apache, puis communique avec le moteur de r��criture via
STDIN
et STDOUT
. En d'autres termes, pour
chaque recherche de correspondance, il re�oit un argument via
STDIN
, et doit renvoyer en guise de r�ponse une cha�ne
termin�e par un caract�re nouvelle-ligne sur STDOUT
. Si
la recherche de correspondance est infructueuse, le programme doit
l'indiquer en retournant la cha�ne de quatre caract�res
"NULL
".
Les programmes de r��criture externes ne sont pas lanc�s s'il
n'ont pas �t� d�finis dans un contexte o� la directive RewriteEngine
est d�finie �
on
.
Cette fonctionnalit� utilise le mutex rewrite-map
n�cessaire � la fiabilit� des communications avec le programme. Le
m�canisme de mutex et le fichier verrou peuvent �tre d�finis via la
directive Mutex
.
Voici un exemple simple qui remplace tous les tirets par des caract�res de soulignement dans l'URI de la requ�te.
Configuration de la r��criture
RewriteMap d2u prg:/www/bin/dash2under.pl
RewriteRule - ${d2u:%{REQUEST_URI}}
dash2under.pl
#!/usr/bin/perl $| = 1; # Turn off I/O buffering while (<STDIN>) { s/-/_/g; # Remplace tous les tirets par des caract�res de soulignement print $_; }
$| = 1;
- La syntaxe sera bien entendu
diff�rente dans
d'autres langages. Si les entr�es/sorties sont mises en tampon, httpd va
attendre une sortie, et va par cons�quent se bloquer.Lorsque le type-map dbd
ou fastdbd
est
sp�cifi�, la source est une requ�te SQL SELECT qui re�oit un
argument et renvoie une seule valeur.
Pour que cette requ�te puisse �tre ex�cut�e,
mod_dbd
doit �tre configur� pour attaquer la base
de donn�es concern�e.
Ce type-map existe sous deux formes. Avec le type-map
dbd
, la requ�te est ex�cut�e � chaque demande, tandis
qu'avec le type-map fastdbd
, les recherches dans la
base de donn�es sont mises en cache en interne. fastdbd
est donc plus efficace et donc plus rapide ; par contre, il ne
tiendra pas compte des modifications apport�es � la base de donn�es
jusqu'� ce que le serveur soit red�marr�.
Si une requ�te renvoie plusieurs enregistrements, un de ceux-ci sera s�lectionn� al�atoirement.
RewriteMap ma-requete "fastdbd:SELECT destination FROM rewrite WHERE source = %s"
La directive RewriteMap
peut appara�tre
plusieurs fois. Utilisez une directive
RewriteMap
pour chaque fonction de mise en
correspondance pour d�clarer son fichier de correspondances.
Bien que l'on ne puisse pas d�clarer de fonction
de mise en correspondance dans un contexte de r�pertoire (fichier
.htaccess
ou section <Directory>), il est
possible d'utiliser cette fonction dans un tel contexte.