PDF Imprimer Envoyer

Règles de réécriture

Vous savez déjà réécrire des URLs de façon simple avec Apache mod-rewite mais vous désirez aller plus loin? Vous aimeriez par exemple faire des ré-écriture basées sur l'origine de votre visiteur, sur le site qui l'a amené jusqu'à vous (le referrer) ... ? Nous allons apprendre comment procéder grâce aux RewriteCond, des conditions de ré-écriture.

RewriteCond Chaîne_caractère CONDITION

Chaîne_caractère doit contenir une variable serveur ou une back-reference d'une précédente RewriteCond. Les back-references marchent comme les variables passés en argument dans les rewrite-rules (décrit dans la partie réécriture de base), à une modification prêt : les RewriteCond s'écrivent sous la forme %N alors qu'ils s'écrivaient $N pour une rewrite-rule.

CONDITION peut être à nouveau une expression régulière. En plus de celà il peut prendre des variantes par rapport à la forme classique d'une expression régulière. Nous reviendrons sur celà plus loin.

Pour faire fonctionner une condition, il faut la placer avant la règle de ré-écriture. Cette ré-écriture ne sera alors appliquée que si la condition est vérifiée par le visiteur.

Passons à une application assez pratique : imaginons que vous désiriez empêcher une adresse IP d'accéder à votre site web.

RewriteCond %{REMOTE_ADDR} 123.45.67.89
RewriteRule .* interdiction.html [R]

Dans cet exemple, la condition se fait sur l'adresse IP (%{REMOTE_ADDR}) qui doit valoir 123.45.67.89 pour que la règle suivante s'applique. Une fois la règle vérifiée, le visiteur est redirigé vers la page interdiction.html pour toute page ( .*) demandée.

Les variables serveurs sont accessibles par la forme suivante %{VAR_NAME}. Les plus utilisées sont reproduites ci-dessous, si vous voulez consulter l'ensemble des variables lisez la documentation officielle :

Si vous souhaitez vérifier le contenu de ces variables vous pouvez utiliser la fonction phpinfo() à nouveau.

Des exemples d'utilisations sont présents dans le menu "Exemples".

Voyons à présent les façons d'utiliser façons dont on peut utiliser les expressions régulières dans les conditions. Nous allons considérer un autre exemple. Supposons que vous utilisiez un CMS qui demande que chaque page soit appelée par le script de la page d'accueil index.php. A nouveau nous pourrions écrire :

RewriteRule (.*) index.php?page=$1 [QSA,L]

Mais cependant tout n'est pas rose. Que se passera-t-il lorsque l'utilisateur demandera une image ou un fichier CSS? Nous pourrions demander à la page d'indexs de renvoyer le fichier en question, mais cela serait assez fastidieux. Plus intelligemment nous allons dire à mod-rewrite quand il doit ré-écrire les adresses vers la page d'index, et quand il ne doit pas le faire :

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule (.*) index.php?page=$1 [QSA,L]

 

On remarque ici qu'il y a deux conditions. Dans l'absolu vous pouvez utiliser autant de conditions d'affilé que vous le désirez, chacune d'elle étant vérifier dans l'ordre. Si la condition 1 n'est pas remplie on saute l'ensemble, sinon on passe à la condition 2. En pratique il faudra restreindre leur nombre dans un soucis de clarté.

Chaque condition possède en réalité un flag par défaut [AND]. Vous pouvez changer le comportement de traitement des conditions en mettant un [OR]. Ainsi, si l'une des conditions est respectée, alors, la règle sera appliquée. Vous pouvez aussi ajouter le flag [NC] pour enlever la sensibilité à la casse (majuscules/minuscules).

Ensuite, on remarque l'utilisation de ! pour signifier une négation de la condition. admettons par exemple que vous désiriez retirer toutes les images de la règle de ré-écriture, la condition s'écrirait (le caractère ' \ ' avant le point sert à "échapper" le caractère ' . ' afin de ne pas créer de contre-sens dans la syntaxe) :

RewriteCond %{SCRIPT_FILENAME} !\.(gif|jpg|png)$
RewriteRule (.*) index.php?page=$1 [QSA,L]

Le caractère ' \ ' avant le point sert à "échapper" le caractère ' . ' afin de ne pas créer de contre-sens dans la syntaxe.

Revenons à notre exemple précédent. La condition -f et -d signifie juste que l'on considère tout sauf les fichier (file) et les répertoires (directories).

 

Mise à jour le Dimanche, 02 Novembre 2008 07:51
 

Ajouter un Commentaire


Code de sécurité
Rafraîchir