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