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

Les drapeaux du module Apache mod_rewrite

Langues Disponibles:  en  |  fr 

Ce document décrit les drapeaux disponibles dans la directive RewriteRule, en fournissant des explications détaillées et des exemples. Vous n'y trouverez pas une liste exhaustive de tous les drapeaux disponibles, c'est pourquoi vous devez aussi consulter la documentation de référence.

Voir aussi

top

Introduction

Le comportement des directives RewriteRule peut être modifié par un ou plusieurs drapeaux. Les drapeaux sont situés en fin de règle, entourés de crochets, et séparés le cas échéant par des virgules.

RewriteRule modèle cible [drapeau1,drapeau2,drapeau3]

Les drapeaux ont tous une forme courte, comme CO, ainsi qu'une forme longue, comme cookie. Certains drapeaux peuvent avoir un ou plusieurs arguments. Les drapeaux sont insensibles à la casse.

top

Les drapeaux

Chaque drapeau possède une forme longue et une forme courte. Bien que la forme courte soit la plus couramment utilisée, nous vous recommandons de vous familiariser avec les drapeaux sous leur forme longue, afin de bien mémoriser ce que chaque drapeau est supposé faire.

Chaque drapeau disponible est présenté ici, avec un exemple d'utilisation.

B

Avec le drapeau [B], la directive RewriteRule échappe les caractères non-alphanumériques avant d'appliquer la transformation.

C|chain

Le drapeau [C] ou [chain] indique que la règle RewriteRule est chaînée avec la suivante. Autrement dit, si la règle s'applique, elle est traitée normalement et passe le contrôle à la règle suivante. Par contre, si elle ne s'applique pas, la règle suivante, ainsi que toutes les règles chaînées qui suivent, seront sautées.

CO|cookie

Le drapeau [CO], ou [cookie], vous permet de définir un cookie lorsqu'une règle RewriteRule s'applique. Il possède cinq arguments dont trois sont obligatoires et deux optionnels.

Vous devez déclarer un nom et une valeur pour définir le cookie, ainsi que le domaine pour lequel vous souhaitez que le cookie soit valide. Vous pouvez aussi définir la durée de vie du cookie, ainsi que le chemin pour lequel il doit être renvoyé.

Par défaut, la durée de vie du cookie correspond à la session du navigateur en cours.

Par défaut, le chemin pour lequel le cookie sera valide est "/" - c'est à dire, pour tout le site web.

Voici un exemple :

RewriteEngine On
RewriteRule ^/index\.html - [CO=frontdoor:yes:.apache.org:1440:/]

Dans l'exemple ci-dessus, la règle ne réécrit pas la requête. La cible de réécriture "-" indique à mod_rewrite de transmettre la requête sans modification. Par contre, il définit un cookie nommé 'frontdoor' avec une valeur 'yes'. Le cookie est valide pour tout hôte situé dans le domaine .apache.org. Sa durée de vie est limitée à 1440 minutes (24 heures), et il sera renvoyé pour tous les URIs.

DPI|discardpathinfo

Avec le drapeau DPI, la partie PATH_INFO de l'URI réécrit est supprimée.

E|env

Avec le drapeau [E], ou [env], vous pouvez définir la valeur d'une variable d'environnement. Notez que certaines variables d'environnement peuvent être définies après le traitement de la règle, annulant par la-même ce que vous avez défini. Voir le document sur les variables d'environnement pour plus de détails sur le fonctionnement des variables d'environnement.

L'exemple suivant définit une variable d'environnement nommée 'image' avec une valeur de '1' si l'URI de la requête correspond à un fichier image. Cette variable d'environnement est ensuite utilisée pour exclure une telle requête du journal des accès.

RewriteRule \.(png|gif|jpg) - [E=image:1]
CustomLog logs/access_log combined env=!image

Notez que le même effet peut être obtenu à l'aide de la directive SetEnvIf. Cette technique est présentée à titre d'exemple et non de recommandation.

F|forbidden

L'utilisation du drapeau [F] permet de faire envoyer par Apache au client un code de statut "403 Forbidden". Le même effet peut être obtenu à l'aide de la directive Deny, mais ce drapeau offre plus de souplesse dans l'attribution d'un statut Forbidden.

La règle suivante va interdire la téléchargement de fichiers .exe depuis votre serveur.

RewriteRule \.exe - [F]

Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce qui signifie que l'URI de la requête n'est pas modifié. Il n'y a aucune raison de réécrire un URI, si vous avez l'intention d'interdire la requête.

G|gone

Le drapeau [G] permet de faire envoyer par Apache un code de statut "410 Gone" avec la réponse. Ce code indique qu'une ressource qui était disponible auparavant ne l'est plus actuellement.

Comme dans le cas du drapeau [F], on utilise en général la syntaxe "-" pour la cible de réécriture lorsqu'on utilise le drapeau [G] :

RewriteRule ancienne-ressource - [G,NC]

H|handler

Force le traitement de la requête résultante par le gestionnaire spécifié. Par exemple, on peut utiliser ce drapeau pour forcer l'interprétation de tous les fichiers sans extension par le gestionnaire php :

RewriteRule !\. - [H=application/x-httpd-php]

L'expression rationnelle ci-dessus - !\. - correspond à toute requête qui ne contient pas le caractère ..

On peut aussi utiliser ce drapeau pour forcer l'utilisation d'un certain gestionnaire en fonction de certaines conditions. Par exemple, l'extrait suivant utilisé dans un contexte de niveau serveur permet de faire en sorte que les fichiers .php soient affichés par mod_php dans le cas où ils font l'objet d'une requête avec l'extension .phps :

RewriteRule ^(/source/.+\.php)s$ $1 [H=application/x-httpd-php-source]

L'expression rationnelle ci-dessus - ^(/source/.+\.php)s$ - va correspondre à toute requête qui débutera par /source/, continuera par 1 ou n caractères puis par .phps. La référence arrière $1 fait référence à la correspondance capturée entre parenthèses de l'expression rationnelle.

L|last

Lorsque le drapeau [L] est présent, mod_rewrite arrête le traitement du jeu de règles. Cela signifie dans la plupart des situations que si la règle s'applique, aucune autre règle ne sera traitée.

Si vous utilisez des règles RewriteRule dans des fichiers .htaccess ou des sections <Directory>, il est important d'avoir quelques notions sur la manière dont les règles sont traitées. Pour simplifier, une fois les règles traitées, la requête réécrite est passée à nouveau au moteur d'interprétation des URLs afin que ce dernier puisse la traiter. Il est possible qu'au cours du traitement de la requête réécrite, le fichier .htaccess ou la section <Directory> soient à nouveau rencontrés, entraînant un nouveau traitement du jeu de règles depuis le début. Cette situation se présente le plus souvent lorsqu'une des règles provoque une redirection - interne ou externe - ce qui réinitialise le traitement de la requête.

Si vous utilisez des directives RewriteRule dans un de ces contextes, il importe par conséquent de prévoir explicitement des étapes permettant d'éviter un bouclage infini sur les règles, et de ne pas compter seulement sur le drapeau [L] pour terminer l'exécution d'une série de règles, comme décrit ci-dessous.

Dans l'exemple donné ici, toute requête est réécrite en index.php, la requête originale étant ajoutée comme chaîne de requête en argument à index.php ; cependant, la directive RewriteCond permet de s'assurer que si la requête concerne déjà index.php, la directive RewriteRule sera sautée.

RewriteCond %{REQUEST_URI} !=index\.php
RewriteRule ^(.*) index.php?req=$1 [L]

N|next

Le drapeau [N] provoque un redémarrage du traitement des règles depuis le début ; à utiliser avec précautions car il peut provoquer un bouclage infini.

Le drapeau [Next] peut servir, par exemple, à remplacer de manière répétitive une chaîne de caractère ou une lettre dans une requête. Dans l'exemple suivant, chaque occurence de A sera remplacée par B dans la requête, et ceci jusqu'il n'y ait plus de A à remplacer.

RewriteRule (.*)A(.*) $1B$2 [N]

Vous pouvez vous représenter ce traitement comme une boucle while : tant que le modèle de la règle correspond (c'est à dire, tant que l'URI contient un A), effectuer la substitution (c'est à dire, remplacer le A par un B).

NC|nocase

Avec le drapeau [NC], le modèle de la règle RewriteRule est comparé à la requête de manière insensible à la casse. C'est à dire que cette comparaison s'effectue sans tenir compte des majuscules/minuscules dans l'URI comparé.

Dans l'exemple suivant, toute requête pour un fichier image sera transmise par Apache à votre serveur d'images dédié. La correspondance est insensible à la casse, si bien que par exemple, .jpg aussi bien que .JPG seront acceptés.

RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [P,NC]

NE|noescape

Par défaut, les caractères spéciaux, comme & et ?, sont convertis en leur équivalent hexadécimal. Le drapeau [NE] permet d'éviter cette conversion.

RewriteRule ^/ancre/(.+) /grosse-page.html#$1 [NE,R]

Dans l'exemple ci-dessus, /anchor/xyz est réécrit en /bigpage.html#xyz. En l'absence du drapeau [NE], le # aurait été converti en son équivalent hexadécimal, %23, ce qui aurait provoqué un code d'erreur "404 Not Found".

NS|nosubreq

Le drapeau [NS] empêche la règle de s'appliquer aux sous-requêtes. Par exemple, une page incluse au moyen d'une SSI (Server Side Include) est une sous-requête, et vous ne voudrez peut-être pas que la réécriture s'applique à ces sous-requêtes.

Les images, scripts java, ou fichiers css, chargés en tant que partie d'une page html, ne sont pas des sous-requêtes - le navigateur les appelle sous forme de requêtes HTTP à part entière.

P|proxy

L'utilisation du drapeau [P] entraîne le traitement de la requête par le module mod_proxy, et ceci via une requête de mandataire. Par exemple, si vous voulez que toutes les requêtes d'images soient traitées par un serveur d'images annexe, vous pouvez utiliser une règle de ce style :

RewriteRule (.*)\.(jpg|gif|png) http://images.exemple.com$1.$2 [P]

L'utilisation du drapeau [P] provoque aussi l'effet du drapeau [L] - autrement dit, la requête est immédiatement envoyée au mandataire, et toute règle ultérieure sera ignorée.

PT|passthrough

Par défaut, la cible (ou chaîne de substitution) d'une règle RewriteRule est sensée être un chemin de fichier. Avec le drapeau [PT], par contre, elle est traitée comme un URI. Autrement dit, avec le drapeau [PT], le résultat de la règle RewriteRule est passé à nouveau au système de mise en correspondance des URLs avec le système de fichiers, de façon à ce que les systèmes de mise en correspondance basés sur les chemins de fichiers, comme la directive Alias, par exemple, puissent avoir une chance d'accomplir leur tâche.

Si par exemple, vous avez un Alias pour /icons, et une règle RewriteRule qui renvoie vers /icons, vous devez utiliser le drapeau [PT] pour être sûr que l'Alias sera bien évalué.

Alias /icons /usr/local/apache/icons
RewriteRule /pics/(.+)\.jpg /icons/$1.gif [PT]

Dans l'exemple précédent, en l'absence du drapeau [PT], l'Alias aurait été ignoré, ce qui aurait provoqué une erreur 'File not found'.

QSA|qsappend

Quand l'URI de remplacement contient une chaîne de requête, le comportement par défaut de la règle RewriteRule est de supprimer la query string (il s'agit des paramètres éventuellement passés dans l'URL après le caractère ?, usuellement pour les formulaires traités par la méthode HTTP GET) existante, et de la remplacer par celle nouvellement créée. Avec le drapeau [QSA], les chaînes de requête peuvent être combinées.

Considérons la règle suivante :

RewriteRule /pages/(.+) /page.php?page=$1 [QSA]

Avec le drapeau [QSA], une requête pour /pages/123?one=two sera réécrite en /page.php?page=123&one=two. Sans le drapeau [QSA], la même requête sera réécrite en /page.php?page=123 - autrement dit, la chaîne de requête (query string) existante sera supprimée.

R|redirect

L'utilisation du drapeau [R] provoque l'envoi d'une redirection au navigateur. Si une URL pleinement qualifiée (FQDN - fully qualified domain name) est spécifiée (c'est à dire incluant http://nom-du-serveur/), une redirection sera effectuée vers cette adresse. Dans le cas contraire, c'est le nom du serveur local qui sera utilisé pour générer l'URL envoyée avec la redirection.

Un code de statut entre 300 et 399 peut être spécifié, le code 302 étant utilisé par défaut si aucun code n'est spécifié.

Vous utiliserez presque toujours [R] en conjonction avec [L] (c'est à dire [R,L]), car employé seul, le drapeau [R] préfixe l'URI avec http://cet-hôte[:ce-port], mais passe ensuite cette adresse à la règle suivante, ce qui provoquera le plus souvent des avertissements 'Invalid URI in request'.

S|skip

Le drapeau [S] sert à sauter des règles que vous ne voulez pas voir exécuter. Ceci peut s'interpréter comme une instruction goto dans votre jeu de règles de réécriture. Dans l'exemple suivant, nous ne voulons exécuter la règle RewriteRule que si l'URI demandé ne correspond pas à un fichier existant.

# La requête concerne-t-elle un fichier qui n'existe pas ?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Si c'est la cas, on saute les deux règles de réécriture suivantes
RewriteRule .? - [S=2]

RewriteRule (.*\.gif) images.php?$1
RewriteRule (.*\.html) docs.php?$1

Cette technique trouve son utilité dans le fait qu'une directive RewriteCond ne s'applique qu'à la règle qui la suit immédiatement. Ainsi, si vous voulez qu'une directive RewriteCond s'applique à plusieurs règles RewriteRule, vous pouvez utiliser le drapeau [Skip].

T|type

Définit le type MIME de la réponse résultante renvoyée. L'effet est identique à celui de la directive AddType.

Par exemple, vous pouvez utiliser la technique suivante pour servir du code source Perl en tant que plein texte, s'il est requis d'une certaine manière :

# Sert les fichier .pl en tant que plein texte
RewriteRule \.pl$ - [T=text/plain]

Ou encore, si vous possédez une caméra qui produit des fichiers images jpeg sans extension, vous pouvez forcer le renvoi de ces images avec le type MIME correct en se basant sur le nom du fichier :

# Les fichiers dont le nom contient 'IMG' sont des images jpg.
RewriteRule IMG - [T=image/jpg]

Notez cependant qu'il s'agit d'un exemple trivial, et que le problème aurait pu être résolu en utilisant à la place la directive <FilesMatch>. Il faut toujours envisager la possibilité d'une solution alternative à un problème avant d'avoir recours à la réécriture, qui sera toujours moins efficace qu'une solution alternative.

Langues Disponibles:  en  |  fr