<-
Apache > Serveur HTTP > Documentation > Version 2.4 > Rewrite

Utilisation de RewriteMap

Langues Disponibles:  en  |  fr 

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.

Notez que la plupart de ces exemples ne fonctionneront pas en l'�tat dans le contexte de votre configuration particuli�re ; vous devez donc vous attacher � les comprendre, plut�t que de simplement les ins�rer dans votre configuration par copier/coller.

Voir aussi

top

Introduction

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}

Contexte de r�pertoire et fichiers.htaccess

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.

top

txt: tables de correspondances au format texte

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 :

Fichier de correspondances Produit - Identifiant

##
## 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.

Note: fichiers .htaccess

L'exemple donn� est con�u pour �tre utilis� dans un contexte de serveur principal ou de serveur virtuel. Si vous voulez l'utiliser dans un fichier .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]

Recherches mises en cache

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.

top

rnd: Fichier texte � valeurs de substitution multiples choisies de mani�re al�atoire

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'.

Fichier de correspondances

##
## 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

top

dbm: Fichier condens� DBM

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.

Mise en cache des recherches

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.

top

int: Fonction interne

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.

top

prg: Programme de r��criture externe

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 $_;
    }

Mises en garde !

  • Votre programme doit �tre le plus simple possible. Si le programme se bloque, httpd va attendre ind�finiment une r�ponse de sa part, et par cons�quent ne r�pondra plus aux requ�tes.
  • Assurez-vous de bien d�sactiver la mise en tampon dans votre programme. En Perl, ceci est effectu� � la seconde ligne du script de l'exemple - $| = 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.
  • Rappelez-vous qu'il n'existe qu'une copie du programme lanc� au d�marrage du serveur, et que toutes les requ�tes vont devoir passer par ce goulot d'�tranglement. Ceci peut provoquer des ralentissements significatifs si de nombreuses requ�tes doivent �tre trait�es, ou si le script lui-m�me est tr�s lent.
top

dbd ou fastdbd: requ�te SQL

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.

Exemple

RewriteMap ma-requete "fastdbd:SELECT destination FROM rewrite WHERE source = %s"
top

R�sum�

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.

Langues Disponibles:  en  |  fr 

top

Commentaires

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.