]> granicus.if.org Git - apache/blob - docs/manual/rewrite/tech.html.fr
Link to canonical hostnames recipe from "avoid" document.
[apache] / docs / manual / rewrite / tech.html.fr
1 <?xml version="1.0" encoding="ISO-8859-1"?>
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=ISO-8859-1" http-equiv="Content-Type" />
5 <!--
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7               This file is generated from xml source: DO NOT EDIT
8         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9       -->
10 <title>Détails techniques sur le module Apache mod_rewrite - Serveur Apache HTTP 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 Apache HTTP Version 2.5</p>
21 <img alt="" src="../images/feather.gif" /></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>Détails techniques sur le module Apache mod_rewrite</h1>
25 <div class="toplang">
26 <p><span>Langues Disponibles: </span><a href="../en/rewrite/tech.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
27 <a href="../fr/rewrite/tech.html" title="Français">&nbsp;fr&nbsp;</a></p>
28 </div>
29 <div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
30             anglaise pour les changements récents.</div>
31
32 <p>Ce document passe en revue certains détails techniques à propos du
33 module mod_rewrite et de la mise en correspondance des URLs</p>
34 </div>
35 <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#InternalAPI">Phases de l'API</a></li>
36 <li><img alt="" src="../images/down.gif" /> <a href="#InternalRuleset">Traitement du jeu de règles</a></li>
37 </ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en
38 correspondance</a></li><li><a href="access.html">Contrôle d'accès</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="proxy.html">Mise en cache</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="advanced.html">Techniques avancées</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li></ul><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div>
39 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
40 <div class="section">
41 <h2><a name="InternalAPI" id="InternalAPI">Phases de l'API</a></h2>
42
43       <p>Le traitement des requêtes par le serveur HTTP Apache se
44       déroule en plusieurs phases. Au cours de chaque phase, un ou
45       plusieurs modules peuvent être appelés pour traiter la partie
46       concernée du cycle de vie de la requête. Les différentes phases
47       peuvent consister en traduction d'URL en nom de fichier,
48       authentification, autorisation, gestion de contenu ou journalisation (la
49       liste n'est pas exhaustive).</p>
50
51     <p>mod_rewrite agit dans deux de ces phases (ou accroches - hooks -
52     comme on les nomme souvent) pour la réécriture des URLs.</p>
53
54     <p>Tout d'abord, il utilise le hook traduction URL vers nom de
55     fichier qui intervient après la lecture de la requête HTTP, mais
56     avant le processus d'autorisation. Ensuite, il utilise le hook
57     Fixup, qui intervient après les phases d'autorisation, après la
58     lecture des fichiers de configuration de niveau répertoire (fichiers
59     <code>.htaccess</code>), mais avant l'appel du gestionnaire de
60     contenu.</p>
61
62     <p>Lorsqu'une requête arrive et une fois le serveur
63     correspondant ou le serveur virtuel déterminé, le moteur de
64     réécriture commence à traiter toute directive apparaissant dans la
65     configuration de niveau serveur (autrement dit dans le
66     fichier de configuration principal du serveur et les sections
67     <code class="directive"><a href="../mod/core.html#virtualhost">&lt;Virtualhost&gt;</a></code>).
68     Tout ce processus s'exécute au cours de la phase de traduction URL
69     vers nom de fichier.</p>
70
71     <p>Quelques étapes plus loin, une fois les répertoires de données
72     finaux trouvés, les directives de configuration de niveau répertoire
73     (fichiers <code>.htaccess</code> et sections <code class="directive"><a href="../mod/core.html#directory">&lt;Directory&gt;</a></code>) sont appliquées. Ce processus
74     s'exécute au cours de la phase Fixup.</p>
75
76     <p>Dans tous ces cas, mod_rewrite réécrit le
77     <code>REQUEST_URI</code> soit vers une nouvelle URL, soit vers un
78     nom de fichier.</p>
79
80     <p>Dans un contexte de niveau répertoire (autrement dit dans les
81     fichiers <code>.htaccess</code> et les sections
82     <code>Directory</code>), les règles de réécriture s'appliquent après
83     la traduction de l'URL en nom de fichier. C'est pourquoi le chemin
84     URL auquel mod_rewrite compare initialement les directives
85     <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est le
86     chemin complet vers le nom de fichier traduit amputé de la partie
87     répertoires (y compris le dernier slash).</p>
88
89     <p>Un exemple : si les règles se trouvent dans
90     /var/www/foo/.htaccess et si une requête pour /foo/bar/baz est
91     traité, une expression comme ^bar/baz$ correspondra.</p>
92
93     <p>Si une substitution intervient dans un contexte de répertoire,
94     une nouvelle sous-requête interne est générée avec la nouvelle URL,
95     ce qui relance le traitement des phases de la requête. Si la
96     substitution est un chemin relatif, la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritebase">RewriteBase</a></code> détermine le chemin URL
97     devant préfixer cette substitution. Dans un contexte de répertoire,
98     il faut s'assurer de créer des règles qui
99     n'effectueront pas de substitution au
100     cours d'une passe ultérieure du processus de réécriture au niveau
101     répertoire afin d'éviter les bouclages . Voir <a href="http://wiki.apache.org/httpd/RewriteLooping">Bouclage dans le
102     processus de réécriture</a> pour une discussion plus détaillée à
103     propos de ce problème.</p>
104
105     <p>En conséquence de cette manipulation de l'URL , vous devrez
106     pensez à confectionner différemment vos règles de réécriture dans un
107     contexte de niveau répertoire. En particulier, rappelez-vous que le
108     chemin de répertoire sera absent de l'URL que vos règles de
109     réécriture verront. Voici quelques exemples qui permettront de
110     clarifier les choses :</p>
111
112     <table class="bordered">
113
114         <tr>
115             <th>Position de la règle</th>
116             <th>Règle</th>
117         </tr>
118
119         <tr>
120             <td>Section VirtualHost</td>
121             <td>RewriteRule ^/images/(.+)\.jpg /images/$1.gif</td>
122         </tr>
123
124         <tr>
125             <td>Fichier .htaccess à la racine des documents</td>
126             <td>RewriteRule ^images/(.+)\.jpg images/$1.gif</td>
127         </tr>
128
129         <tr>
130             <td>Fichier .htaccess dans le répertoire images</td>
131             <td>RewriteRule ^(.+)\.jpg $1.gif</td>
132         </tr>
133
134     </table>
135
136     <p>Pour une étude plus approfondie de la manière dont mod_rewrite
137     manipule les URLs dans les différents contextes, vous pouvez
138     consulter les <a href="../mod/mod_rewrite.html#logging">entrées du
139     journal</a> générées au cours du processus de réécriture.</p>
140
141 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
142 <div class="section">
143 <h2><a name="InternalRuleset" id="InternalRuleset">Traitement du jeu de règles</a></h2>
144
145       <p>Maintenant, quand mod_rewrite se lance dans ces deux phases de
146       l'API, il lit le jeu de règles configurées depuis la structure
147       contenant sa configuration (qui a été elle-même créée soit au
148       démarrage d'Apache pour le contexte du serveur, soit lors du
149       parcours des répertoires par le noyau d'Apache pour le contexte de
150       répertoire). Puis le moteur de réécriture est démarré avec le jeu
151       de règles contenu (une ou plusieurs règles associées à leurs
152       conditions). En lui-même, le mode opératoire du moteur de
153       réécriture d'URLs est exactement le même dans les deux contextes
154       de configuration. Seul le traitement du résultat final diffère.</p>
155
156       <p>L'ordre dans lequel les règles sont définies est important car
157       le moteur de réécriture les traite selon une chronologie
158       particulière (et pas très évidente). Le principe est le suivant :
159       le moteur de réécriture traite les règles (les directives <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>) les unes
160       à la suite des autres, et lorsqu'une règle s'applique, il parcourt
161       les éventuelles conditions (directives
162       <code>RewriteCond</code>directives) associées.
163       Pour des raisons historiques, les
164       conditions précèdent les règles, si bien que le déroulement du
165       contrôle est un peu compliqué. Voir la figure 1 pour plus de
166       détails.</p>
167 <p class="figure">
168       <img src="../images/rewrite_process_uri.png" alt="Flux des comparaisons des directives RewriteRule et RewriteCond" /><br />
169       <dfn>Figure 1:</dfn>Déroulement du contrôle à travers le jeu de
170       règles de réécriture
171 </p>
172       <p>L'URL est tout d'abord comparée au
173       <em>Modèle</em> de chaque règle. Lorsqu'une règle ne s'applique
174       pas, mod_rewrite stoppe immédiatement le traitement de cette règle
175       et passe à la règle suivante. Si l'URL correspond au
176       <em>Modèle</em>, mod_rewrite recherche la présence de conditions
177       correspondantes (les directives Rewritecond apparaissant dans la
178       configuration juste
179       avant les règles de réécriture). S'il n'y en a pas, mod_rewrite remplace
180       l'URL par une chaîne élaborée à partir de la chaîne de
181       <em>Substitution</em>, puis passe à la règle suivante. Si des
182       conditions sont présentes, mod_rewrite lance un bouclage
183       secondaire afin de les traiter selon l'ordre dans lequel elles
184       sont définies. La logique de traitement des conditions est
185       différente : on ne compare pas l'URL à un modèle. Une chaîne de
186       test <em>TestString</em> est tout d'abord élaborée en développant
187       des variables, des références arrières, des recherches dans des
188       tables de correspondances, etc..., puis cette chaîne de test est
189       comparée au modèle de condition <em>CondPattern</em>. Si le modèle
190       ne correspond pas, les autres conditions du jeu ne sont pas
191       examinées et la règle correspondante ne s'applique pas. Si le
192       modèle correspond, la condition suivante est examinée et ainsi de
193       suite jusqu'à la dernière condition. Si toutes les conditions sont
194       satisfaites, le traitement de la règle en cours se poursuit avec
195       le remplacement de l'URL par la chaîne de <em>Substitution</em>.</p>
196
197 </div></div>
198 <div class="bottomlang">
199 <p><span>Langues Disponibles: </span><a href="../en/rewrite/tech.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
200 <a href="../fr/rewrite/tech.html" title="Français">&nbsp;fr&nbsp;</a></p>
201 </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>
202 <script type="text/javascript"><!--//--><![CDATA[//><!--
203 var comments_shortname = 'httpd';
204 var comments_identifier = 'http://httpd.apache.org/docs/trunk/rewrite/tech.html';
205 (function(w, d) {
206     if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
207         d.write('<div id="comments_thread"><\/div>');
208         var s = d.createElement('script');
209         s.type = 'text/javascript';
210         s.async = true;
211         s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
212         (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
213     }
214     else {
215         d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
216     }
217 })(window, document);
218 //--><!]]></script></div><div id="footer">
219 <p class="apache">Copyright 2015 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
220 <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[//><!--
221 if (typeof(prettyPrint) !== 'undefined') {
222     prettyPrint();
223 }
224 //--><!]]></script>
225 </body></html>