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" />
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7 This file is generated from xml source: DO NOT EDIT
8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
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">
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="<-" alt="<-" src="../images/left.gif" /></a></div>
24 <a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Serveur HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.5</a> > <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>Advanced Techniques with mod_rewrite</h1>
26 <p><span>Langues Disponibles: </span><a href="../en/rewrite/advanced.html" hreflang="en" rel="alternate" title="English"> en </a> |
27 <a href="../fr/rewrite/advanced.html" title="Français"> fr </a></p>
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>
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>
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>
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">¶</a></h2>
63 <dt>Description :</dt>
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>
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>
80 <div class="example"><p><code>
81 utilisateur1 serveur_physique_utilisateur1<br />
82 utilisateur2 serveur_physique_utilisateur2<br />
86 <p>Tout ceci est enregistré dans un fichier
87 <code>correspondances-utilisateurs-serveurs</code>. Le but est de
88 faire correspondre</p>
90 <div class="example"><p><code>
91 /u/utilisateur1/chemin
96 <div class="example"><p><code>
97 http://serveur_physique_utilisateur1/u/utilisateur/chemin
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>
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>
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>
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">¶</a></h2>
124 <dt>Description :</dt>
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>
138 A cet effet, on utilise le jeu de règles suivant :
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>
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>
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>
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">¶</a></h2>
170 <dt>Description :</dt>
173 <p>Nous voulons répartir la charge de manière aléatoire entre
174 plusieurs serveurs en utilisant mod_rewrite.</p>
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
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>
188 <p><code>liste-serveurs.txt</code> contiendra la liste des serveurs :</p>
190 <div class="example"><p><code>
191 ## liste-serveurs.txt<br />
193 serveurs un.example.com|deux.example.com|trois.example.com<br />
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>
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>
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">¶</a></h2>
216 <dt>Description :</dt>
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>
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>
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>
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">¶</a></h2>
249 <dt>Description :</dt>
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
261 <p>On utilise le drapeau <code>[NE]</code> dans la règle
262 <code>RewriteRule</code>. NE signifie "No Escape".
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
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">¶</a></h2>
279 <dt>Description :</dt>
282 <p>Nous voulons servir des contenus différents selon l'heure du
283 jour en utilisant mod_rewrite.</p>
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><STRING</code>,
293 <code>>STRING</code> et <code>=STRING</code>, elles
294 permettent d'effectuer des redirections dépendant de
297 <pre class="prettyprint lang-config">RewriteEngine on
298 RewriteCond "%{TIME_HOUR}%{TIME_MIN}" >0700
299 RewriteCond "%{TIME_HOUR}%{TIME_MIN}" <1900
300 RewriteRule "^foo\.html$" "foo.day.html" [L]
301 RewriteRule "^foo\.html$" "foo.night.html"</pre>
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>
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>
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">¶</a></h2>
326 <dt>Description :</dt>
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>
340 <p>Utiliser le drapeau [E] pour définir une variable
343 <pre class="prettyprint lang-config">RewriteEngine on
344 RewriteRule "^/cheval/(.*)" "/poney/$1" [E=<strong>rewritten:1</strong>]</pre>
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
351 <pre class="prettyprint lang-config">RewriteCond "%{ENV:rewritten}" =1</pre>
358 <div class="bottomlang">
359 <p><span>Langues Disponibles: </span><a href="../en/rewrite/advanced.html" hreflang="en" rel="alternate" title="English"> en </a> |
360 <a href="../fr/rewrite/advanced.html" title="Français"> fr </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&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';
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';
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);
375 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
377 })(window, document);
378 //--><!]]></script></div><div id="footer">
379 <p class="apache">Copyright 2018 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') {