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