Ce document décrit les drapeaux disponibles dans la directive
Le comportement d'une directive
Chaque drapeau (à quelques exceptions près)
possède une forme courte, comme CO
, ainsi qu'une forme longue,
comme cookie
. 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.
Certains drapeaux acceptent un ou plusieurs arguments. Les drapeaux ne
sont pas sensibles à la casse.
Les drapeaux qui modifient les métadonnées associées à la requête (T=, H=, E=) n'ont aucun effet dans un contexte de répertoire ou de fichier htaccess, lorsqu'une substitution (autre que '-') est effectuée au cours de la même passe du processus de réécriture.
Chaque drapeau disponible est présenté ici, avec un exemple d'utilisation.
Avec le drapeau [B], la directive [B=#?;]
. Notez que l'espace peut faire
partie de la liste des caractères à échapper, mais qu'il ne doit pas
être le dernier caractère de cette liste.
mod_rewrite
doit supprimer les séquences d'échappement
des URLs avant leur
mise en correspondance avec le système de fichiers ; les séquences
d'échappement sont donc supprimées des références arrières au moment où
ces dernières sont appliquées. Avec le drapeau B, les caractères
non-alphanumériques des références arrières seront échappés. Considérons
par exemple cette règle :
Soit le terme de recherche 'x & y/z' ; un navigateur va le coder
en 'x%20%26%20y%2Fz', transformant la requête en
'search/x%20%26%20y%2Fz'. Sans le drapeau B, cette règle de réécriture
va réécrire la requête en 'search.php?term=x & y/z', ce qui ne
correspond pas à une URL valide et cette dernière sera encodée en
search.php?term=x%20&y%2Fz=
, ce qui ne correspond pas à
ce que l'on souhaitait.
Avec le drapeau B, les paramètres sont réencodés avant d'être passés
à l'URL résultante, ce qui fournit une réécriture correcte en
/search.php?term=x%20%26%20y%2Fz
.
Notez que vous devrez peut-être aussi définir la
directive On
pour
que cet exemple particulier fonctionne, car httpd ne permet pas les
slashes encodés dans les URLs, et renvoie une erreur 404 s'il en
rencontre un.
Ce processus d'échappement est en particulier nécessaire dans le contexte d'un mandataire, où l'accès au serveur d'arrière-plan échouera si on présente à ce dernier une URL non échappée.
Une alternative à ce drapeau consiste à utiliser une directive
Si le drapeau [BNP] est spécifié, la directive
Le drapeau [C] ou [chain] indique que la règle
Le drapeau [CO], ou [cookie], vous permet de définir un cookie
lorsqu'une règle
La syntaxe complète de ce drapeau, avec tous ses attributs, est la suivante :
Vous devez déclarer un nom, une valeur et un domaine pour que le cookie puisse être défini.
www.example.com
, ou un
domaine, comme .example.com
. Il doit comporter au moins
deux parties séparées par un point. C'est à dire que vous ne pouvez pas
utiliser les valeurs .com
ou .net
. En effet,
ce style de cookie est interdit par le modèle de sécurité des cookies.Vous pouvez aussi définir les valeurs suivantes :
/clients/
or
/fichiers/telechargement/
./
- c'est à dire l'ensemble du
site web.secure
,
true
, ou 1
, le cookie ne pourra être transmis
que dans le cadre d'une connexion sécurisée (https).HttpOnly
,
true
, ou 1
, le cookie aura son drapeau
HttpOnly
activé, ce qui signifie qu'il sera inaccessible au
code JavaScript pour les navigateurs qui supportent cette
fonctionnalité.Voici un exemple :
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 .example.org
. Sa
durée de vie est limitée à 1440 minutes (24 heures), et il sera renvoyé
pour tous les URIs.
Avec le drapeau DPI, la partie PATH_INFO de l'URI réécrit est supprimée.
Ce drapeau est disponible dans les versions 2.2.12 et supérieures.
Dans un contexte de répertoire, l'URI mis en comparaison par chaque
règle
L'URI courant peut être l'URI initial tel qu'il a été fourni par le client, le résultat d'une passe précédente du processus de réécriture, ou le résultat de la règle précédente dans le processus courant de réécriture.
Par contre, la partie PATH_INFO ajoutée à l'URI avant chaque règle ne
reflète que la valeur de PATH_INFO avant la passe courante du processus
de réécriture. En conséquence, si de larges portions de l'URI
correspondent et sont traduites via plusieurs directives
Utilisez ce drapeau pour toute substitution où la présence du PATH_INFO qui résultait de la mise en correspondance précédente de cette requête avec le système de fichier n'est pas nécessaire. Avec ce drapeau, le PATH_INFO établi avant que cette passe du processus de réécriture ne débute est oublié. PATH_INFO ne sera pas recalculé tant que la passe courante du processus de réécriture ne sera pas achevée. Les règles suivantes de cette passe ne verront que le résultat direct des substitutions, sans aucun PATH_INFO ajouté.
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.
La syntaxe complète pour ce drapeau est :
VAL
peut comporter des références arrières
($N
ou %N
) qui seront développées.
En utilisant la version courte
vous pouvez définir la variable d'environnement nommée
VAR
avec une valeur vide.
La forme
permet d'annuler la définition de la variable VAR
.
Les variables d'environnement s'emploient dans différents contextes, comme les programmes CGI, d'autres directives RewriteRule, ou des directives CustomLog.
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.
Notez que le même effet peut être obtenu à l'aide de la directive
L'utilisation du drapeau [END] permet non seulement de terminer le processus de réécriture en cours (comme [L]), mais aussi d'empêcher tout processus de réécriture ultérieur dans un contexte de répertoire (htaccess).
Ceci ne s'applique pas aux nouvelles requêtes résultant d'une redirection externe.
L'utilisation du drapeau [F] permet de faire envoyer par le serveur au
client un code de statut "403 Forbidden". Le même effet peut être obtenu à
l'aide de la directive
La règle suivante va interdire la téléchargement de fichiers
.exe
depuis votre serveur.
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.
Lorsqu'on utilise [F], [L] est implicite - c'est à dire que la réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée.
Le drapeau [G] permet de faire envoyer par le serveur 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] :
Lorsqu'on utilise [G], [L] est implicite - c'est à dire que la réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée.
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 :
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
:
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.
Lorsque le drapeau [L] est présent, last
, ou
à la commande break
en C. Utilisez ce drapeau pour indiquer
que la règle courante doit être appliquée immédiatement, sans tenir
compte des règles ultérieures.
Si vous utilisez des règles .htaccess
ou des sections .htaccess
ou la section
Si vous utilisez des directives
Un autre drapeau, [END], permet non seulement d'interrompre le cycle courant du processus de réécriture, mais aussi d'empêcher toute réécriture ultérieure dans le contexte de répertoire (htaccess). Ceci ne s'applique pas aux nouvelles requêtes résultant de redirections externes.
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 index.php
, la directive
Le drapeau [N] provoque un redémarrage du traitement des règles depuis le début, en utilisant le résultat du jeu de règles, sous réserve qu'il existe un point de démarrage ; à 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.
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
).
A partir de la version 2.5.0, ce module renvoie une erreur après 10000 itérations afin d'éviter les boucles infinies. Ce nombre maximum d'itération peut être modifié via le drapeau N.
Avec le drapeau [NC], le modèle de la règle
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.
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.
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".
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 probablement pas que
la réécriture s'applique à ces sous-requêtes. Ainsi, lorsque
index.html
), il s'agit d'une sous-requête interne, et vous
ne désirez en général pas que ces sous-requêtes soient réécrites. Cette
réécriture
n'est pas toujours utile pour les sous-requêtes, et peut même causer des
erreurs si l'ensemble du jeu de règles est appliqué. L'utilisation de
ce drapeau permet d'exclure les règles qui peuvent poser problème.
Comment déterminer si vous devez utiliser cette règle ou non : si vous préfixez les URLs avec des scripts CGI, afin de forcer leur traitement par le script CGI, vous vous exposez à des problèmes (ou du moins à une surcharge significative) avec les sous-requêtes. Dans ces cas, vous devez utiliser ce drapeau.
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.
L'utilisation du drapeau [P] entraîne le traitement de la requête par
le module
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.
Vous devez vous assurer que la chaîne de substitution soit un URI valide
(commençant typiquement par http://
nom-serveur)
qui puisse être traitée par le module
Lors de la construction de l'URL cible de la règle, il convient de prendre en compte l'impact en matière de sécurité qu'aura le fait de permettre au client d'influencer le jeu d'URLs pour lesquelles votre serveur agira en tant que mandataire. Assurez-vous que la partie protocole://nom-serveur de l'URL soit fixe, ou ne permette pas au client de l'influencer induement.
Utiliser ce drapeau fait intervenir
Ceci est du au fait que ce drapeau induit l'utilisation du worker par défaut, qui ne gère pas la mise en commun des connexions.
Partout où cela est possible, préférez l'utilisation de ces directives.
Note:
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
Si par exemple, vous avez un
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'.
Avec le drapeau PT
, le drapeau L
est
implicite : la réécriture s'arrêtera afin de transmettre la requête à la
phase suivante du traitement.
Notez que le drapeau PT
est implicite dans des contextes
de répertoire comme les sections .htaccess
. Le seul moyen de contourner ceci consiste à
réécrire vers -
.
Quand l'URI de remplacement contient une chaîne de requête, le
comportement par défaut de la règle
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 :
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.
Lorsque l'URI de la requête contient une chaîne de paramètres, et si
l'URI cible n'en contient pas, le comportement par défaut de la
directive
Ce drapeau est disponible dans les versions 2.4.0 et supérieures.
Lorsque les drapeaux [QSD] et [QSA] sont utilisés ensemble, c'est le drapeau [QSD] qui l'emporte.
Si l'URI cible possède une chaîne de paramètres, le comportement par défaut sera respecté - c'est à dire que la chaîne de paramètres originale sera supprimée et remplacée par la chaîne de paramètres de l'URI cible.
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,
le protocole courant, le nom du serveur et le numéro de port seront
utilisés pour générer l'URL envoyée avec la redirection.
Tout code de statut de réponse HTTP valide peut être
spécifié, en utilisant la syntaxe [R=305], le code de statut 302 étant
utilisé par défaut si aucun code n'est spécifié. Le code de statut
spécifié n'est pas nécessairement un code de statut
de redirection (3xx). Cependant, si le code de statut est en dehors de la plage des codes de
redirection (300-399), la chaîne de substitution est entièrement
supprimée, et la réécriture s'arrête comme si le drapeau L
était utilisé.
En plus des codes de statut de réponse, vous pouvez spécifier les
codes de redirection en utilisant leurs noms symboliques :
temp
(défaut), permanent
, ou
seeother
.
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'.
Le drapeau [S] sert à sauter des règles que vous ne voulez pas voir
exécuter. La syntaxe du drapeau [S] est [S=N], où
N correspond au nombre de règles à sauter (sous
réserve que la règle goto
dans votre jeu de règles de réécriture. Dans
l'exemple suivant, nous ne voulons exécuter la règle
Cette technique trouve son utilité dans le fait qu'une directive
RewriteCond
s'applique à plusieurs règles
RewriteRule
, une technique possible consiste à inverser ces
conditions et ajouter une RewriteRule
avec le drapeau [Skip]. Cette technique permet
d'élaborer des pseudo-constructions if-then-else : la dernière règle du
bloc then contiendra skip=N
, où N est le nombre de règles
contenues dans le bloc else :
Il est probablement plus aisé de définir ce genre de configuration
via les directives
Définit le type MIME de la réponse résultante renvoyée. L'effet est
identique à celui de la directive
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 :
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 :
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
Dans un contexte de niveau répertoire, n'utilisez que -
(tiret) comme substitution, dans toute la séquence de réécriture de
mod_rewrite, sinon le type MIME défini avec ce drapeau
sera perdu suite à un retraitement interne (y compris les séquences de
réécriture suivantes de mod_rewrite). Dans ce contexte, vous pouvez
utiliser le drapeau L
pour terminer la séquence
courante de réécriture de mod_rewrite.