From: Lucien Gentis
Le comportement d'une directive 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.
- Les drapeaux qui modifient les métadonnées associées à la requête (T=, H=,
+E=) n'ont aucun effet dans un Chaque drapeau disponible est présenté ici, avec un exemple
d'utilisation.
Les drapeaux peuvent être combinés : [R=301,L], [P,QSA],
+[E=VAR:val,L]. Cette table les groupe par fonction et les trie
+selon la fréquence de leur utilisation.
| Drapeau | +Fonction | +Effet | +Combinaisons courantes | +
|---|---|---|---|
| Contrôle de flux | |||
| [L] | +Dernière règle | +Arrête le traitement des règles (pour cette passe) | +[R=301,L] [F] [G] | +
| [END] | +Arrêt complet | +Arrête tout le processus de réécriture (pas de réentrance dans .htaccess) | +[R=301,END] | +
| [S=N] | +Saut | +Sauter les N prochaines règles (logique if/else) | ++ |
| [N] | +Instance suivante de la boucle | +Redémarrer le traitement du jeu de règles à partir de la première + (attention : risque de boucle infinie) | ++ |
| [C] | +Chaînage | +Chaîner la règle actuelle à la prochaine ; si la règle actuelle échoue, + sauter les règles chaînées | ++ |
| Redirection et mandatement | |||
| [R=code] | +Redirection | +Redirection externe (par défaut 302). Utilisez Redirect/RedirectMatch pour + les cas simple | +[R=301,L] [R=302,L] | +
| [P] | +Mandatement | +Mandatement inverse vers une cible (nécessite |
+ [P,QSA] | +
| Contrôle dâaccès | |||
| [F] | +Interdiction | +Renvoie 403 (implique [L]) | ++ |
| [G] | +Parti | +Renvoie 410 (implique [L]) | ++ |
| URL / chaîne de paramètres | |||
| [QSA] | +Ajout de la chaîne de paramètres | +Ajout de la chaîne de paramètres originelle à la substitution | +[QSA,L] [P,QSA] | +
| [QSD] | +Suppression de la chaîne de paramètres | +Supprime entièrement la chaîne de paramètres | +[R=301,QSD,L] | +
| [B] | +Ãchappement des références arrières | +Réencode les caractères spéciaux dans les références arrières | +[B,PT] | +
| [NE] | +Pas dâéchappement | +Pas dâéchappement des caractères spéciaux dans la sortie (pass #, ? through) | +[R=301,NE,L] | +
| Metadonnées et gestionnaires | |||
| [E] | +Définition dâune variable dâenvironnement | +Définit une variable dâenvironnement | +[E=VAR:val,L] | +
| [T] | +Type MIME | +Forçage du type de contenu | ++ |
| [H] | +Gestionnaire | +Forçage dâun gestionnaire de contenu | ++ |
| [PT] | +Transmission résultat | +Transmission du résultat au gestionnaire suivant (requis pour Alias/ScriptAlias) | +[PT,L] | +
| Cookie | |||
| [CO] | +Définir un cookie | +Définir un cookie HTTP pour la réponse | +[CO=name:val:.domain,R=302,L] | +
Avec le drapeau [B], la directive
Pour définir la liste des caractères à échapper de cette manière, voir #flag_bne et #flag_bctls
+Voir Encodage et décodage des URLs pour une +explication détaillée de la manière dont httpd décode les URIs avant la mise en +correspondance des motifs.
+Si le drapeau [BNP] est spécifié, la directive
Voir Encodage et décodage des URLs pour +découvrir la manière dont lâencodage est géré dans le tube (pipeline) de +réécriture.
+Ce drapeau est disponible à partir de la version 2.5.1 du serveur HTTP +
Ce drapeau est disponible à partir de la version 2.4.57 du serveur HTTP Apache.
Ce drapeau est disponible à partir de la version 2.5.1 du serveur HTTP +
Ce drapeau est disponible à partir de la version 2.4.57 du serveur HTTP Apache.
@@ -202,6 +350,19 @@ 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. +Sans le drapeau [C], la seconde règle sâappliquerait aux requêtes qui
+arrivent directement à /catalog/. Le chaînage des deux règles
+permet de sâassurer que la seconde règle ne sâappliquera que si la première
+sâapplique.
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 +
Avec le drapeau DPI, la partie
Dans un
Le chemin dâURL actuel peut être le chemin 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 +ou le résultat de la règle précédente de la passe actuelle du processus 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 +
Par contre, la partie PATH_INFO ajoutée au chemin dâURL avant chaque règle ne
+reflète que la valeur de PATH_INFO avant la passe actuelle du processus
+de réécriture. En conséquence, si de larges portions du chemin dâURL
+correspondent et sont copiées dans une substitution via plusieurs directives
Utilisez ce drapeau pour toute substitution où la présence du PATH_INFO qui @@ -323,6 +486,18 @@ 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é.
+ +Le drapeau DPI supprime /extra/path, de sorte que seul le
+résultat de la substitution est transmis aux règles suivantes ou à la requête
+finale.
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 +avec une valeur de '1' si le chemin dâURL 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.
@@ -376,16 +551,88 @@ CustomLog "logs/access_log" combined env=!imageNotez que le même effet peut être obtenu à l'aide de la directive
Définir des variables dâenvironnement pour tracer les réécritures
+ +Parfois, nous souhaitons être au courant de lâétat de la situation lorsque +nous effectuons une réécriture. Par exemple, vous voudriez prendre note +que vous avez effectué cette réécriture, de sorte que vous pourriez +ultérieurement voir si une requête est arrivée par lâintermédaire de cette +réécriture. Une solution pour y parvenir est la définition dâune variable +dâenvironnement.
+ +Dans la suite de votre jeu de règles, vous pouvez consulter cette variable +dâenvironnement en utilisant une RewriteCond :
+ +Notez que les variables dâenvironnements ne survivent pas à une redirection +externe. Vous devez alors utiliser le drapeau [CO] pour définir un cookie.
+ +Dans un [E=VAR:VAL] â sont
+ renommées par lâajout du préfixe REDIRECT_. Une variable que
+ vous avez nommée rewritten devient ainsi
+ REDIRECT_rewritten dans la requête redirigée.
Pour tester la variable renommée, référencez-la avec le préfixe :
+Si la requête est redirigée plusieurs fois, le préfixe est empilé :
+ REDIRECT_REDIRECT_rewritten, et ainsi de suite. Voir Variables REDIRECT_ pour la description
+ complète de ce mécanisme.
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).
+processus de réécriture ultérieur dans unDans un contexte de serveur virtuel ou global, [END] et [L] se comportent de +manière identique. La différence entre les deux se situe dans un contexte de +répertoire où [L] interrompt la passe actuelle, mais où le jeu de règles est à +nouveau appliqué à lâURL réécrit. Cela peut provoquer des boucles infinies. +[END] empêche tout processus de réécriture ultérieur en interrompant le cycle.
+ +Ceci ne s'applique pas aux nouvelles requêtes résultant d'une redirection externe.
+ +Voir la discussion Réécritures dans un contexte +de répertoire pour une explication détaillée de la raison pour laquelle [L] +se comporte différemment dans un contexte de répertoire, et des cas où [END] +constitue le bon choix.
+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 +
Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce qui +signifie que le chemin dâURL de la requête n'est pas modifié. Il n'y a aucune +raison de réécrire un chemin dâURL, si vous avez l'intention d'interdire la requête.
Lorsqu'on utilise [F], [L] est implicite - c'est à dire que la
@@ -468,34 +715,13 @@ traitée. Ce drapeau correspond à la commande Perl last, ou
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 un
Dans l'exemple donné ici, toute requête est réécrite en
index.php, la requête originale étant ajoutée comme chaîne
@@ -530,7 +756,7 @@ 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),
+dire, tant que le chemin dâURL contient un A),
effectuer la substitution (c'est à dire, remplacer le A par
un B).
Avec le drapeau [NC], le modèle de la règle
Dans l'exemple suivant, toute requête pour un fichier image sera
@@ -591,6 +817,10 @@ aurait été converti en son équivalent hexadécimal, %23, ce
qui aurait provoqué un code d'erreur "404 Not Found".
Voir Encodage et décodage des URLs pour une +description complète de la manière dont httpd encode et décode les URLs lors de +la réécriture.
+
-Vous devez vous assurer que la chaîne de substitution soit un URI valide
+Vous devez vous assurer que la chaîne de substitution soit un URL 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.
+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. Si une partie de lâURL cible est + dérivée de lâentrée de lâutilisateur (références arrières, chaînes de + paramètres, etc.), un attaquant pourra être capable de faire que votre + serveur génère des requêtes vers des hôtes internes ou externes + arbitraires. Cette vulnérabilité est connue sous le nom de falsification + de requête côté serveur (Server-Side Request Forgery â SSRF). Assurez-vous + que la partie protocole://nom-serveur de l'URL soit fixe, ou ne permette + pas au client de l'influencer indument.
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
+par contre, elle est traitée comme un chemin URL. Autrement dit, avec le
drapeau [PT], le résultat de la règle -.
-Quand l'URI de remplacement contient une chaîne de requête, le
+Quand l'URL de remplacement contient une chaîne de requête, le
comportement par défaut de la règle
-Lorsque l'URI de la requête contient une chaîne de paramètres, et si
+Lorsque l'URL 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
query string (il s'agit des paramètres éventuellement passés dans l'URL après le
@@ -747,10 +991,10 @@ autrement dit, la chaîne de requête (query string) existante sera
-Si l'URI cible possède une chaîne de paramètres, le comportement par +Si l'URL 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'URL cible.
+Par exemple, si une application patrimoniale attend une chaîne de paramètres +qui contient elle-même un point dâinterrogation :
+ +Sans [QSL], la substitution /app?type=foo?bar serait coupée au
+premier ?, perdant de ce fait le point dâinterrogation littéral de
+la valeur.
Ce drapeau est disponible à partir de la version 2.4.19 du serveur HTTP Apache.
@@ -814,7 +1080,7 @@ codes de redirection en utilisant leurs noms symboliques :
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
+dire [R,L]), car employé seul, le drapeau [R] préfixe le chemin URL 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'.
@@ -824,21 +1090,35 @@ avertissements 'Invalid URI in request'.
spécification de HTTP. Utiliser un code d'état non reconnu provoquera une erreur
500 et l'enregistrement d'un message dans le journal des erreurs.
Lorsquâun code dâétat en dehors de lâintervalle 300-399 est spécifié (par
+exemple [R=403] ou [R=410]), la chaîne de substitution
+est ignorée. LâURL que vous avez saisi comme cible nâest pas servi au client. Ã
+la place, httpd renvoie le code dâétat spécifié et le traite de la manière
+habituelle pour les réponses d'erreur (entre autres tout
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
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
Il est nécessaire de définir ce drapeau pour permettre à une réécriture
- de continuer si la requête HTTP en cours d'écriture possède un point d'interrogation encodé, « %3f », et si le résultat réécrit contient un « ? » dans
- la substitution. Cela protège d'une URL malveillante tirant avantage d'une
- capture et d'une resubstitution du point d'interrogation encodé.L pour terminer la séquence
%3F saisi par lâutilisateur dans la requête ne peut pas être
+exploité pour manipuler la chaîne de paramètres de la cible de substitution.
+Préférez autant que possible la restructuration des URLs pour éviter les points
+dâinterrogation encodés.
+La définition de ce drapeau est requise dans les substitutions à l'échelle du serveur qui commencent par une variable ou une référence arrière et se résolvent en un chemin du système de fichiers. Ces substitutions ne sont pas préfixées par la racine des documents. Cela protège - d'une URL malveillante faisant correspondre la substitution expansée à un + d'un URL malveillant faisant correspondre la substitution développée à un emplacement non souhaité du système de fichiers.
Définir ce drapeau empêche la fusion des slashes de début multiples tels
@@ -951,6 +1273,22 @@ utiliser le drapeau L pour terminer la séquence
multiples littéraux.
Ce drapeau nâest pertinent que sous Windows. Il empêche httpd de fusionner
+les doubles barres obliques de tête (//) qui sont présentes dans un
+chemin UNC lorsque ce dernier a été construit à partir dâune référence arrière
+ou dâune variable. Si la substitution commence par des doubles barres obliques
+littérales, aucun drapeau nâest nécessaire.