fb1fddbcd9e9390685418df09e359905f3e05005
[apache-httpd.git] / docs / manual / rewrite / advanced.html.fr.utf8
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head>
4 <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5 <!--
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7               This file is generated from xml source: DO NOT EDIT
8         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9       -->
10 <title>Advanced Techniques with mod_rewrite - Serveur HTTP Apache Version 2.5</title>
11 <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
12 <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
13 <link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
14 <script src="../style/scripts/prettify.min.js" type="text/javascript">
15 </script>
16
17 <link href="../images/favicon.ico" rel="shortcut icon" /></head>
18 <body id="manual-page"><div id="page-header">
19 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p>
20 <p class="apache">Serveur HTTP Apache Version 2.5</p>
21 <img alt="" src="../images/feather.png" /></div>
22 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
23 <div id="path">
24 <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>Advanced Techniques with mod_rewrite</h1>
25 <div class="toplang">
26 <p><span>Langues Disponibles: </span><a href="../en/rewrite/advanced.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
27 <a href="../fr/rewrite/advanced.html" title="Français">&nbsp;fr&nbsp;</a></p>
28 </div>
29
30
31 <p>Ce document complète la <a href="../mod/mod_rewrite.html">documentation de référence</a> du
32     module <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>. Il présente un certain nombre
33     de techniques avancées quant à
34     l'utilisation de mod_rewrite.</p>
35
36
37
38 <div class="warning">Notez que la plupart des exemples ne fonctionneront
39 pas en l'état dans la configuration particulière de votre serveur ; il
40 est donc important de bien comprendre leur fonctionnement, plutôt que de
41 simplement les copier/coller dans votre configuration.</div>
42
43 </div>
44 <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#sharding">Distribution de la charge entre plusieurs serveurs
45   d'arrière-plan en fonction de l'adresse IP</a></li>
46 <li><img alt="" src="../images/down.gif" /> <a href="#on-the-fly-content">Régéneration de contenu à la volée</a></li>
47 <li><img alt="" src="../images/down.gif" /> <a href="#load-balancing">Répartition de charge</a></li>
48 <li><img alt="" src="../images/down.gif" /> <a href="#structuredhomedirs">Répertoires Home structurés</a></li>
49 <li><img alt="" src="../images/down.gif" /> <a href="#redirectanchors">Redirection des ancrages</a></li>
50 <li><img alt="" src="../images/down.gif" /> <a href="#time-dependent">Réécriture dépendant de l'heure</a></li>
51 <li><img alt="" src="../images/down.gif" /> <a href="#setenvvars">Définir des variables d'environnement en fonction de
52       certaines parties de l'URL</a></li>
53 </ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en
54 correspondance</a></li><li><a href="access.html">Contrôler l'accès</a></li><li><a href="vhosts.html">serveurs virtuels</a></li><li><a href="proxy.html">serveurs mandataires</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li><li><a href="#comments_section">Commentaires</a></li></ul></div>
55 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
56 <div class="section">
57 <h2><a name="sharding" id="sharding">Distribution de la charge entre plusieurs serveurs
58   d'arrière-plan en fonction de l'adresse IP</a> <a title="Lien permanent" href="#sharding" class="permalink">&para;</a></h2>
59
60   
61
62   <dl>
63     <dt>Description :</dt>
64
65     <dd>
66       <p>La fragmentation ou "sharding" est une technique courante de
67       distribution de la charge du serveur ou de l'espace de stockage.
68       Quand on utilise cette méthode, un serveur frontal utilise l'URL
69       pour répartir de manière appropriée les utilisateurs et objets
70       entre différents serveurs d'arrière-plan.</p>
71     </dd>
72
73     <dt>Solution :</dt>
74
75     <dd>
76       <p>On maintient une table de correspondance entre utilisateurs et
77       serveurs cibles dans des fichiers externes. Ces derniers se
78       présentent comme suit :</p>
79
80 <div class="example"><p><code>
81 utilisateur1  serveur_physique_utilisateur1<br />
82 utilisateur2  serveur_physique_utilisateur2<br />
83 :      :
84 </code></p></div>
85
86   <p>Tout ceci est enregistré dans un fichier
87   <code>correspondances-utilisateurs-serveurs</code>. Le but est de
88   faire correspondre</p>
89
90 <div class="example"><p><code>
91 /u/utilisateur1/chemin
92 </code></p></div>
93
94   <p>avec</p>
95
96 <div class="example"><p><code>
97 http://serveur_physique_utilisateur1/u/utilisateur/chemin
98 </code></p></div>
99
100       <p>il n'est ainsi pas nécessaire que tous les chemins URL soient
101       valides sur tous les serveurs physiques d'arrière-plan. Le jeu de
102       règles suivant fait tout ceci pour nous, en s'appuyant sur les
103       fichiers de correspondances, en supposant que serveur0 est un
104       serveur par défaut qui sera utilisé lorsqu'un utilisateur ne
105       possèdera pas d'entrée dans la table de correspondances :</p>
106
107 <pre class="prettyprint lang-config">RewriteEngine on
108 RewriteMap      users-to-hosts   "txt:/path/to/map.users-to-hosts"
109 RewriteRule   "^/u/([^/]+)/?(.*)"   "http://${users-to-hosts:$1|server0}/u/$1/$2"</pre>
110
111     </dd>
112   </dl>
113
114   <p>Voir la documentation de <code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> pour une description plus
115   approfondie de la syntaxe de cette directive.</p>
116
117 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
118 <div class="section">
119 <h2><a name="on-the-fly-content" id="on-the-fly-content">Régéneration de contenu à la volée</a> <a title="Lien permanent" href="#on-the-fly-content" class="permalink">&para;</a></h2>
120
121   
122
123   <dl>
124     <dt>Description :</dt>
125
126     <dd>
127       <p>Nous voulons générer du contenu de manière dynamique, mais le
128       conserver de manière statique lorsqu'il a été généré. La règle
129       suivante vérifie l'existence du fichier statique, et le génère
130       s'il est absent. Les fichiers statiques peuvent être supprimés
131       périodiquement si on le désire (par exemple via cron), et seront
132       régénérés à la demande.</p>
133     </dd>
134
135     <dt>Solution :</dt>
136
137     <dd>
138       A cet effet, on utilise le jeu de règles suivant :
139
140 <pre class="prettyprint lang-config"># Cet exemple n'est valable que dans un contexte de répertoire
141 RewriteCond "%{REQUEST_URI}"   !-U
142 RewriteRule "^(.+)\.html$"          "/regenerate_page.cgi"   [PT,L]</pre>
143
144
145       <p>L'opérateur <code>-U</code> permet de déterminer si la chaîne
146       de test (dans ce cas <code>REQUEST_URI</code>) est une URL valide.
147       Pour ce faire, il utilise une sous-requête. Si cette sous-requête
148       échoue, ou en d'autres termes, si la ressource demandée n'existe pas,
149       cette règle invoque le programme CGI
150       <code>/regenerate_page.cgi</code> qui génère la ressource
151       demandée et la sauvegarde dans le répertoire des documents, de
152       façon à ce qu'une copie statique puisse être servie lors d'une
153       demande ultérieure.</p>
154
155     <p>De cette façon, les documents qui ne sont pas mis à jour
156     régulièrement peuvent être servis sous une forme statique. Si ces
157     documents doivent être réactualisés, on peut les supprimer du
158     répertoire des documents, et ils seront ainsi régénérés à la
159     prochaine demande.</p>
160     </dd>
161   </dl>
162
163 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
164 <div class="section">
165 <h2><a name="load-balancing" id="load-balancing">Répartition de charge</a> <a title="Lien permanent" href="#load-balancing" class="permalink">&para;</a></h2>
166
167   
168
169   <dl>
170     <dt>Description :</dt>
171
172     <dd>
173       <p>Nous voulons répartir la charge de manière aléatoire entre
174       plusieurs serveurs en utilisant mod_rewrite.</p>
175     </dd>
176
177     <dt>Solution :</dt>
178
179     <dd>
180       <p>Pour y parvenir, nous allons utiliser la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> et une liste de
181       serveurs.</p>
182
183 <pre class="prettyprint lang-config">RewriteEngine on
184 RewriteMap lb "rnd:/path/to/serverlist.txt"
185 RewriteRule "^/(.*)" "http://${lb:serveurs}/$1" [P,L]</pre>
186
187
188 <p><code>liste-serveurs.txt</code> contiendra la liste des serveurs :</p>
189
190 <div class="example"><p><code>
191 ## liste-serveurs.txt<br />
192 <br />
193 serveurs un.example.com|deux.example.com|trois.example.com<br />
194 </code></p></div>
195
196 <p>Si vous voulez qu'un serveur se voit confier d'avantage de charge que
197 les autres, faites le figurer plusieurs fois dans la liste.</p>
198
199    </dd>
200
201    <dt>Discussion</dt>
202    <dd>
203 <p>Apache possède un module de répartition de charge -
204 <code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> - beaucoup plus souple et présentant
205 plus de fonctionnalités dans ce domaine que mod_rewrite.</p>
206    </dd>
207   </dl>
208
209 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
210 <div class="section">
211 <h2><a name="structuredhomedirs" id="structuredhomedirs">Répertoires Home structurés</a> <a title="Lien permanent" href="#structuredhomedirs" class="permalink">&para;</a></h2>
212
213   
214
215   <dl>
216     <dt>Description :</dt>
217
218     <dd>
219       <p>Certains sites avec des milliers d'utilisateurs organisent
220           les répertoires utilisateurs de manière structurée, c'est à
221           dire que chaque répertoire utilisateur se trouve dans un
222           sous-répertoire dont le nom commence (par exemple) par le
223           premier caractère du nom de l'utilisateur. Ainsi,
224           <code>/~larry/chemin</code> correspond à
225           <code>/home/<strong>l</strong>/larry/public_html/chemin</code>, alors
226           que <code>/~waldo/chemin</code> correspond à
227           <code>/home/<strong>w</strong>/waldo/public_html/chemin</code>.</p>
228     </dd>
229
230     <dt>Solution :</dt>
231
232     <dd>
233       <p>On utilise le jeu de règles suivant pour développer les
234           URLs avec tilde selon l'organisation structurée précédente.</p>
235
236 <pre class="prettyprint lang-config">RewriteEngine on
237 RewriteRule   "^/~(<strong>([a-z])</strong>[a-z0-9]+)(.*)"  "/home/<strong>$2</strong>/$1/public_html$3"</pre>
238
239     </dd>
240   </dl>
241
242 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
243 <div class="section">
244 <h2><a name="redirectanchors" id="redirectanchors">Redirection des ancrages</a> <a title="Lien permanent" href="#redirectanchors" class="permalink">&para;</a></h2>
245
246   
247
248   <dl>
249     <dt>Description :</dt>
250
251     <dd>
252     <p>Par défaut, la redirection vers un ancrage HTML ne fonctionne
253         pas, car mod_rewrite échappe le caractère <code>#</code> en le
254         transformant en <code>%23</code>, ce qui rend la redirection
255         inopérante.</p>
256     </dd>
257
258     <dt>Solution :</dt>
259
260     <dd>
261       <p>On utilise le drapeau <code>[NE]</code> dans la règle
262           <code>RewriteRule</code>. NE signifie "No Escape".
263       </p>
264     </dd>
265
266     <dt>Discussion :</dt>
267     <dd>Cette technique fonctionne bien entendu pour tout autre
268     caractère spécial que mod_rewrite, par défaut, code pour insertion
269     dans une URL.</dd>
270   </dl>
271
272 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
273 <div class="section">
274 <h2><a name="time-dependent" id="time-dependent">Réécriture dépendant de l'heure</a> <a title="Lien permanent" href="#time-dependent" class="permalink">&para;</a></h2>
275
276   
277
278   <dl>
279     <dt>Description :</dt>
280
281     <dd>
282       <p>Nous voulons servir des contenus différents selon l'heure du
283       jour en utilisant mod_rewrite.</p>
284     </dd>
285
286     <dt>Solution :</dt>
287
288     <dd>
289       <p>Il existe de nombreuses variables nommées
290           <code>TIME_xxx</code> utilisables dans les conditions de
291           réécriture. Utilisées en conjonction avec les modèles de
292           comparaison lexicographique spéciaux <code>&lt;STRING</code>,
293           <code>&gt;STRING</code> et <code>=STRING</code>, elles
294           permettent d'effectuer des redirections dépendant de
295           l'heure :</p>
296
297 <pre class="prettyprint lang-config">RewriteEngine on
298 RewriteCond   "%{TIME_HOUR}%{TIME_MIN}" &gt;0700
299 RewriteCond   "%{TIME_HOUR}%{TIME_MIN}" &lt;1900
300 RewriteRule   "^foo\.html$"             "foo.day.html" [L]
301 RewriteRule   "^foo\.html$"             "foo.night.html"</pre>
302
303
304       <p>Avec cet exemple, l'URL <code>foo.html</code> renvoie
305           le contenu de <code>foo.jour.html</code> durant le
306           créneau horaire <code>07:01-18:59</code>, et le contenu de
307           <code>foo.nuit.html</code> le reste du temps.</p>
308
309       <div class="warning"><code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code>, les mandataires
310         intermédiaires et les navigateurs peuvent chacun mettre en cache
311         les réponses et ainsi afficher une des deux pages en dehors de
312         la fenêtre de temps configurée. On peut utiliser
313         <code class="module"><a href="../mod/mod_expires.html">mod_expires</a></code> pour contourner ce problème. Il est
314         cependant bien plus commode de servir un contenu dynamique, et
315         de le personnaliser en fonction de l'heure du jour.</div> </dd>
316   </dl>
317
318 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
319 <div class="section">
320 <h2><a name="setenvvars" id="setenvvars">Définir des variables d'environnement en fonction de
321       certaines parties de l'URL</a> <a title="Lien permanent" href="#setenvvars" class="permalink">&para;</a></h2>
322
323   
324
325   <dl>
326     <dt>Description :</dt>
327
328     <dd>
329       <p>Ici, nous voulons conserver une certaine forme de statut
330       lorsqu'une réécriture a eu lieu. Par exemple, vous souhaitez
331       consigner le fait que cette réécriture a eu lieu, et vous servir
332       plus tard de cette information pour déterminer si une requête sera
333       concernée par cette réécriture. Pour y parvenir, on peut utiliser
334       une variable d'environnement.</p>
335     </dd>
336
337     <dt>Solution :</dt>
338
339     <dd>
340       <p>Utiliser le drapeau [E] pour définir une variable
341       d'environnement.</p>
342
343 <pre class="prettyprint lang-config">RewriteEngine on
344 RewriteRule   "^/cheval/(.*)"   "/poney/$1" [E=<strong>rewritten:1</strong>]</pre>
345
346
347     <p>Plus loin dans votre jeu de règles, vous pouvez vérifier le
348     contenu de cette variable d'environnement via une directive
349     RewriteCond :</p>
350
351 <pre class="prettyprint lang-config">RewriteCond "%{ENV:rewritten}" =1</pre>
352
353
354     </dd>
355   </dl>
356
357 </div></div>
358 <div class="bottomlang">
359 <p><span>Langues Disponibles: </span><a href="../en/rewrite/advanced.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
360 <a href="../fr/rewrite/advanced.html" title="Français">&nbsp;fr&nbsp;</a></p>
361 </div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
362 <script type="text/javascript"><!--//--><![CDATA[//><!--
363 var comments_shortname = 'httpd';
364 var comments_identifier = 'http://httpd.apache.org/docs/trunk/rewrite/advanced.html';
365 (function(w, d) {
366     if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
367         d.write('<div id="comments_thread"><\/div>');
368         var s = d.createElement('script');
369         s.type = 'text/javascript';
370         s.async = true;
371         s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
372         (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
373     }
374     else {
375         d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
376     }
377 })(window, document);
378 //--><!]]></script></div><div id="footer">
379 <p class="apache">Copyright 2019 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
380 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
381 if (typeof(prettyPrint) !== 'undefined') {
382     prettyPrint();
383 }
384 //--><!]]></script>
385 </body></html>