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