]> granicus.if.org Git - apache/blob - docs/manual/rewrite/flags.html.fr
That worked, committing the rest of the lot.
[apache] / docs / manual / rewrite / flags.html.fr
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head><!--
4         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5               This file is generated from xml source: DO NOT EDIT
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7       -->
8 <title>Les drapeaux de réécriture - Serveur Apache HTTP</title>
9 <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
10 <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
11 <link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
12 <script src="../style/scripts/prettify.js" type="text/javascript">
13 </script>
14
15 <link href="../images/favicon.ico" rel="shortcut icon" /></head>
16 <body id="manual-page"><div id="page-header">
17 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p>
18 <p class="apache">Serveur Apache HTTP Version 2.4</p>
19 <img alt="" src="../images/feather.gif" /></div>
20 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
21 <div id="path">
22 <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>Les drapeaux de réécriture</h1>
23 <div class="toplang">
24 <p><span>Langues Disponibles: </span><a href="../en/rewrite/flags.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
25 <a href="../fr/rewrite/flags.html" title="Français">&nbsp;fr&nbsp;</a></p>
26 </div>
27
28 <p>Ce document décrit les drapeaux disponibles dans la directive
29 <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>, en fournissant
30 des explications détaillées et des exemples.</p>
31 </div>
32 <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#introduction">Introduction</a></li>
33 <li><img alt="" src="../images/down.gif" /> <a href="#flag_b">B (échappement dans les références arrières)</a></li>
34 <li><img alt="" src="../images/down.gif" /> <a href="#flag_c">C|chain</a></li>
35 <li><img alt="" src="../images/down.gif" /> <a href="#flag_co">CO|cookie</a></li>
36 <li><img alt="" src="../images/down.gif" /> <a href="#flag_dpi">DPI|discardpath</a></li>
37 <li><img alt="" src="../images/down.gif" /> <a href="#flag_e">E|env</a></li>
38 <li><img alt="" src="../images/down.gif" /> <a href="#flag_end">END</a></li>
39 <li><img alt="" src="../images/down.gif" /> <a href="#flag_f">F|forbidden</a></li>
40 <li><img alt="" src="../images/down.gif" /> <a href="#flag_g">G|gone</a></li>
41 <li><img alt="" src="../images/down.gif" /> <a href="#flag_h">H|handler</a></li>
42 <li><img alt="" src="../images/down.gif" /> <a href="#flag_l">L|last</a></li>
43 <li><img alt="" src="../images/down.gif" /> <a href="#flag_n">N|next</a></li>
44 <li><img alt="" src="../images/down.gif" /> <a href="#flag_nc">NC|nocase</a></li>
45 <li><img alt="" src="../images/down.gif" /> <a href="#flag_ne">NE|noescape</a></li>
46 <li><img alt="" src="../images/down.gif" /> <a href="#flag_ns">NS|nosubreq</a></li>
47 <li><img alt="" src="../images/down.gif" /> <a href="#flag_p">P|proxy</a></li>
48 <li><img alt="" src="../images/down.gif" /> <a href="#flag_pt">PT|passthrough</a></li>
49 <li><img alt="" src="../images/down.gif" /> <a href="#flag_qsa">QSA|qsappend</a></li>
50 <li><img alt="" src="../images/down.gif" /> <a href="#flag_qsd">QSD|qsdiscard</a></li>
51 <li><img alt="" src="../images/down.gif" /> <a href="#flag_r">R|redirect</a></li>
52 <li><img alt="" src="../images/down.gif" /> <a href="#flag_s">S|skip</a></li>
53 <li><img alt="" src="../images/down.gif" /> <a href="#flag_t">T|type</a></li>
54 </ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection and remise en
55 correspondance</a></li><li><a href="access.html">Contrôle d'accès</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="proxy.html">Mise en cache</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="advanced.html">Techniques avancées</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li></ul><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div>
56 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
57 <div class="section">
58 <h2><a name="introduction" id="introduction">Introduction</a></h2>
59 <p>Le comportement d'une directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> peut être modifié par un ou
60 plusieurs drapeaux. Les drapeaux sont situés en fin de règle, entourés
61 de crochets, et séparés le cas échéant par des virgules.</p>
62 <pre class="prettyprint lang-config">RewriteRule pattern target [Flag1,Flag2,Flag3]</pre>
63
64
65 <p>Les drapeaux ont tous une forme courte, comme <code>CO</code>, ainsi
66 qu'une forme longue, comme <code>cookie</code>. Certains drapeaux
67 peuvent avoir un ou plusieurs arguments. Les drapeaux sont insensibles à
68 la casse.</p>
69
70 <p>Chaque drapeau (à quelques exceptions près) possède une forme longue et une forme courte. Bien que
71 la forme courte soit la plus couramment utilisée, nous vous recommandons
72 de vous familiariser avec les drapeaux sous leur forme longue, afin de
73 bien mémoriser ce que chaque drapeau est supposé faire.</p>
74
75 <p>Les drapeaux qui modifient les métadonnées associées à la requête
76 (T=, H=, E=) n'ont aucun effet dans un contexte de répertoire ou de
77 fichier htaccess, lorsqu'une substitution (autre que '-') est effectuée
78 au cours de la même passe du processus de réécriture.
79 </p>
80
81 <p>Chaque drapeau disponible est présenté ici, avec un exemple
82 d'utilisation.</p>
83 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
84 <div class="section">
85 <h2><a name="flag_b" id="flag_b">B (échappement dans les références arrières)</a></h2>
86 <p>Avec le drapeau [B], la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> échappe les caractères
87 non-alphanumériques avant d'appliquer la transformation.</p>
88
89 <p><code>mod_rewrite</code> doit supprimer les séquences d'échappement
90 des URLs avant leur
91 mise en correspondance avec le système de fichiers ; les séquences
92 d'échappement sont donc supprimées des références arrières au moment où
93 ces dernières sont appliquées. Avec le drapeau B, les caractères
94 non-alphanumériques des références arrières seront échappés. Considérons
95 par exemple cette règle :</p>
96
97 <pre class="prettyprint lang-config">RewriteRule ^search/(.*)$ /search.php?term=$1</pre>
98
99
100 <p>Soit le terme de recherche 'x &amp; y/z' ; un navigateur va le coder
101 en 'x%20%26%20y%2Fz', transformant la requête en
102 'search/x%20%26%20y%2Fz'. Sans le drapeau B, cette règle de réécriture
103 va réécrire la requête en 'search.php?term=x &amp; y/z', ce qui ne
104 correspond pas à une URL valide et cette dernière sera encodée en
105 <code>search.php?term=x%20&amp;y%2Fz=</code>, ce qui ne correspond pas à
106 ce que l'on souhaitait.</p>
107
108 <p>Avec le drapeau B, les paramètres sont réencodés avant d'être passés
109 à l'URL résultante, ce qui fournit une réécriture correcte en
110 <code>/search.php?term=x%20%26%20y%2Fz</code>.</p>
111
112 <p>Notez que vous devrez peut-être aussi définir la
113 directive <code class="directive"><a href="../mod/core.html#allowencodedslashes">AllowEncodedSlashes</a></code>
114 à <code>On</code> pour
115 que cet exemple particulier fonctionne, car httpd ne permet pas les
116 slashes encodés dans les URLs, et renvoie une erreur 404 s'il en
117 rencontre un.</p>
118
119 <p>Ce processus d'échappement est en particulier nécessaire dans le
120 contexte d'un mandataire, où l'accès au serveur d'arrière-plan échouera
121 si on présente à ce dernier une URL non échappée.</p>
122
123 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
124 <div class="section">
125 <h2><a name="flag_c" id="flag_c">C|chain</a></h2>
126 <p>Le drapeau [C] ou [chain] indique que la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est chaînée avec la
127 suivante. Autrement dit, si la règle s'applique, elle est traitée
128 normalement et passe le contrôle à la règle suivante. Par contre, si
129 elle ne s'applique pas, la règle suivante, ainsi que toutes les règles
130 chaînées qui suivent, seront sautées.</p>
131
132 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
133 <div class="section">
134 <h2><a name="flag_co" id="flag_co">CO|cookie</a></h2>
135 <p>Le drapeau [CO], ou [cookie], vous permet de définir un cookie
136 lorsqu'une règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>
137 s'applique. Il possède trois arguments obligatoires et
138 quatre arguments optionnels.</p>
139
140 <p>La syntaxe complète de ce drapeau, avec tous ses attributs, est la
141 suivante :</p>
142
143 <div class="example"><p><code>
144 [CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly]
145 </code></p></div>
146
147 <p>Vous devez déclarer un nom, une valeur et un domaine pour que
148 le cookie puisse être défini.</p>
149
150
151 <dl>
152 <dt>Domain</dt>
153 <dd>Le domaine pour lequel vous souhaitez que le cookie soit valide. Ce
154 peut être un nom de serveur, comme <code>www.example.com</code>, ou un
155 domaine, comme <code>.example.com</code>. Il doit comporter au moins
156 deux parties séparées par un point. C'est à dire que vous ne pouvez pas
157 utiliser les valeurs <code>.com</code> ou <code>.net</code>. En effet,
158 ce style de cookie est interdit par le modèle de sécurité des cookies.</dd>
159 </dl>
160
161 <p>Vous pouvez aussi définir les valeurs suivantes :</p>
162
163 <dl>
164 <dt>Lifetime</dt>
165 <dd>La durée de vie du cookie, en minutes.</dd>
166 <dd>Une valeur de 0 indique une durée de vie correspondant à la session
167 courante du navigateur. Il s'agit de la valeur par défaut.</dd>
168
169 <dt>Path</dt>
170 <dd>Le chemin, sur le site web concerné, pour lequel le cookie est
171 valide, du style <code>/clients/</code> or
172 <code>/fichiers/telechargement/</code>.</dd>
173 <dd>La valeur par défaut est <code>/</code> - c'est à dire l'ensemble du
174 site web.</dd>
175
176 <dt>Secure</dt>
177 <dd>Si cet argument a pour valeur <code>secure</code>,
178 <code>true</code>, ou <code>1</code>, le cookie ne pourra être transmis
179 que dans le cadre d'une connexion sécurisée (https).</dd>
180
181 <dt>httponly</dt>
182 <dd>Si cet argument a pour valeur <code>HttpOnly</code>,
183 <code>true</code>, ou <code>1</code>, le cookie aura son drapeau
184 <code>HttpOnly</code> activé, ce qui signifie qu'il sera inaccessible au
185 code JavaScript pour les navigateurs qui supportent cette
186 fonctionnalité.</dd>
187 </dl>
188
189 <p>Voici un exemple :</p>
190
191 <pre class="prettyprint lang-config">
192 RewriteEngine On
193 RewriteRule ^/index\.html - [CO=frontdoor:yes:.example.org:1440:/]
194 </pre>
195
196
197 <p>Dans l'exemple ci-dessus, la règle ne réécrit
198 pas la requête. La cible de réécriture "-"
199 indique à mod_rewrite de transmettre la requête sans
200 modification. Par contre, il
201 définit un cookie nommé 'frontdoor' avec une valeur 'yes'. Le cookie est
202 valide pour tout hôte situé dans le domaine <code>.example.org</code>. Sa
203 durée de vie est limitée à 1440 minutes (24 heures), et il sera renvoyé
204 pour tous les URIs.</p>
205
206 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
207 <div class="section">
208 <h2><a name="flag_dpi" id="flag_dpi">DPI|discardpath</a></h2>
209 <p>Avec le drapeau DPI, la partie PATH_INFO de l'URI
210 réécrit est supprimée.</p>
211 <p>Ce drapeau est disponible dans les versions 2.2.12 et supérieures.</p>
212 <p>Dans un contexte de répertoire, l'URI mis en comparaison par chaque
213 règle <code class="directive">RewriteRule</code> est la concaténation des
214 valeurs courantes de l'URI et de PATH_INFO.</p>
215
216 <p>L'URI courant peut être l'URI initial tel qu'il a été fourni par le
217 client, le résultat d'une passe précédente du processus de réécriture,
218 ou le résultat de la règle précédente dans le processus courant de
219 réécriture.</p>
220
221 <p>Par contre, la partie PATH_INFO ajoutée à l'URI avant chaque règle ne
222 reflète que la valeur de PATH_INFO avant la passe courante du processus
223 de réécriture. En conséquence, si de larges portions de l'URI
224 correspondent et sont traduites via plusieurs directives
225 <code class="directive">RewriteRule</code>, sans prendre en compte
226 quelles parties de l'URI provenaient du PATH_INFO courant, l'URI final
227 pourra se voir ajouter plusieurs copies de PATH_INFO.</p>
228
229 <p>Utilisez ce drapeau pour toute substitution où la présence du PATH_INFO qui
230 résultait de la mise en correspondance précédente de cette requête avec
231 le système de fichier n'est pas nécessaire. Avec ce drapeau, le
232 PATH_INFO établi avant que cette passe du processus de réécriture ne
233 débute est oublié. PATH_INFO ne sera pas recalculé tant que la passe
234 courante du processus de réécriture ne sera pas achevée. Les règles
235 suivantes de cette passe ne verront que le résultat direct des
236 substitutions, sans aucun PATH_INFO ajouté.</p>
237 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
238 <div class="section">
239 <h2><a name="flag_e" id="flag_e">E|env</a></h2>
240 <p>Avec le drapeau [E], ou [env], vous pouvez définir la valeur d'une
241 variable d'environnement. Notez que certaines variables d'environnement
242 peuvent être définies après le traitement de la règle, annulant par
243 la-même ce que vous avez défini. Voir le <a href="../env.html">document
244 sur les variables d'environnement</a> pour plus de détails sur le
245 fonctionnement des variables d'environnement.</p>
246
247 <p>La syntaxe complète pour ce drapeau est :</p>
248
249 <div class="example"><p><code>
250 [E=!VAR]
251 </code></p></div>
252
253 <p><code>VAL</code> peut comporter des références arrières
254 (<code>$N</code> ou <code>%N</code>) qui seront développées.</p>
255
256 <p>En utilisant la version courte</p>
257
258 <div class="example"><p><code>
259 [E=VAR]
260 </code></p></div>
261
262 <p>vous pouvez définir la variable d'environnement nommée
263 <code>VAR</code> avec une valeur vide.</p>
264
265 <p>La forme</p>
266
267 <div class="example"><p><code>
268 [E=!VAR]
269 </code></p></div>
270
271 <p>permet d'annuler la définition de la variable <code>VAR</code>.</p>
272
273 <p>Les variables d'environnement s'emploient dans différents contextes,
274 comme les programmes CGI, d'autres directives RewriteRule, ou des
275 directives CustomLog.</p>
276
277 <p>L'exemple suivant définit une variable d'environnement nommée 'image'
278 avec une valeur de '1' si l'URI de la requête correspond à un fichier
279 image. Cette variable d'environnement est ensuite utilisée pour exclure
280 une telle requête du journal des accès.</p>
281
282 <div class="example"><p><code>
283 RewriteRule \.(png|gif|jpg) - [E=image:1]<br />
284 CustomLog logs/access_log combined env=!image
285 </code></p></div>
286
287 <p>Notez que le même effet peut être obtenu à l'aide de la directive
288 <code class="directive"><a href="../mod/mod_setenvif.html#setenvif">SetEnvIf</a></code>. Cette technique
289 est présentée à titre d'exemple et non de recommandation.</p>
290 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
291 <div class="section">
292 <h2><a name="flag_end" id="flag_end">END</a></h2>
293 <p>L'utilisation du drapeau [END] permet non seulement de terminer le
294 processus de réécriture en cours (comme [L]), mais aussi d'empêcher tout
295 processus de réécriture ultérieur dans un contexte de répertoire
296 (htaccess).</p>
297
298 <p>Ceci ne s'applique pas aux nouvelles requêtes résultant d'une
299 redirection externe.</p>
300 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
301 <div class="section">
302 <h2><a name="flag_f" id="flag_f">F|forbidden</a></h2>
303 <p>L'utilisation du drapeau [F] permet de faire envoyer par le serveur au
304 client un code de statut "403 Forbidden". Le même effet peut être obtenu à
305 l'aide de la directive <code class="directive"><a href="../mod/mod_access_compat.html#deny">Deny</a></code>,
306 mais ce drapeau offre plus de souplesse dans l'attribution d'un statut
307 Forbidden.</p>
308
309 <p>La règle suivante va interdire la téléchargement de fichiers
310 <code>.exe</code> depuis votre serveur.</p>
311
312 <pre class="prettyprint lang-config">RewriteRule \.exe - [F]</pre>
313
314
315 <p>Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce
316 qui signifie que l'URI de la requête n'est pas modifié. Il n'y a aucune
317 raison de réécrire un URI, si vous avez l'intention d'interdire la
318 requête.</p>
319
320 <p>Lorsqu'on utilise [F], [L] est implicite - c'est à dire que la
321 réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée.</p>
322
323 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
324 <div class="section">
325 <h2><a name="flag_g" id="flag_g">G|gone</a></h2>
326 <p>Le drapeau [G] permet de faire envoyer par le serveur un code de statut
327 "410 Gone" avec la réponse. Ce code indique qu'une ressource qui était
328 disponible auparavant ne l'est plus actuellement.</p>
329
330 <p>Comme dans le cas du drapeau [F], on utilise en général la syntaxe
331 "-" pour la cible de réécriture lorsqu'on utilise le drapeau [G] :</p>
332
333 <pre class="prettyprint lang-config">RewriteRule oldproduct - [G,NC]</pre>
334
335
336 <p>Lorsqu'on utilise [G], [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>
338
339 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
340 <div class="section">
341 <h2><a name="flag_h" id="flag_h">H|handler</a></h2>
342 <p>Force le traitement de la requête résultante par le gestionnaire
343 spécifié. Par exemple, on peut utiliser ce drapeau pour forcer
344 l'interprétation de tous les fichiers sans extension par le gestionnaire
345 php :</p>
346
347 <pre class="prettyprint lang-config">RewriteRule !\. -
348 [H=application/x-httpd-php]</pre>
349
350
351 <p>
352 L'expression rationnelle ci-dessus - <code>!\.</code> - correspond à
353 toute requête qui ne contient pas le caractère <code>.</code>.
354 </p>
355 <p>On peut aussi utiliser ce drapeau pour forcer l'utilisation d'un
356 certain gestionnaire en fonction de certaines conditions. Par exemple,
357 l'extrait suivant utilisé dans un contexte de niveau serveur permet de
358 faire en sorte que les fichiers <code>.php</code> soient
359 <em>affichés</em> par <code>mod_php</code> dans le cas où ils font
360 l'objet d'une requête avec l'extension <code>.phps</code> :</p>
361
362 <pre class="prettyprint lang-config">
363 RewriteRule ^(/source/.+\.php)s$ $1 [H=application/x-httpd-php-source]
364 </pre>
365
366
367
368 <p>L'expression rationnelle ci-dessus -
369 <code>^(/source/.+\.php)s$</code> - va correspondre à toute requête qui
370 débutera par <code>/source/</code>, continuera par 1 ou n caractères
371 puis par <code>.phps</code>. La référence arrière $1 fait référence à la
372 correspondance capturée entre parenthèses de l'expression
373 rationnelle.</p>
374
375
376 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
377 <div class="section">
378 <h2><a name="flag_l" id="flag_l">L|last</a></h2>
379 <p>Lorsque le drapeau [L] est présent, <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>
380 arrête le traitement du jeu de règles. Cela signifie dans la plupart des
381 situations que si la règle s'applique, aucune autre règle ne sera
382 traitée. Ce drapeau correspond à la commande Perl <code>last</code>, ou
383 à la commande <code>break</code> en C. Utilisez ce drapeau pour indiquer
384 que la règle courante doit être appliquée immédiatement, sans tenir
385 compte des règles ultérieures.</p>
386
387 <p>Si vous utilisez des règles <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> dans des fichiers
388 <code>.htaccess</code> ou des sections <code class="directive"><a href="../mod/core.html#directory">&lt;Directory&gt;</a></code>, il est important d'avoir quelques
389 notions sur la manière dont les règles sont traitées. Pour simplifier,
390 une fois les règles traitées, la requête réécrite est passée à nouveau
391 au moteur d'interprétation des URLs afin que ce dernier puisse la
392 traiter. Il est possible qu'au cours du traitement de la requête
393 réécrite, le fichier <code>.htaccess</code> ou la section <code class="directive"><a href="../mod/core.html#directory">&lt;Directory&gt;</a></code> soient à nouveau
394 rencontrés, entraînant un nouveau traitement du jeu de règles depuis le
395 début. Cette situation se présente le plus souvent lorsqu'une des règles
396 provoque une redirection - interne ou externe - ce qui réinitialise le
397 traitement de la requête.</p>
398
399 <p>Si vous utilisez des directives <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> dans un de ces contextes,
400 il importe par conséquent de prévoir explicitement des étapes permettant
401 d'éviter un bouclage infini sur les règles,
402 et de ne pas compter seulement sur
403 le drapeau [L] pour terminer l'exécution d'une série de règles, comme
404 décrit ci-dessous.</p>
405
406 <p>Un autre drapeau, [END], permet non seulement d'interrompre le cycle
407 courant du processus de réécriture, mais aussi d'empêcher toute
408 réécriture ultérieure dans le contexte de répertoire (htaccess). Ceci ne
409 s'applique pas aux nouvelles requêtes résultant de redirections
410 externes.</p>
411
412 <p>Dans l'exemple donné ici, toute requête est réécrite en
413 <code>index.php</code>, la requête originale étant ajoutée comme chaîne
414 de requête en argument à <code>index.php</code> ; cependant, la
415 directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> permet de s'assurer que si
416 la requête concerne déjà <code>index.php</code>, la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> sera sautée.</p>
417
418 <pre class="prettyprint lang-config">
419 RewriteBase /
420 RewriteCond %{REQUEST_URI} !=/index.php
421 RewriteRule ^(.*) /index.php?req=$1 [L,PT]
422 </pre>
423
424 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
425 <div class="section">
426 <h2><a name="flag_n" id="flag_n">N|next</a></h2>
427 <p>Le drapeau [N] provoque un redémarrage du traitement des règles
428 depuis le début, en utilisant le résultat du jeu de règles, sous
429 réserve qu'il existe un point de démarrage ; à utiliser avec précautions
430 car il peut provoquer un bouclage infini.
431 </p>
432 <p>
433 Le drapeau [Next] peut servir, par exemple,
434 à remplacer de manière répétitive
435 une chaîne de caractère ou une lettre dans une requête. Dans l'exemple
436 suivant, chaque occurence de A sera remplacée par B dans la requête, et
437 ceci jusqu'il n'y ait plus de A à remplacer.
438 </p>
439
440 <pre class="prettyprint lang-config">RewriteRule (.*)A(.*) $1B$2 [N]</pre>
441
442
443 <p>Vous pouvez vous représenter ce traitement comme une boucle
444 <code>while</code> : tant que le modèle de la règle correspond (c'est à
445 dire, tant que l'URI contient un <code>A</code>),
446 effectuer la substitution (c'est à dire, remplacer le <code>A</code> par
447 un <code>B</code>).</p>
448
449 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
450 <div class="section">
451 <h2><a name="flag_nc" id="flag_nc">NC|nocase</a></h2>
452 <p>Avec le drapeau [NC], le modèle de la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est comparé à la requête de
453 manière insensible à la casse. C'est à dire que cette comparaison
454 s'effectue sans tenir compte des majuscules/minuscules dans l'URI
455 comparé.</p>
456
457 <p>Dans l'exemple suivant, toute requête pour un fichier image sera
458 transmise par Apache à votre serveur d'images dédié. La correspondance est
459 insensible à la casse, si bien que par exemple, <code>.jpg</code> aussi
460 bien que <code>.JPG</code> seront acceptés.</p>
461
462 <pre class="prettyprint lang-config">RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [P,NC]</pre>
463
464 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
465 <div class="section">
466 <h2><a name="flag_ne" id="flag_ne">NE|noescape</a></h2>
467 <p>Par défaut, les caractères spéciaux, comme <code>&amp;</code> et
468 <code>?</code>, sont convertis en leur équivalent
469 hexadécimal. Le drapeau [NE] permet d'éviter cette conversion.
470 </p>
471
472 <pre class="prettyprint lang-config">RewriteRule ^/anchor/(.+) /bigpage.html#$1 [NE,R]</pre>
473
474
475 <p>
476 Dans l'exemple ci-dessus, <code>/anchor/xyz</code> est réécrit en
477 <code>/bigpage.html#xyz</code>. En l'absence du drapeau [NE], le #
478 aurait été converti en son équivalent hexadécimal, <code>%23</code>, ce
479 qui aurait provoqué un code d'erreur "404 Not Found".
480 </p>
481
482 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
483 <div class="section">
484 <h2><a name="flag_ns" id="flag_ns">NS|nosubreq</a></h2>
485 <p>Le drapeau [NS] empêche la règle de s'appliquer aux sous-requêtes.
486 Par exemple, une page incluse au moyen d'une SSI (Server
487 Side Include) est une sous-requête, et vous ne voudrez probablement pas que
488 la réécriture s'applique à ces sous-requêtes. Ainsi, lorsque
489 <code class="module"><a href="../mod/mod_dir.html">mod_dir</a></code> recherche des informations à propos des
490 fichiers par défaut du répertoire (comme les fichiers
491 <code>index.html</code>), il s'agit d'une sous-requête interne, et vous
492 ne désirez en général pas que ces sous-requêtes soient réécrites. Cette
493 réécriture
494 n'est pas toujours utile pour les sous-requêtes, et peut même causer des
495 erreurs si l'ensemble du jeu de règles est appliqué. L'utilisation de
496 ce drapeau permet d'exclure les règles qui peuvent poser problème.</p>
497
498 <p>Comment déterminer si vous devez utiliser cette règle ou non : si
499 vous préfixez les URLs avec des scripts CGI, afin de forcer leur
500 traitement par le script CGI, vous vous exposez à des problèmes (ou du
501 moins à une surcharge significative) avec les sous-requêtes. Dans ces
502 cas, vous devez utiliser ce drapeau.</p>
503
504 <p>
505 Les images, scripts java, ou fichiers css, chargés en tant que partie
506 d'une page html, ne sont pas des sous-requêtes - le navigateur les
507 appelle sous forme de requêtes HTTP à part entière.
508 </p>
509 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
510 <div class="section">
511 <h2><a name="flag_p" id="flag_p">P|proxy</a></h2>
512 <p>L'utilisation du drapeau [P] entraîne le traitement de la requête par
513 le module <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>, et ceci via une requête de
514 mandataire. Par exemple, si vous voulez que toutes les requêtes d'images
515 soient traitées par un serveur d'images annexe, vous pouvez utiliser
516 une règle de ce style :</p>
517
518 <pre class="prettyprint lang-config">RewriteRule /(.*)\.(jpg|gif|png)$ http://images.example.com/$1.$2 [P]</pre>
519
520
521 <p>L'utilisation du drapeau [P] provoque aussi l'effet du drapeau [L] -
522 autrement dit, la requête est immédiatement envoyée au mandataire, et
523 toute règle ultérieure sera ignorée.</p>
524
525 <p>
526 Vous devez vous assurer que la chaîne de substitution soit un URI valide
527 (commençant typiquement par <code>http://</code><em>nom-serveur</em>)
528 qui puisse être traitée par le module <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>. Dans
529 le cas contraire, le module mandataire vous renverra une erreur.
530 L'utilisation de ce drapeau implémente de manière plus puissante la
531 directive <code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code>, pour
532 faire correspondre le contenu distant à l'espace de nommage du serveur
533 local.</p>
534
535 <div class="warning">
536       <h3>Avertissement à propos de la sécurité</h3>
537       <p>Lors de la construction de l'URL cible de la règle, il convient
538       de prendre en compte l'impact en matière de sécurité qu'aura le
539       fait de permettre au client d'influencer le jeu d'URLs pour
540       lesquelles votre serveur agira en tant que mandataire.
541       Assurez-vous que la partie protocole://nom-serveur de l'URL soit
542       fixe, ou ne permette pas au client de l'influencer induement.</p>
543 </div>
544
545 <p>Note: <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code> doit être activé pour pouvoir
546 utiliser ce drapeau.</p>
547
548 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
549 <div class="section">
550 <h2><a name="flag_pt" id="flag_pt">PT|passthrough</a></h2>
551
552 <p>
553 Par défaut, la cible (ou chaîne de substitution) d'une règle
554 RewriteRule est sensée être un chemin de fichier. Avec le drapeau [PT],
555 par contre, elle est traitée comme un URI. Autrement dit, avec le
556 drapeau [PT], le résultat de la règle  <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est passé à nouveau au
557 système de mise en correspondance des URLs avec le système de fichiers,
558 de façon à ce que les systèmes de mise en correspondance basés sur les
559 chemins de fichiers, comme la directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code>, <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code>, ou <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>, par exemple, puissent avoir une
560 chance d'accomplir leur tâche.
561 </p>
562
563 <p>
564 Si par exemple, vous avez un <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> pour /icons, et une règle  <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> qui renvoie vers /icons,
565 vous devez utiliser le drapeau [PT] pour être sûr que l'<code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> sera bien évalué.
566 </p>
567
568 <pre class="prettyprint lang-config">
569 Alias /icons /usr/local/apache/icons
570 RewriteRule /pics/(.+)\.jpg$ /icons/$1.gif [PT]
571 </pre>
572
573
574 <p>
575 Dans l'exemple précédent, en l'absence du drapeau [PT], l'Alias aurait
576 été ignoré, ce qui aurait provoqué une erreur 'File not found'.
577 </p>
578
579 <p>Avec le drapeau <code>PT</code>, le drapeau <code>L</code> est
580 implicite : la réécriture s'arrêtera afin de transmettre la requête à la
581 phase suivante du traitement.</p>
582
583 <p>Notez que le drapeau <code>PT</code> est implicite dans des contextes
584 de répertoire comme les sections <code class="directive"><a href="../mod/core.html#directory">&lt;Directory&gt;</a></code> ou les fichiers
585 <code>.htaccess</code>. Le seul moyen de contourner ceci consiste à
586 réécrire vers <code>-</code>.</p>
587
588 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
589 <div class="section">
590 <h2><a name="flag_qsa" id="flag_qsa">QSA|qsappend</a></h2>
591 <p>
592 Quand l'URI de remplacement contient une chaîne de requête, le
593 comportement par défaut de la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est de supprimer la <code>
594 query string</code> (il s'agit des paramètres éventuellement passés dans l'URL après le
595 caractère <code>?</code>, usuellement pour les formulaires traités par la
596 méthode HTTP <code>GET</code>) existante, et de la remplacer par celle nouvellement créée.
597 Avec le drapeau [QSA], les chaînes de requête peuvent être combinées.
598 </p>
599
600 <p>Considérons la règle suivante :</p>
601
602 <pre class="prettyprint lang-config">RewriteRule /pages/(.+) /page.php?page=$1
603 [QSA]</pre>
604
605
606 <p>Avec le drapeau [QSA], une requête pour
607 <code>/pages/123?one=two</code> sera réécrite en
608 <code>/page.php?page=123&amp;one=two</code>. Sans le drapeau [QSA], la
609 même requête sera réécrite en <code>/page.php?page=123</code> -
610 autrement dit, la chaîne de requête (<code>query string</code>) existante sera supprimée.
611 </p>
612 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
613 <div class="section">
614 <h2><a name="flag_qsd" id="flag_qsd">QSD|qsdiscard</a></h2>
615 <p>
616 Lorsque l'URI de la requête contient une chaîne de paramètres, et si
617 l'URI cible n'en contient pas, le comportement par défaut de la
618 directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> consiste à copier cette
619 chaîne de paramètres dans l'URI cible. Avec le drapeau [QSD], la chaîne
620 de paramètres est supprimée.
621 </p>
622
623 <p>Ce drapeau est disponible dans les versions 2.4.0 et supérieures.</p>
624
625 <p>
626 Lorsque les drapeaux [QSD] et [QSA] sont utilisés ensemble, c'est le
627 drapeau [QSD] qui l'emporte.
628 </p>
629
630 <p>
631 Si l'URI cible possède une chaîne de paramètres, le comportement par
632 défaut sera respecté - c'est à dire que la chaîne de paramètres
633 originale sera supprimée et remplacée par la chaîne de paramètres de
634 l'URI cible.
635 </p>
636
637 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
638 <div class="section">
639 <h2><a name="flag_r" id="flag_r">R|redirect</a></h2>
640 <p>
641 L'utilisation du drapeau [R] provoque l'envoi d'une redirection au
642 navigateur. Si une URL pleinement qualifiée (FQDN - fully qualified domain name)
643  est spécifiée (c'est à dire incluant <code>http://nom-du-serveur/</code>),
644  une redirection sera effectuée vers cette adresse. Dans le cas contraire,
645  le protocole courant, le nom du serveur et le numéro de port seront
646  utilisés pour générer l'URL envoyée avec la redirection.
647 </p>
648
649 <p><em>Tout</em> code de statut de réponse HTTP valide peut être
650 spécifié, en utilisant la syntaxe [R=305], le code de statut 302 étant
651 utilisé par défaut si aucun code n'est spécifié. Le code de statut
652 spécifié n'est pas nécessairement un code de statut
653 de redirection (3xx). Cependant, si le code de statut est en dehors de la plage des codes de
654 redirection (300-399), la chaîne de substitution est entièrement
655 supprimée, et la réécriture s'arrête comme si le drapeau <code>L</code>
656 était utilisé.</p>
657
658 <p>En plus des codes de statut de réponse, vous pouvez spécifier les
659 codes de redirection en utilisant leurs noms symboliques :
660 <code>temp</code> (défaut), <code>permanent</code>, ou
661 <code>seeother</code>.</p>
662
663 <p>
664 Vous utiliserez presque toujours [R] en conjonction avec [L] (c'est à
665 dire [R,L]), car employé seul, le drapeau [R] préfixe l'URI avec
666 <code>http://cet-hôte[:ce-port]</code>, mais passe ensuite cette adresse
667 à la règle suivante, ce qui provoquera le plus souvent des
668 avertissements 'Invalid URI in request'.
669 </p>
670
671 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
672 <div class="section">
673 <h2><a name="flag_s" id="flag_s">S|skip</a></h2>
674 <p>Le drapeau [S] sert à sauter des règles que vous ne voulez pas voir
675 exécuter. La syntaxe du drapeau [S] est [S=<em>N</em>], où
676 <em>N</em> correspond au nombre de règles à sauter.
677 Ceci peut s'interpréter comme une instruction
678 <code>goto</code>  dans votre jeu de règles de réécriture. Dans
679 l'exemple suivant, nous ne voulons exécuter la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> que si l'URI demandé ne
680 correspond pas à un fichier existant.</p>
681 <pre class="prettyprint lang-config">
682 # La requête concerne-t-elle un fichier qui n'existe pas ?
683 RewriteCond %{REQUEST_FILENAME} !-f
684 RewriteCond %{REQUEST_FILENAME} !-d
685 # Si c'est la cas, on saute les deux règles de réécriture suivantes
686 RewriteRule .? - [S=2]
687
688 RewriteRule (.*\.gif) images.php?$1
689 RewriteRule (.*\.html) docs.php?$1
690 </pre>
691
692
693
694
695 <p>Cette technique trouve son utilité dans le fait qu'une directive
696 <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> ne s'applique
697 qu'à la règle qui la suit immédiatement. Ainsi, si vous voulez
698 qu'une directive <code>RewriteCond</code> s'applique à plusieurs règles
699 <code>RewriteRule</code>, une technique possible consiste à inverser ces
700 conditions et ajouter une <code>RewriteRule</code> avec le drapeau [Skip]. Cette technique permet
701 d'élaborer des pseudo-constructions if-then-else : la dernière règle du
702 bloc then contiendra <code>skip=N</code>, où N est le nombre de règles
703 contenues dans le bloc else :</p>
704 <pre class="prettyprint lang-config">
705 # Est-ce que le fichier existe ?
706 RewriteCond %{REQUEST_FILENAME} !-f
707 RewriteCond %{REQUEST_FILENAME} !-d
708 # Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.
709 RewriteRule .? - [S=3]
710
711 # Si le fichier existe, alors :
712 RewriteRule (.*\.gif) images.php?$1
713     RewriteRule (.*\.html) docs.php?$1
714     # Skip past the "else" stanza.
715     RewriteRule .? - [S=1]
716 # ELSE...
717 RewriteRule (.*) 404.php?file=$1
718 # END
719 </pre>
720
721
722 <p>Il est probablement plus aisé de définir ce genre de configuration
723 via les directives <code class="directive">&lt;If&gt;</code>, <code class="directive">&lt;ElseIf&gt;</code>, et <code class="directive">&lt;Else&gt;</code>.</p>
724
725 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
726 <div class="section">
727 <h2><a name="flag_t" id="flag_t">T|type</a></h2>
728 <p>Définit le type MIME de la réponse résultante renvoyée. L'effet est
729 identique à celui de la directive <code class="directive"><a href="../mod/mod_mime.html#addtype">AddType</a></code>.</p>
730
731 <p>Par exemple, vous pouvez utiliser la technique suivante pour servir
732 du code source Perl en tant que plein texte, s'il est requis d'une
733 certaine manière :</p>
734
735 <pre class="prettyprint lang-config">
736 # Sert les fichier .pl en tant que plein texte
737 RewriteRule \.pl$ - [T=text/plain]
738 </pre>
739
740
741 <p>Ou encore, si vous possédez une caméra qui produit des fichiers
742 images jpeg sans extension, vous pouvez forcer le renvoi de ces images
743 avec le type MIME correct en se basant sur le nom du fichier :</p>
744
745 <pre class="prettyprint lang-config">
746 # Les fichiers dont le nom contient 'IMG' sont des images jpg.
747 RewriteRule IMG - [T=image/jpg]
748 </pre>
749
750
751 <p>Notez cependant qu'il s'agit d'un exemple trivial, et que le problème
752 aurait pu être résolu en utilisant à la place la directive <code class="directive"><a href="../mod/core.html#filesmatch">&lt;FilesMatch&gt;</a></code>. Il faut toujours
753 envisager la possibilité d'une solution alternative à un problème avant
754 d'avoir recours à la réécriture, qui sera toujours moins efficace qu'une
755 solution alternative.</p>
756
757 <p>
758 Dans un contexte de niveau répertoire, n'utilisez que <code>-</code>
759 (tiret) comme substitution, <em>dans toute la séquence de réécriture de
760 mod_rewrite</em>, sinon le type MIME défini avec ce drapeau
761 sera perdu suite à un retraitement interne (y compris les séquences de
762 réécriture suivantes de mod_rewrite). Dans ce contexte, vous pouvez
763 utiliser le drapeau <code>L</code> pour terminer la séquence
764 <em>courante</em> de réécriture de mod_rewrite.</p>
765
766 </div></div>
767 <div class="bottomlang">
768 <p><span>Langues Disponibles: </span><a href="../en/rewrite/flags.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
769 <a href="../fr/rewrite/flags.html" title="Français">&nbsp;fr&nbsp;</a></p>
770 </div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
771 <script type="text/javascript"><!--//--><![CDATA[//><!--
772 var comments_shortname = 'httpd';
773 var comments_identifier = 'http://httpd.apache.org/docs/2.4/rewrite/flags.html';
774 (function(w, d) {
775     if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
776         d.write('<div id="comments_thread"><\/div>');
777         var s = d.createElement('script');
778         s.type = 'text/javascript';
779         s.async = true;
780         s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
781         (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
782     }
783     else { 
784         d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
785     }
786 })(window, document);
787 //--><!]]></script></div><div id="footer">
788 <p class="apache">Copyright 2012 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
789 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
790 if (typeof(prettyPrint) !== 'undefined') {
791     prettyPrint();
792 }
793 //--><!]]></script>
794 </body></html>