1 <?xml version="1.0" encoding="ISO-8859-1" ?>
2 <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision: 1721957:1734260 (outdated) -->
5 <!-- French translation : Lucien GENTIS -->
6 <!-- Reviewed by : Vincent Deffontaines -->
9 Licensed to the Apache Software Foundation (ASF) under one or more
10 contributor license agreements. See the NOTICE file distributed with
11 this work for additional information regarding copyright ownership.
12 The ASF licenses this file to You under the Apache License, Version 2.0
13 (the "License"); you may not use this file except in compliance with
14 the License. You may obtain a copy of the License at
16 http://www.apache.org/licenses/LICENSE-2.0
18 Unless required by applicable law or agreed to in writing, software
19 distributed under the License is distributed on an "AS IS" BASIS,
20 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 See the License for the specific language governing permissions and
22 limitations under the License.
25 <manualpage metafile="flags.xml.meta">
26 <parentdocument href="./">Rewrite</parentdocument>
28 <title>Les drapeaux de réécriture</title>
31 <p>Ce document décrit les drapeaux disponibles dans la directive
32 <directive module="mod_rewrite">RewriteRule</directive>, en fournissant
33 des explications détaillées et des exemples.</p>
36 <seealso><a href="../mod/mod_rewrite.html">Documentation du module</a></seealso>
37 <seealso><a href="intro.html">Introduction à mod_rewrite</a></seealso>
38 <seealso><a href="remapping.html">Redirection and remise en
39 correspondance</a></seealso>
40 <seealso><a href="access.html">Contrôle d'accès</a></seealso>
41 <seealso><a href="vhosts.html">Serveurs virtuels</a></seealso>
42 <seealso><a href="proxy.html">Mise en cache</a></seealso>
43 <seealso><a href="rewritemap.html">Utilisation de RewriteMap</a></seealso>
44 <seealso><a href="advanced.html">Techniques avancées</a></seealso>
45 <seealso><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></seealso>
47 <section id="introduction"><title>Introduction</title>
48 <p>Le comportement d'une directive <directive
49 module="mod_rewrite">RewriteRule</directive> peut être modifié par un ou
50 plusieurs drapeaux. Les drapeaux sont situés en fin de règle, entourés
51 de crochets, et séparés le cas échéant par des virgules.</p>
52 <highlight language="config">RewriteRule pattern target [Flag1,Flag2,Flag3]</highlight>
54 <p>Chaque drapeau (à quelques exceptions près)
55 possède une forme courte, comme <code>CO</code>, ainsi qu'une forme longue,
56 comme <code>cookie</code>. Bien que
57 la forme courte soit la plus couramment utilisée, nous vous recommandons
58 de vous familiariser avec les drapeaux sous leur forme longue, afin de
59 bien mémoriser ce que chaque drapeau est supposé faire.
60 Certains drapeaux acceptent un ou plusieurs arguments. Les drapeaux ne
61 sont pas sensibles à la casse.</p>
63 <p>Les drapeaux qui modifient les métadonnées associées à la requête
64 (T=, H=, E=) n'ont aucun effet dans un contexte de répertoire ou de
65 fichier htaccess, lorsqu'une substitution (autre que '-') est effectuée
66 au cours de la même passe du processus de réécriture.
69 <p>Chaque drapeau disponible est présenté ici, avec un exemple
73 <section id="flag_b"><title>B (échappement dans les références arrières)</title>
74 <p>Avec le drapeau [B], la directive <directive
75 module="mod_rewrite">RewriteRule</directive> échappe les caractères
76 non-alphanumériques avant d'appliquer la transformation. A partir
77 de la version 2.4.10, vous pouvez limiter l'échappement dans les
78 références arrières à une liste de caractères que vous pouvez spécifiez comme
79 dans cet exemple : <code>[B=#?;]</code>. Notez que l'espace peut faire
80 partie de la liste des caractères à échapper, mais qu'il ne doit pas
81 être le dernier caractère de cette liste.
84 <p><code>mod_rewrite</code> doit supprimer les séquences d'échappement
86 mise en correspondance avec le système de fichiers ; les séquences
87 d'échappement sont donc supprimées des références arrières au moment où
88 ces dernières sont appliquées. Avec le drapeau B, les caractères
89 non-alphanumériques des références arrières seront échappés. Considérons
90 par exemple cette règle :</p>
92 <highlight language="config">RewriteRule "^search/(.*)$" "/search.php?term=$1"</highlight>
94 <p>Soit le terme de recherche 'x & y/z' ; un navigateur va le coder
95 en 'x%20%26%20y%2Fz', transformant la requête en
96 'search/x%20%26%20y%2Fz'. Sans le drapeau B, cette règle de réécriture
97 va réécrire la requête en 'search.php?term=x & y/z', ce qui ne
98 correspond pas à une URL valide et cette dernière sera encodée en
99 <code>search.php?term=x%20&y%2Fz=</code>, ce qui ne correspond pas à
100 ce que l'on souhaitait.</p>
102 <p>Avec le drapeau B, les paramètres sont réencodés avant d'être passés
103 à l'URL résultante, ce qui fournit une réécriture correcte en
104 <code>/search.php?term=x%20%26%20y%2Fz</code>.</p>
106 <p>Notez que vous devrez peut-être aussi définir la
107 directive <directive module="core">AllowEncodedSlashes</directive>
108 à <code>On</code> pour
109 que cet exemple particulier fonctionne, car httpd ne permet pas les
110 slashes encodés dans les URLs, et renvoie une erreur 404 s'il en
113 <p>Ce processus d'échappement est en particulier nécessaire dans le
114 contexte d'un mandataire, où l'accès au serveur d'arrière-plan échouera
115 si on présente à ce dernier une URL non échappée.</p>
117 <p>Une alternative à ce drapeau consiste à utiliser une directive
118 <directive module="mod_rewrite">RewriteCond</directive> pour capturer
119 %{THE_REQUEST}, les chaînes capturées se présentant
120 alors sous la forme codée.</p>
124 <section id="flag_bnp"><title>BNP|backrefnoplus (ne pas échapper
125 l'espace en +)</title>
126 <p>Si le drapeau [BNP] est spécifié, la directive <directive
127 module="mod_rewrite">RewriteRule</directive> échappera le caractère
128 espace en %20 au lieu de '+' dans les références arrières. Ceci s'avère
129 utile lorsque la référence arrière est utilisée dans la partie chemin,
130 et non dans les paramètres de la requête.</p>
133 <section id="flag_c"><title>C|chain</title>
134 <p>Le drapeau [C] ou [chain] indique que la règle <directive
135 module="mod_rewrite">RewriteRule</directive> est chaînée avec la
136 suivante. Autrement dit, si la règle s'applique, elle est traitée
137 normalement et passe le contrôle à la règle suivante. Par contre, si
138 elle ne s'applique pas, la règle suivante, ainsi que toutes les règles
139 chaînées qui suivent, seront sautées.</p>
143 <section id="flag_co"><title>CO|cookie</title>
144 <p>Le drapeau [CO], ou [cookie], vous permet de définir un cookie
145 lorsqu'une règle <directive module="mod_rewrite">RewriteRule</directive>
146 s'applique. Il possède trois arguments obligatoires et
147 quatre arguments optionnels.</p>
149 <p>La syntaxe complète de ce drapeau, avec tous ses attributs, est la
153 [CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly]
156 <p>Si un caractère littéral ':' doit être insérer dans un des champs du
157 cookie, une autre syntaxe est disponible. Pour utiliser cette syntaxe
158 alternative, le contenu du champ "Name" doit être précédé du caractère
159 ';', et les sépateurs de champs deviendront des ';'.</p>
162 [CO=;NAME;VALUE:MOREVALUE;DOMAIN;lifetime;path;secure;httponly]
165 <p>Vous devez déclarer un nom, une valeur et un domaine pour que
166 le cookie puisse être défini.</p>
171 <dd>Le domaine pour lequel vous souhaitez que le cookie soit valide. Ce
172 peut être un nom de serveur, comme <code>www.example.com</code>, ou un
173 domaine, comme <code>.example.com</code>. Il doit comporter au moins
174 deux parties séparées par un point. C'est à dire que vous ne pouvez pas
175 utiliser les valeurs <code>.com</code> ou <code>.net</code>. En effet,
176 ce style de cookie est interdit par le modèle de sécurité des cookies.</dd>
179 <p>Vous pouvez aussi définir les valeurs suivantes :</p>
183 <dd>La durée de vie du cookie, en minutes.</dd>
184 <dd>Une valeur de 0 indique une durée de vie correspondant à la session
185 courante du navigateur. Il s'agit de la valeur par défaut.</dd>
188 <dd>Le chemin, sur le site web concerné, pour lequel le cookie est
189 valide, du style <code>/clients/</code> or
190 <code>/fichiers/telechargement/</code>.</dd>
191 <dd>La valeur par défaut est <code>/</code> - c'est à dire l'ensemble du
195 <dd>Si cet argument a pour valeur <code>secure</code>,
196 <code>true</code>, ou <code>1</code>, le cookie ne pourra être transmis
197 que dans le cadre d'une connexion sécurisée (https).</dd>
200 <dd>Si cet argument a pour valeur <code>HttpOnly</code>,
201 <code>true</code>, ou <code>1</code>, le cookie aura son drapeau
202 <code>HttpOnly</code> activé, ce qui signifie qu'il sera inaccessible au
203 code JavaScript pour les navigateurs qui supportent cette
204 fonctionnalité.</dd>
207 <p>Voici un exemple :</p>
209 <highlight language="config">
211 RewriteRule "^/index\.html" "-" [CO=frontdoor:yes:.example.org:1440:/]
214 <p>Dans l'exemple ci-dessus, la règle ne réécrit
215 pas la requête. La cible de réécriture "-"
216 indique à mod_rewrite de transmettre la requête sans
217 modification. Par contre, il
218 définit un cookie nommé 'frontdoor' avec une valeur 'yes'. Le cookie est
219 valide pour tout hôte situé dans le domaine <code>.example.org</code>. Sa
220 durée de vie est limitée à 1440 minutes (24 heures), et il sera renvoyé
221 pour tous les URIs.</p>
225 <section id="flag_dpi"><title>DPI|discardpath</title>
226 <p>Avec le drapeau DPI, la partie PATH_INFO de l'URI
227 réécrit est supprimée.</p>
228 <p>Ce drapeau est disponible dans les versions 2.2.12 et supérieures.</p>
229 <p>Dans un contexte de répertoire, l'URI mis en comparaison par chaque
230 règle <directive>RewriteRule</directive> est la concaténation des
231 valeurs courantes de l'URI et de PATH_INFO.</p>
233 <p>L'URI courant peut être l'URI initial tel qu'il a été fourni par le
234 client, le résultat d'une passe précédente du processus de réécriture,
235 ou le résultat de la règle précédente dans le processus courant de
236 réécriture.</p>
238 <p>Par contre, la partie PATH_INFO ajoutée à l'URI avant chaque règle ne
239 reflète que la valeur de PATH_INFO avant la passe courante du processus
240 de réécriture. En conséquence, si de larges portions de l'URI
241 correspondent et sont traduites via plusieurs directives
242 <directive>RewriteRule</directive>, sans prendre en compte
243 quelles parties de l'URI provenaient du PATH_INFO courant, l'URI final
244 pourra se voir ajouter plusieurs copies de PATH_INFO.</p>
246 <p>Utilisez ce drapeau pour toute substitution où la présence du PATH_INFO qui
247 résultait de la mise en correspondance précédente de cette requête avec
248 le système de fichier n'est pas nécessaire. Avec ce drapeau, le
249 PATH_INFO établi avant que cette passe du processus de réécriture ne
250 débute est oublié. PATH_INFO ne sera pas recalculé tant que la passe
251 courante du processus de réécriture ne sera pas achevée. Les règles
252 suivantes de cette passe ne verront que le résultat direct des
253 substitutions, sans aucun PATH_INFO ajouté.</p>
256 <section id="flag_e"><title>E|env</title>
257 <p>Avec le drapeau [E], ou [env], vous pouvez définir la valeur d'une
258 variable d'environnement. Notez que certaines variables d'environnement
259 peuvent être définies après le traitement de la règle, annulant par
260 la-même ce que vous avez défini. Voir le <a href="../env.html">document
261 sur les variables d'environnement</a> pour plus de détails sur le
262 fonctionnement des variables d'environnement.</p>
264 <p>La syntaxe complète pour ce drapeau est :</p>
266 <highlight language="config">
270 <p><code>VAL</code> peut comporter des références arrières
271 (<code>$N</code> ou <code>%N</code>) qui seront développées.</p>
273 <p>En utilisant la version courte</p>
279 <p>vous pouvez définir la variable d'environnement nommée
280 <code>VAR</code> avec une valeur vide.</p>
288 <p>permet d'annuler la définition de la variable <code>VAR</code>.</p>
290 <p>Les variables d'environnement s'emploient dans différents contextes,
291 comme les programmes CGI, d'autres directives RewriteRule, ou des
292 directives CustomLog.</p>
294 <p>L'exemple suivant définit une variable d'environnement nommée 'image'
295 avec une valeur de '1' si l'URI de la requête correspond à un fichier
296 image. Cette variable d'environnement est ensuite utilisée pour exclure
297 une telle requête du journal des accès.</p>
299 <highlight language="config">
300 RewriteRule "\.(png|gif|jpg)" "-" [E=image:1]<br />
301 CustomLog "logs/access_log" combined env=!image
304 <p>Notez que le même effet peut être obtenu à l'aide de la directive
305 <directive module="mod_setenvif">SetEnvIf</directive>. Cette technique
306 est présentée à titre d'exemple et non de recommandation.</p>
309 <section id="flag_end"><title>END</title>
310 <p>L'utilisation du drapeau [END] permet non seulement de terminer le
311 processus de réécriture en cours (comme [L]), mais aussi d'empêcher tout
312 processus de réécriture ultérieur dans un contexte de répertoire
315 <p>Ceci ne s'applique pas aux nouvelles requêtes résultant d'une
316 redirection externe.</p>
319 <section id="flag_f"><title>F|forbidden</title>
320 <p>L'utilisation du drapeau [F] permet de faire envoyer par le serveur au
321 client un code de statut "403 Forbidden". Le même effet peut être obtenu à
322 l'aide de la directive <directive module="mod_access_compat">Deny</directive>,
323 mais ce drapeau offre plus de souplesse dans l'attribution d'un statut
326 <p>La règle suivante va interdire la téléchargement de fichiers
327 <code>.exe</code> depuis votre serveur.</p>
329 <highlight language="config">RewriteRule "\.exe" "-" [F]</highlight>
331 <p>Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce
332 qui signifie que l'URI de la requête n'est pas modifié. Il n'y a aucune
333 raison de réécrire un URI, si vous avez l'intention d'interdire la
336 <p>Lorsqu'on utilise [F], [L] est implicite - c'est à dire que la
337 réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée.</p>
341 <section id="flag_g"><title>G|gone</title>
342 <p>Le drapeau [G] permet de faire envoyer par le serveur un code de statut
343 "410 Gone" avec la réponse. Ce code indique qu'une ressource qui était
344 disponible auparavant ne l'est plus actuellement.</p>
346 <p>Comme dans le cas du drapeau [F], on utilise en général la syntaxe
347 "-" pour la cible de réécriture lorsqu'on utilise le drapeau [G] :</p>
349 <highlight language="config">RewriteRule "oldproduct" "-" [G,NC]</highlight>
351 <p>Lorsqu'on utilise [G], [L] est implicite - c'est à dire que la
352 réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée.</p>
356 <section id="flag_h"><title>H|handler</title>
357 <p>Force le traitement de la requête résultante par le gestionnaire
358 spécifié. Par exemple, on peut utiliser ce drapeau pour forcer
359 l'interprétation de tous les fichiers sans extension par le gestionnaire
362 <highlight language="config">RewriteRule "!\." "-" [H=application/x-httpd-php]</highlight>
365 L'expression rationnelle ci-dessus - <code>!\.</code> - correspond à
366 toute requête qui ne contient pas le caractère <code>.</code>.
368 <p>On peut aussi utiliser ce drapeau pour forcer l'utilisation d'un
369 certain gestionnaire en fonction de certaines conditions. Par exemple,
370 l'extrait suivant utilisé dans un contexte de niveau serveur permet de
371 faire en sorte que les fichiers <code>.php</code> soient
372 <em>affichés</em> par <code>mod_php</code> dans le cas où ils font
373 l'objet d'une requête avec l'extension <code>.phps</code> :</p>
375 <highlight language="config">
376 RewriteRule "^(/source/.+\.php)s$" "$1" [H=application/x-httpd-php-source]
380 <p>L'expression rationnelle ci-dessus -
381 <code>^(/source/.+\.php)s$</code> - va correspondre à toute requête qui
382 débutera par <code>/source/</code>, continuera par 1 ou n caractères
383 puis par <code>.phps</code>. La référence arrière $1 fait référence à la
384 correspondance capturée entre parenthèses de l'expression
390 <section id="flag_l"><title>L|last</title>
391 <p>Lorsque le drapeau [L] est présent, <module>mod_rewrite</module>
392 arrête le traitement du jeu de règles. Cela signifie dans la plupart des
393 situations que si la règle s'applique, aucune autre règle ne sera
394 traitée. Ce drapeau correspond à la commande Perl <code>last</code>, ou
395 à la commande <code>break</code> en C. Utilisez ce drapeau pour indiquer
396 que la règle courante doit être appliquée immédiatement, sans tenir
397 compte des règles ultérieures.</p>
399 <p>Si vous utilisez des règles <directive
400 module="mod_rewrite">RewriteRule</directive> dans des fichiers
401 <code>.htaccess</code> ou des sections <directive type="section"
402 module="core">Directory</directive>, il est important d'avoir quelques
403 notions sur la manière dont les règles sont traitées. Pour simplifier,
404 une fois les règles traitées, la requête réécrite est passée à nouveau
405 au moteur d'interprétation des URLs afin que ce dernier puisse la
406 traiter. Il est possible qu'au cours du traitement de la requête
407 réécrite, le fichier <code>.htaccess</code> ou la section <directive
408 type="section" module="core">Directory</directive> soient à nouveau
409 rencontrés, entraînant un nouveau traitement du jeu de règles depuis le
410 début. Cette situation se présente le plus souvent lorsqu'une des règles
411 provoque une redirection - interne ou externe - ce qui réinitialise le
412 traitement de la requête.</p>
414 <p>Si vous utilisez des directives <directive
415 module="mod_rewrite">RewriteRule</directive> dans un de ces contextes,
416 il importe par conséquent de prévoir explicitement des étapes permettant
417 d'éviter un bouclage infini sur les règles,
418 et de ne pas compter seulement sur
419 le drapeau [L] pour terminer l'exécution d'une série de règles, comme
420 décrit ci-dessous.</p>
422 <p>Un autre drapeau, [END], permet non seulement d'interrompre le cycle
423 courant du processus de réécriture, mais aussi d'empêcher toute
424 réécriture ultérieure dans le contexte de répertoire (htaccess). Ceci ne
425 s'applique pas aux nouvelles requêtes résultant de redirections
428 <p>Dans l'exemple donné ici, toute requête est réécrite en
429 <code>index.php</code>, la requête originale étant ajoutée comme chaîne
430 de requête en argument à <code>index.php</code> ; cependant, la
432 module="mod_rewrite">RewriteCond</directive> permet de s'assurer que si
433 la requête concerne déjà <code>index.php</code>, la directive <directive
434 module="mod_rewrite">RewriteRule</directive> sera sautée.</p>
436 <highlight language="config">
438 RewriteCond "%{REQUEST_URI}" !=/index.php
439 RewriteRule "^(.*)" "/index.php?req=$1" [L,PT]
443 <section id="flag_n"><title>N|next</title>
444 <p>Le drapeau [N] provoque un redémarrage du traitement des règles
445 depuis le début, en utilisant le résultat du jeu de règles, sous
446 réserve qu'il existe un point de démarrage ; à utiliser avec précautions
447 car il peut provoquer un bouclage infini.
450 Le drapeau [Next] peut servir, par exemple,
451 à remplacer de manière répétitive
452 une chaîne de caractère ou une lettre dans une requête. Dans l'exemple
453 suivant, chaque occurence de A sera remplacée par B dans la requête, et
454 ceci jusqu'il n'y ait plus de A à remplacer.
457 <highlight language="config">RewriteRule "(.*)A(.*)" "$1B$2" [N]</highlight>
459 <p>Vous pouvez vous représenter ce traitement comme une boucle
460 <code>while</code> : tant que le modèle de la règle correspond (c'est à
461 dire, tant que l'URI contient un <code>A</code>),
462 effectuer la substitution (c'est à dire, remplacer le <code>A</code> par
463 un <code>B</code>).</p>
465 <p>A partir de la version 2.5.0, ce module renvoie une erreur après
466 10000 itérations afin d'éviter les boucles infinies. Ce nombre maximum
467 d'itération peut être modifié via le drapeau N.</p>
468 <highlight language="config">
469 # On veut remplacer 1 caractère à chaque itération de la boucle
470 RewriteRule "(.+)[><;]$" "$1" [N=32000]
471 # ... ou s'arrêter après 10 itérations
472 RewriteRule "(.+)[><;]$" "$1" [N=10]
477 <section id="flag_nc"><title>NC|nocase</title>
478 <p>Avec le drapeau [NC], le modèle de la règle <directive
479 module="mod_rewrite">RewriteRule</directive> est comparé à la requête de
480 manière insensible à la casse. C'est à dire que cette comparaison
481 s'effectue sans tenir compte des majuscules/minuscules dans l'URI
484 <p>Dans l'exemple suivant, toute requête pour un fichier image sera
485 transmise par Apache à votre serveur d'images dédié. La correspondance est
486 insensible à la casse, si bien que par exemple, <code>.jpg</code> aussi
487 bien que <code>.JPG</code> seront acceptés.</p>
489 <highlight language="config">RewriteRule "(.*\.(jpg|gif|png))$" "http://images.example.com$1" [P,NC]</highlight>
492 <section id="flag_ne"><title>NE|noescape</title>
493 <p>Par défaut, les caractères spéciaux, comme <code>&</code> et
494 <code>?</code>, sont convertis en leur équivalent
495 hexadécimal. Le drapeau [NE] permet d'éviter cette conversion.
498 <highlight language="config">RewriteRule "^/anchor/(.+)" "/bigpage.html#$1" [NE,R]</highlight>
501 Dans l'exemple ci-dessus, <code>/anchor/xyz</code> est réécrit en
502 <code>/bigpage.html#xyz</code>. En l'absence du drapeau [NE], le #
503 aurait été converti en son équivalent hexadécimal, <code>%23</code>, ce
504 qui aurait provoqué un code d'erreur "404 Not Found".
509 <section id="flag_ns"><title>NS|nosubreq</title>
510 <p>Le drapeau [NS] empêche la règle de s'appliquer aux sous-requêtes.
511 Par exemple, une page incluse au moyen d'une SSI (Server
512 Side Include) est une sous-requête, et vous ne voudrez probablement pas que
513 la réécriture s'applique à ces sous-requêtes. Ainsi, lorsque
514 <module>mod_dir</module> recherche des informations à propos des
515 fichiers par défaut du répertoire (comme les fichiers
516 <code>index.html</code>), il s'agit d'une sous-requête interne, et vous
517 ne désirez en général pas que ces sous-requêtes soient réécrites. Cette
518 réécriture
519 n'est pas toujours utile pour les sous-requêtes, et peut même causer des
520 erreurs si l'ensemble du jeu de règles est appliqué. L'utilisation de
521 ce drapeau permet d'exclure les règles qui peuvent poser problème.</p>
523 <p>Comment déterminer si vous devez utiliser cette règle ou non : si
524 vous préfixez les URLs avec des scripts CGI, afin de forcer leur
525 traitement par le script CGI, vous vous exposez à des problèmes (ou du
526 moins à une surcharge significative) avec les sous-requêtes. Dans ces
527 cas, vous devez utiliser ce drapeau.</p>
530 Les images, scripts java, ou fichiers css, chargés en tant que partie
531 d'une page html, ne sont pas des sous-requêtes - le navigateur les
532 appelle sous forme de requêtes HTTP à part entière.
536 <section id="flag_p"><title>P|proxy</title>
537 <p>L'utilisation du drapeau [P] entraîne le traitement de la requête par
538 le module <module>mod_proxy</module>, et ceci via une requête de
539 mandataire. Par exemple, si vous voulez que toutes les requêtes d'images
540 soient traitées par un serveur d'images annexe, vous pouvez utiliser
541 une règle de ce style :</p>
543 <highlight language="config">RewriteRule "/(.*)\.(jpg|gif|png)$" "http://images.example.com/$1.$2" [P]</highlight>
545 <p>L'utilisation du drapeau [P] provoque aussi l'effet du drapeau [L] -
546 autrement dit, la requête est immédiatement envoyée au mandataire, et
547 toute règle ultérieure sera ignorée.</p>
550 Vous devez vous assurer que la chaîne de substitution soit un URI valide
551 (commençant typiquement par <code>http://</code><em>nom-serveur</em>)
552 qui puisse être traitée par le module <module>mod_proxy</module>. Dans
553 le cas contraire, le module mandataire vous renverra une erreur.
554 L'utilisation de ce drapeau implémente de manière plus puissante la
555 directive <directive module="mod_proxy">ProxyPass</directive>, pour
556 faire correspondre le contenu distant à l'espace de nommage du serveur
559 <note type="warning">
560 <title>Avertissement à propos de la sécurité</title>
561 <p>Lors de la construction de l'URL cible de la règle, il convient
562 de prendre en compte l'impact en matière de sécurité qu'aura le
563 fait de permettre au client d'influencer le jeu d'URLs pour
564 lesquelles votre serveur agira en tant que mandataire.
565 Assurez-vous que la partie protocole://nom-serveur de l'URL soit
566 fixe, ou ne permette pas au client de l'influencer induement.</p>
569 <note type="warning">
570 <title>Avertissement au sujet des performances</title>
571 <p>Utiliser ce drapeau fait intervenir <module>mod_proxy</module> sans la gestion des connexions
572 persistantes, ce qui signifie que vous obtiendrez des performances meilleurs si vous utilisez
573 <directive module="mod_proxy">ProxyPass</directive> ou <directive module="mod_proxy">ProxyPassMatch</directive>.</p>
574 <p>Ceci est du au fait que ce drapeau induit l'utilisation du worker par défaut, qui
575 ne gère pas la mise en commun des connexions.</p>
576 <p>Partout où cela est possible, préférez l'utilisation de ces directives.</p>
579 <p>Note: <module>mod_proxy</module> doit être activé pour pouvoir
580 utiliser ce drapeau.</p>
584 <section id="flag_pt"><title>PT|passthrough</title>
587 Par défaut, la cible (ou chaîne de substitution) d'une règle
588 RewriteRule est sensée être un chemin de fichier. Avec le drapeau [PT],
589 par contre, elle est traitée comme un URI. Autrement dit, avec le
590 drapeau [PT], le résultat de la règle <directive
591 module="mod_rewrite">RewriteRule</directive> est passé à nouveau au
592 système de mise en correspondance des URLs avec le système de fichiers,
593 de façon à ce que les systèmes de mise en correspondance basés sur les
594 chemins de fichiers, comme la directive <directive
595 module="mod_alias">Alias</directive>, <directive
596 module="mod_alias">Redirect</directive>, ou <directive
597 module="mod_alias">ScriptAlias</directive>, par exemple, puissent avoir une
598 chance d'accomplir leur tâche.
602 Si par exemple, vous avez un <directive
603 module="mod_alias">Alias</directive> pour /icons, et une règle <directive
604 module="mod_rewrite">RewriteRule</directive> qui renvoie vers /icons,
605 vous devez utiliser le drapeau [PT] pour être sûr que l'<directive
606 module="mod_alias">Alias</directive> sera bien évalué.
609 <highlight language="config">
610 Alias "/icons" "/usr/local/apache/icons"
611 RewriteRule "/pics/(.+)\.jpg$" "/icons/$1.gif" [PT]
615 Dans l'exemple précédent, en l'absence du drapeau [PT], l'Alias aurait
616 été ignoré, ce qui aurait provoqué une erreur 'File not found'.
619 <p>Avec le drapeau <code>PT</code>, le drapeau <code>L</code> est
620 implicite : la réécriture s'arrêtera afin de transmettre la requête à la
621 phase suivante du traitement.</p>
623 <p>Notez que le drapeau <code>PT</code> est implicite dans des contextes
624 de répertoire comme les sections <directive type="section"
625 module="core">Directory</directive> ou les fichiers
626 <code>.htaccess</code>. Le seul moyen de contourner ceci consiste à
627 réécrire vers <code>-</code>.</p>
631 <section id="flag_qsa"><title>QSA|qsappend</title>
633 Quand l'URI de remplacement contient une chaîne de requête, le
634 comportement par défaut de la règle <directive
635 module="mod_rewrite">RewriteRule</directive> est de supprimer la <code>
636 query string</code> (il s'agit des paramètres éventuellement passés dans l'URL après le
637 caractère <code>?</code>, usuellement pour les formulaires traités par la
638 méthode HTTP <code>GET</code>) existante, et de la remplacer par celle nouvellement créée.
639 Avec le drapeau [QSA], les chaînes de requête peuvent être combinées.
642 <p>Considérons la règle suivante :</p>
644 <highlight language="config">RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]</highlight>
646 <p>Avec le drapeau [QSA], une requête pour
647 <code>/pages/123?one=two</code> sera réécrite en
648 <code>/page.php?page=123&one=two</code>. Sans le drapeau [QSA], la
649 même requête sera réécrite en <code>/page.php?page=123</code> -
650 autrement dit, la chaîne de requête (<code>query string</code>) existante sera supprimée.
654 <section id="flag_qsd"><title>QSD|qsdiscard</title>
656 Lorsque l'URI de la requête contient une chaîne de paramètres, et si
657 l'URI cible n'en contient pas, le comportement par défaut de la
658 directive <directive module="mod_rewrite">RewriteRule</directive> consiste à copier cette
659 chaîne de paramètres dans l'URI cible. Avec le drapeau [QSD], la chaîne
660 de paramètres est supprimée.
663 <p>Ce drapeau est disponible dans les versions 2.4.0 et supérieures.</p>
666 Lorsque les drapeaux [QSD] et [QSA] sont utilisés ensemble, c'est le
667 drapeau [QSD] qui l'emporte.
671 Si l'URI cible possède une chaîne de paramètres, le comportement par
672 défaut sera respecté - c'est à dire que la chaîne de paramètres
673 originale sera supprimée et remplacée par la chaîne de paramètres de
680 <section id="flag_r"><title>R|redirect</title>
682 L'utilisation du drapeau [R] provoque l'envoi d'une redirection au
683 navigateur. Si une URL pleinement qualifiée (FQDN - fully qualified domain name)
684 est spécifiée (c'est à dire incluant <code>http://nom-du-serveur/</code>),
685 une redirection sera effectuée vers cette adresse. Dans le cas contraire,
686 le protocole courant, le nom du serveur et le numéro de port seront
687 utilisés pour générer l'URL envoyée avec la redirection.
690 <p><em>Tout</em> code de statut de réponse HTTP valide peut être
691 spécifié, en utilisant la syntaxe [R=305], le code de statut 302 étant
692 utilisé par défaut si aucun code n'est spécifié. Le code de statut
693 spécifié n'est pas nécessairement un code de statut
694 de redirection (3xx). Cependant, si le code de statut est en dehors de la plage des codes de
695 redirection (300-399), la chaîne de substitution est entièrement
696 supprimée, et la réécriture s'arrête comme si le drapeau <code>L</code>
697 était utilisé.</p>
699 <p>En plus des codes de statut de réponse, vous pouvez spécifier les
700 codes de redirection en utilisant leurs noms symboliques :
701 <code>temp</code> (défaut), <code>permanent</code>, ou
702 <code>seeother</code>.</p>
705 Vous utiliserez presque toujours [R] en conjonction avec [L] (c'est à
706 dire [R,L]), car employé seul, le drapeau [R] préfixe l'URI avec
707 <code>http://cet-hôte[:ce-port]</code>, mais passe ensuite cette adresse
708 à la règle suivante, ce qui provoquera le plus souvent des
709 avertissements 'Invalid URI in request'.
714 <section id="flag_s"><title>S|skip</title>
715 <p>Le drapeau [S] sert à sauter des règles que vous ne voulez pas voir
716 exécuter. La syntaxe du drapeau [S] est [S=<em>N</em>], où
717 <em>N</em> correspond au nombre de règles à sauter (sous
718 réserve que la règle <directive
719 module="mod_rewrite">RewriteRule</directive> corresponde et qu'au moins
720 une condition <directive module="mod_rewrite">RewriteCond</directive>
721 préalable soit vérifiée).
722 Ceci peut s'interpréter comme une instruction
723 <code>goto</code> dans votre jeu de règles de réécriture. Dans
724 l'exemple suivant, nous ne voulons exécuter la règle <directive
725 module="mod_rewrite">RewriteRule</directive> que si l'URI demandé ne
726 correspond pas à un fichier existant.</p>
727 <highlight language="config">
728 # La requête concerne-t-elle un fichier qui n'existe pas ?
729 RewriteCond "%{REQUEST_FILENAME}" !-f
730 RewriteCond "%{REQUEST_FILENAME}" !-d
731 # Si c'est la cas, on saute les deux règles de réécriture suivantes
732 RewriteRule ".?" "-" [S=2]
734 RewriteRule "(.*\.gif)" "images.php?$1"
735 RewriteRule "(.*\.html)" "docs.php?$1"
740 <p>Cette technique trouve son utilité dans le fait qu'une directive
741 <directive module="mod_rewrite">RewriteCond</directive> ne s'applique
742 qu'à la règle qui la suit immédiatement. Ainsi, si vous voulez
743 qu'une directive <code>RewriteCond</code> s'applique à plusieurs règles
744 <code>RewriteRule</code>, une technique possible consiste à inverser ces
745 conditions et ajouter une <code>RewriteRule</code> avec le drapeau [Skip]. Cette technique permet
746 d'élaborer des pseudo-constructions if-then-else : la dernière règle du
747 bloc then contiendra <code>skip=N</code>, où N est le nombre de règles
748 contenues dans le bloc else :</p>
749 <highlight language="config">
750 # Est-ce que le fichier existe ?
751 RewriteCond "%{REQUEST_FILENAME}" !-f
752 RewriteCond "%{REQUEST_FILENAME}" !-d
753 # Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.
754 RewriteRule ".?" "-" [S=3]
756 # Si le fichier existe, alors :
757 RewriteRule "(.*\.gif)" "images.php?$1"
758 RewriteRule "(.*\.html)" "docs.php?$1"
759 # Skip past the "else" stanza.
760 RewriteRule ".?" "-" [S=1]
762 RewriteRule "(.*)" "404.php?file=$1"
766 <p>Il est probablement plus aisé de définir ce genre de configuration
767 via les directives <directive type="section">If</directive>, <directive
768 type="section">ElseIf</directive>, et <directive
769 type="section">Else</directive>.</p>
773 <section id="flag_t"><title>T|type</title>
774 <p>Définit le type MIME de la réponse résultante renvoyée. L'effet est
775 identique à celui de la directive <directive
776 module="mod_mime">AddType</directive>.</p>
778 <p>Par exemple, vous pouvez utiliser la technique suivante pour servir
779 du code source Perl en tant que plein texte, s'il est requis d'une
780 certaine manière :</p>
782 <highlight language="config">
783 # Sert les fichier .pl en tant que plein texte
784 RewriteRule "\.pl$" "-" [T=text/plain]
787 <p>Ou encore, si vous possédez une caméra qui produit des fichiers
788 images jpeg sans extension, vous pouvez forcer le renvoi de ces images
789 avec le type MIME correct en se basant sur le nom du fichier :</p>
791 <highlight language="config">
792 # Les fichiers dont le nom contient 'IMG' sont des images jpg.
793 RewriteRule "IMG" "-" [T=image/jpg]
796 <p>Notez cependant qu'il s'agit d'un exemple trivial, et que le problème
797 aurait pu être résolu en utilisant à la place la directive <directive
798 type="section" module="core">FilesMatch</directive>. Il faut toujours
799 envisager la possibilité d'une solution alternative à un problème avant
800 d'avoir recours à la réécriture, qui sera toujours moins efficace qu'une
801 solution alternative.</p>
804 Dans un contexte de niveau répertoire, n'utilisez que <code>-</code>
805 (tiret) comme substitution, <em>dans toute la séquence de réécriture de
806 mod_rewrite</em>, sinon le type MIME défini avec ce drapeau
807 sera perdu suite à un retraitement interne (y compris les séquences de
808 réécriture suivantes de mod_rewrite). Dans ce contexte, vous pouvez
809 utiliser le drapeau <code>L</code> pour terminer la séquence
810 <em>courante</em> de réécriture de mod_rewrite.</p>