]> granicus.if.org Git - apache/blob - docs/manual/rewrite/intro.xml.fr
Link to canonical hostnames recipe from "avoid" document.
[apache] / docs / manual / rewrite / intro.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: 1654831:1673945 (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="intro.xml.meta">
26 <parentdocument href="./">Rewrite</parentdocument>
27
28   <title>Introduction au module Apache mod_rewrite</title>
29
30 <summary>
31 <p>Ce document est un compl&eacute;ment &agrave; la <a
32 href="../mod/mod_rewrite.html">documentation de r&eacute;f&eacute;rence</a> du module
33 <module>mod_rewrite</module>. Il d&eacute;crit les concepts de base dont la
34 connaissance est n&eacute;cessaire pour l'utilisation de
35 <module>mod_rewrite</module>. D'autres documents entrent d'avantage dans
36 les d&eacute;tails, mais celui-ci devrait aider le d&eacute;butant &agrave; se mouiller les
37 pieds.
38 </p>
39 </summary>
40
41 <seealso><a href="../mod/mod_rewrite.html">Documentation du
42 module mod_rewrite</a></seealso>
43 <!-- <seealso><a href="intro.html">Introduction &agrave; mod_rewrite</a></seealso> -->
44 <seealso><a href="remapping.html">Redirection and remise en
45 correspondance</a></seealso>
46 <seealso><a href="access.html">Contr&ocirc;le d'acc&egrave;s</a></seealso>
47 <seealso><a href="vhosts.html">Serveurs virtuels</a></seealso>
48 <seealso><a href="proxy.html">Mise en cache</a></seealso>
49 <seealso><a href="rewritemap.html">Utilisation de RewriteMap</a></seealso>
50 <seealso><a href="advanced.html">Techniques avanc&eacute;es</a></seealso>
51 <seealso><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></seealso>
52
53 <section id="introduction"><title>Introduction</title>
54 <p>Le module Apache <module>mod_rewrite</module> est un module puissant
55 et sophistiqu&eacute; qui permet la r&eacute;&eacute;criture des URLs. Gr&acirc;ce &agrave; lui, vous
56 pouvez effectuer quasiment tous les types de r&eacute;&eacute;criture d'URLs dont vous
57 avez besoin. Il est cependant assez complexe, et peut para&icirc;tre
58 intimidant au d&eacute;butant. Certains ont aussi tendance &agrave; traiter les
59 r&egrave;gles de r&eacute;&eacute;criture comme des incantations magiques, et &agrave; les utiliser
60 sans vraiment comprendre leur mani&egrave;re d'agir.</p>
61
62 <p>Ce document a pour ambition d'&ecirc;tre suffisamment explicite pour
63 permettre la compr&eacute;hension, et non la copie en aveugle, de ce qui suit.
64 </p>
65
66 <p>Gardez &agrave; l'esprit que de nombreuses t&acirc;ches de manipulation d'URLs
67 courantes n'ont pas besoin de la puissance et de la complexit&eacute; de
68 <module>mod_rewrite</module>. Pour les t&acirc;ches simples, voir
69 <module>mod_alias</module> et la documentation sur la <a
70 href="../urlmapping.html">Mise en correspondance des URLs avec le
71 syst&egrave;me de fichiers</a>.</p>
72
73 <p>Enfin, avant de proc&eacute;der, assurez-vous d'avoir configur&eacute; le niveau de
74 journalisation de <module>mod_rewrite</module> &agrave; un des niveaux de trace
75 via la directive <directive module="core">LogLevel</directive>. Bien que
76 ceci risque de vous submerger sous une &eacute;norme quantit&eacute; d'informations,
77 le d&eacute;bogage des probl&egrave;mes avec la configuration de
78 <module>mod_rewrite</module> est &agrave; ce prix car vous verrez alors
79 exactement comment chaque r&egrave;gle est trait&eacute;e.</p>
80
81 </section>
82
83 <section id="regex"><title>Expressions rationnelles</title>
84
85 <p>mod_rewrite utilise le vocabulaire des <a
86 href="http://pcre.org/">Expressions rationnelles compatibles Perl</a>.
87 Ce document n'a pas pour pr&eacute;tention d'&ecirc;tre une r&eacute;f&eacute;rence d&eacute;taill&eacute;e des
88 expressions rationnelles. A cet effet, nous recommandons les <a
89 href="http://pcre.org/pcre.txt">pages de manuel de PCRE</a>, la <a
90 href="http://perldoc.perl.org/perlre.html">page de manuel des
91 expressions rationnelles Perl</a>, et l'ouvrage <a
92 href="http://shop.oreilly.com/product/9780596528126.do">Mastering
93 Regular Expressions, by Jeffrey Friedl</a>.</p>
94
95 <p>Dans ce document, nous avons pour but de vous fournir suffisamment de
96 vocabulaire des expressions rationnelles pour vous mettre le pied &agrave;
97 l'&eacute;trier, sans &ecirc;tre d&eacute;pass&eacute;, en esp&eacute;rant que les directives <directive
98 module="mod_rewrite">RewriteRule</directive> vous appara&icirc;tront comme des
99 formules scientifiques, plut&ocirc;t que comme des incantations magiques.</p>
100
101 <section id="regexvocab"><title>Vocabulaire des expressions rationnelles</title>
102
103 <p>Vous trouverez dans ce qui suit le minimum &agrave; conna&icirc;tre pour &ecirc;tre en
104 mesure d'&eacute;crire des expressions rationnelles et des r&egrave;gles <directive
105 module="mod_rewrite">RewriteRule</directive>. Ceci ne repr&eacute;sente
106 certainement pas un vocabulaire des expressions rationnelles complet,
107 mais constitue un bon point de d&eacute;part, et devrait vous aider &agrave;
108 d&eacute;chiffrer les expressions rationnelles simples, et &agrave; &eacute;crire vos propres
109 expressions.</p>
110
111 <table>
112 <tr>
113 <th>Motif</th>
114 <th>Signification</th>
115 <th>Exemple</th>
116 </tr>
117
118 <tr><td><code>.</code></td><td>Correspond &agrave; tout caract&egrave;re unique
119 </td><td><code>c.t</code> correspondra &agrave; <code>cat</code>,
120 <code>cot</code>, <code>cut</code>, etc.</td></tr>
121 <tr><td><code>+</code></td><td>R&eacute;p&egrave;te le caract&egrave;re de correspondance
122 pr&eacute;c&eacute;dent une ou plusieurs fois</td>
123 <td><code>a+</code> correspond &agrave; <code>a</code>, <code>aa</code>,
124 <code>aaa</code>, etc.</td></tr>
125 <tr><td><code>*</code></td><td>R&eacute;p&egrave;te le caract&egrave;re de correspondance
126 pr&eacute;c&eacute;dent z&eacute;ro ou plusieurs fois</td>
127 <td><code>a*</code> correspond &agrave; tout ce &agrave; quoi correspond
128 <code>a+</code>, mais correspond aussi &agrave; la cha&icirc;ne vide.</td></tr>
129 <tr><td><code>?</code></td><td>Rend la correspondance optionnelle.</td><td>
130 <code>colou?r</code> correspondra &agrave; <code>color</code> et <code>colour</code>.</td>
131 </tr>
132 <tr><td><code>^</code></td><td>Appel&eacute; ancrage, correspond au d&eacute;but de la
133 cha&icirc;ne</td>
134 <td><code>^a</code> correspond &agrave; une cha&icirc;ne qui commence par
135 <code>a</code></td></tr>
136 <tr><td><code>$</code></td><td>L'autre ancrage, correspond &agrave; la fin de
137 la cha&icirc;ne.</td>
138 <td><code>a$</code> correspond &agrave; une cha&icirc;ne qui se termine par
139 <code>a</code>.</td></tr>
140 <tr><td><code>( )</code></td><td>Regroupe plusieurs caract&egrave;res en une
141 seule entit&eacute;, et conserve une correspondance &agrave; des fins d'utilisation
142 dans une r&eacute;f&eacute;rence arri&egrave;re.</td>
143 <td><code>(ab)+</code>
144 correspond &agrave; <code>ababab</code> - &agrave; savoir, le <code>+</code>
145 s'applique au groupe.
146 Pour plus de d&eacute;tails sur les r&eacute;f&eacute;rences arri&egrave;res, voir <a
147 href="#InternalBackRefs">ci-dessous</a>.</td></tr>
148 <tr><td><code>[ ]</code></td><td>Une classe de caract&egrave;res - correspond &agrave;
149 un des caract&egrave;res de la classe</td>
150 <td><code>c[uoa]t</code> correspond &agrave; <code>cut</code>,
151 <code>cot</code> ou <code>cat</code>.</td></tr>
152 <tr><td><code>[^ ]</code></td><td>N&eacute;gation de la classe de caract&egrave;res -
153 correspond &agrave; tout caract&egrave;re ne faisant pas partie de la classe</td>
154 <td><code>c[^/]t</code> correspond &agrave; <code>cat</code> ou
155 <code>c=t</code> mais pas &agrave; <code>c/t</code></td></tr>
156 </table>
157
158 <p>Avec <module>mod_rewrite</module>, le caract&egrave;re <code>!</code> peut
159 pr&eacute;fixer une expression rationnelle afin d'en exprimer la n&eacute;gation.
160 Autrement dit, une cha&icirc;ne ne correspondra que si elle ne correspond pas
161 &agrave; l'expression situ&eacute;e apr&egrave;s le <code>!</code>.</p>
162
163 </section>
164
165 <section id="InternalBackRefs"><title>Disponibilit&eacute; des r&eacute;f&eacute;rences
166 arri&egrave;res dans les expressions rationnelles</title>
167
168       <p>Vous devez vous souvenir d'une chose importante : chaque fois
169       que vous utilisez des parenth&egrave;ses dans un <em>Mod&egrave;le</em> ou dans
170       un des <em>mod&egrave;les de conditions</em>, des r&eacute;f&eacute;rences arri&egrave;res
171       sont cr&eacute;&eacute;es en interne et peuvent &ecirc;tre rappel&eacute;es via les cha&icirc;nes
172       <code>$N</code> et <code>%N</code> (voir ci-dessous). Ces
173       r&eacute;f&eacute;rences sont disponibles lors de la
174       cr&eacute;ation de la cha&icirc;ne de substitution d'une directive
175       <directive module="mod_rewrite">RewriteRule</directive> ou de la
176       cha&icirc;ne de test d'une directive <directive
177       module="mod_rewrite">RewriteCond</directive>.</p>
178       <p>Les captures dans les mod&egrave;les de directives <directive
179       module="mod_rewrite">RewriteRule</directive> sont paradoxalement
180       disponibles dans toutes les directives <directive
181       module="mod_rewrite">RewriteCond</directive> qui pr&eacute;c&egrave;dent, car
182       les expressions des directives <directive
183       module="mod_rewrite">RewriteRule</directive> sont &eacute;valu&eacute;es avant
184       les conditions individuelles.</p>
185       
186       <p>La figure 1 montre &agrave; quels endroits les
187       r&eacute;f&eacute;rences arri&egrave;res sont suceptibles
188       d'&ecirc;tre d&eacute;velopp&eacute;es, et illustre le flux des comparaisons
189       effectu&eacute;es par les r&egrave;gles RewriteRule et
190       RewriteCond. Dans les chapitres suivants, nous examinerons comment
191       utiliser ces r&eacute;f&eacute;rences arri&egrave;res, donc ne vous affolez pas si
192       elles vous paraissent un peu exotiques au premier abord.</p>
193
194 <p class="figure">
195       <img src="../images/rewrite_backreferences.png"
196       alt="Flux des comparaisons effectu&eacute;es par les r&egrave;gles RewriteRule
197       et RewriteCond" /><br />
198       <dfn>Figure 1 :</dfn> Le cheminement d'une r&eacute;f&eacute;rence arri&egrave;re &agrave;
199       travers une r&egrave;gle.<br />
200       Dans cet exemple, une requ&ecirc;te pour <code>/test/1234</code> serait
201       transform&eacute;e en
202       <code>/admin.foo?page=test&amp;id=1234&amp;host=admin.example.com</code>.
203 </p>
204
205 </section>
206 </section>
207
208 <section id="rewriterule"><title>Les bases des r&egrave;gles de r&eacute;&eacute;criture</title>
209 <p>Une r&egrave;gle de r&eacute;&eacute;criture <directive
210 module="mod_rewrite">RewriteRule</directive> est constitu&eacute;e de trois
211 arguments s&eacute;par&eacute;s par des espaces. Les arguments sont :</p>
212 <ol>
213 <li><var>Mod&egrave;le</var>: le mod&egrave;le des URLs auxquelles la r&egrave;gle doit
214 s'appliquer;</li>
215 <li><var>Substitution</var>: vers quoi la requ&ecirc;te correspondante doit &ecirc;tre
216 transform&eacute;e;</li>
217 <li><var>[drapeaux]</var>: options affectant la requ&ecirc;te r&eacute;&eacute;crite.</li>
218 </ol>
219
220 <p>Le <var>Mod&egrave;le</var> est une <a href="#regex">expression
221 rationnelle</a>. Au sein de la premi&egrave;re r&egrave;gle de r&eacute;&eacute;criture, ou jusqu'&agrave;
222 ce qu'une substitution survienne, elle est compar&eacute;e au chemin de
223 l'URL de la requ&ecirc;te entrante (la
224 partie situ&eacute;e apr&egrave;s le nom d'h&ocirc;te mais avant tout point d'interrogation
225 qui indique le d&eacute;but d'une cha&icirc;ne de param&egrave;tres de
226 requ&ecirc;te) ou, dans un contexte de r&eacute;pertoire, au chemin de la
227 requ&ecirc;te relativement au r&eacute;pertoire pour lequel la
228 r&egrave;gle est d&eacute;finie. Lorsqu'une substitution a eu lieu, les
229 r&egrave;gles suivantes effectuent leurs comparaisons par rapport &agrave; la valeur
230 substitu&eacute;e.</p>
231
232 <p class="figure">
233       <img src="../images/syntax_rewriterule.png"
234       alt="Syntaxe de la directive RewriteRule" /><br />
235       <dfn>Figure 2 :</dfn> Syntaxe de la directive RewriteRule.
236 </p>
237
238 <p>La cha&icirc;ne de <var>Substitution</var> peut, quant &agrave; elle, &ecirc;tre de
239 trois types :</p>
240
241 <dl>
242 <dt>Un chemin complet du syst&egrave;me de fichiers vers une ressource</dt>
243 <dd>
244 <highlight language="config">
245 RewriteRule ^/jeux /usr/local/jeux/web
246 </highlight>
247 <p>Ceci peut faire correspondre une requ&ecirc;te &agrave; toute localisation voulue de
248 votre syst&egrave;me de fichiers, un peu comme la directive <directive
249 module="mod_alias">Alias</directive>.</p>
250 </dd>
251
252 <dt>Un chemin web vers une ressource</dt>
253 <dd>
254 <highlight language="config">
255 RewriteRule ^/foo$ /bar
256 </highlight>
257 <p>Si la directive <directive module="core">DocumentRoot</directive> a
258 pour valeur <code>/usr/local/apache2/htdocs</code>, cette r&egrave;gle va faire
259 correspondre les requ&ecirc;tes pour <code>http://example.com/foo</code> au
260 chemin <code>/usr/local/apache2/htdocs/bar</code>.</p>
261 </dd>
262
263 <dt>Une URL absolue</dt>
264 <dd>
265 <highlight language="config">
266 RewriteRule ^/produits/vues$ http://site2.example.com/voirproduits.html [R]
267 </highlight>
268 <p>Ceci informe le client qu'il doit effectuer une nouvelle requ&ecirc;te vers
269 l'URL sp&eacute;cifi&eacute;e.</p>
270 </dd>
271 </dl>
272
273 <p>La cha&icirc;ne de <var>Substitution</var> peut aussi contenir des
274 <em>r&eacute;f&eacute;rences arri&egrave;res</em> vers des parties du chemin d'URL entrant
275 correspondant au <var>Mod&egrave;le</var>. Consid&eacute;rons ce qui suit :</p>
276 <highlight language="config">
277 RewriteRule ^/produits/(.*)/view$ /var/web/produitsdb/$1
278 </highlight>
279 <p>La variable <code>$1</code> sera remplac&eacute;e par tout texte
280 correspondant &agrave; l'expression situ&eacute;e entre les parenth&egrave;ses dans le
281 <var>Mod&egrave;le</var>. Par exemple, une requ&ecirc;te pour
282 <code>http://example.com/produits/r14df/vue</code> correspondra au
283 chemin <code>/var/web/produitsdb/r14df</code>.</p>
284
285 <p>S'il y a plus d'une expression entre parenth&egrave;ses, elle seront
286 accessibles selon leur ordre d'apparition via les variables
287 <code>$1</code>, <code>$2</code>, <code>$3</code>, etc...</p>
288
289
290 </section>
291
292 <section id="flags"><title>Drapeaux de r&eacute;&eacute;criture</title>
293 <p>Le comportement d'une r&egrave;gle <directive
294 module="mod_rewrite">RewriteRule</directive> peut &ecirc;tre modifi&eacute; par la
295 pr&eacute;sence d'un ou plusieurs drapeaux en fin de r&egrave;gle. Par exemple, les
296 conditions de correspondance d'une r&egrave;gle peuvent &ecirc;tre rendues
297 insensibles &agrave; la casse par la pr&eacute;sence du drapeau <code>[NC]</code> :
298 </p>
299 <highlight language="config">
300 RewriteRule ^puppy.html petitchien.html [NC]
301 </highlight>
302
303 <p>Pour une liste des drapeaux disponibles, leurs significations, et des
304 exemples, voir le document <a href="flags.html">Drapeaux de
305 r&eacute;&eacute;criture</a>.</p>
306
307 </section>
308
309
310 <section id="rewritecond"><title>Conditions de r&eacute;&eacute;criture</title>
311 <p>Il est possible d'utiliser une ou plusieurs directives <directive
312 module="mod_rewrite">RewriteCond</directive> pour restreindre les types
313 de requ&ecirc;tes auxquelles devra s'appliquer la r&egrave;gle <directive
314 module="mod_rewrite">RewriteRule</directive> suivante. Le premier
315 argument est une variable d&eacute;crivant une caract&eacute;ristique de la requ&ecirc;te,
316 le second argument est une <a href="#regex">expression rationnelle</a>
317 qui doit correspondre &agrave; la variable, et un troisi&egrave;me argument optionnel
318 est une liste de drapeaux qui modifient la mani&egrave;re dont la
319 correspondance est &eacute;valu&eacute;e.</p>
320
321 <p class="figure">
322       <img src="../images/syntax_rewritecond.png"
323       alt="Syntaxe de la directive RewriteCond" /><br />
324       <dfn>Figure 3 :</dfn> Syntaxe de la directive RewriteCond
325 </p>
326
327
328 <p>Par exemple, pour renvoyer toutes les requ&ecirc;tes en provenance d'une
329 certaine tranche d'adresses IP vers un autre serveur, vous pouvez
330 utiliser :</p>
331 <highlight language="config">
332 RewriteCond %{REMOTE_ADDR} ^10\.2\.
333 RewriteRule (.*) http://intranet.example.com$1
334 </highlight>
335
336 <p>Si vous sp&eacute;cifiez plus d'une directive <directive
337 module="mod_rewrite">RewriteCond</directive>, ces directives
338 doivent toutes &ecirc;tre satisfaites pour que la r&egrave;gle <directive
339 module="mod_rewrite">RewriteRule</directive> suivante s'applique. Par exemple,
340 pour interdire les requ&ecirc;tes qui contiennent le mot "hack" dans la cha&icirc;ne
341 de requ&ecirc;te, sauf si elles contiennent aussi un cookie contenant le mot
342 "go", vous pouvez utiliser :</p>
343 <highlight language="config">
344 RewriteCond %{QUERY_STRING} hack
345 RewriteCond %{HTTP_COOKIE} !go
346 RewriteRule . - [F]
347 </highlight>
348 <p>Notez que le point d'exclamation indique une correspondance n&eacute;gative
349 ; ainsi, la r&egrave;gle n'est appliqu&eacute;e que si le cookie ne contient pas "go"</p>
350
351 <p>Les correspondances dans les expressions rationnelles contenues dans
352 les directives <directive module="mod_rewrite">RewriteCond</directive>
353 peuvent constituer des parties de la cha&icirc;ne de <var>Substitution</var>
354 de la r&egrave;gle <directive module="mod_rewrite">RewriteRule</directive> via
355 les variables <code>%1</code>, <code>%2</code>, etc... Par
356 exemple, ce qui suit va diriger la requ&ecirc;te vers un r&eacute;pertoire diff&eacute;rent
357 en fonction du nom d'h&ocirc;te utilis&eacute; pour acc&eacute;der au site :</p>
358 <highlight language="config">
359 RewriteCond %{HTTP_HOST} (.*)
360 RewriteRule ^/(.*) /sites/%1/$1
361 </highlight>
362 <p>Si la requ&ecirc;te concernait <code>http://example.com/foo/bar</code>,
363 alors <code>%1</code> contiendrait <code>example.com</code> et
364 <code>$1</code> contiendrait <code>foo/bar</code>.</p>
365
366
367
368 </section>
369
370 <section id="rewritemap"><title>Tables de r&eacute;&eacute;criture</title>
371
372 <p>La directive <directive module="mod_rewrite">RewriteMap</directive>
373 permet en quelque sorte de faire appel &agrave; une fonction externe pour
374 effectuer la r&eacute;&eacute;criture &agrave; votre place. Tout ceci est d&eacute;crit plus en
375 d&eacute;tails dans la <a href="rewritemap.html">Documentation
376 suppl&eacute;mentaire sur RewriteMap</a>.</p>
377 </section>
378
379 <section id="htaccess"><title>Fichiers .htaccess</title>
380
381 <p>La r&eacute;&eacute;criture est en g&eacute;n&eacute;ral d&eacute;finie au niveau de la configuration du
382 serveur principal (en dehors de toute section <directive type="section"
383 module="core">Directory</directive>) ou dans une section  <directive
384 type="section" module="core">VirtualHost</directive>. Il s'agit l&agrave; de la
385 mani&egrave;re la plus simple de mettre en oeuvre la r&eacute;&eacute;criture et nous la
386 recommandons. Il est possible, cependant, de mettre en oeuvre la
387 r&eacute;&eacute;criture au sein d'une section <directive type="section"
388 module="core">Directory</directive> ou d'un fichier <a
389 href="../howto/htaccess.html"><code>.htaccess</code></a> ; ce type de
390 configuration est cependant plus complexe. Cette technique est appel&eacute;e
391 r&eacute;&eacute;criture par r&eacute;pertoire.</p>
392
393 <p>La principale diff&eacute;rence avec les r&eacute;&eacute;critures au niveau du serveur r&eacute;side
394 dans le fait que le pr&eacute;fixe du chemin du r&eacute;pertoire contenant le fichier
395 <code>.htaccess</code> est supprim&eacute; avant la mise en correspondance dans
396 la r&egrave;gle <directive module="mod_rewrite">RewriteRule</directive>. De
397 plus, on doit utiliser la directive <directive
398 module="mod_rewrite">RewriteBase</directive> pour s'assurer que la
399 requ&ecirc;te est correctement mise en correspondance.</p>
400
401 </section>
402
403 </manualpage>
404