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 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5 This file is generated from xml source: DO NOT EDIT
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
8 <title>Détails techniques sur le module Apache mod_rewrite - Serveur Apache HTTP</title>
9 <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
10 <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
11 <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" />
12 <script src="../style/scripts/prettify.js" type="text/javascript">
15 <link href="../images/favicon.ico" rel="shortcut icon" /></head>
16 <body id="manual-page"><div id="page-header">
17 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p>
18 <p class="apache">Serveur Apache HTTP Version 2.5</p>
19 <img alt="" src="../images/feather.gif" /></div>
20 <div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
22 <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>Détails techniques sur le module Apache mod_rewrite</h1>
24 <p><span>Langues Disponibles: </span><a href="../en/rewrite/tech.html" hreflang="en" rel="alternate" title="English"> en </a> |
25 <a href="../fr/rewrite/tech.html" title="Français"> fr </a></p>
28 <p>Ce document passe en revue certains détails techniques à propos du
29 module mod_rewrite et de la mise en correspondance des URLs</p>
31 <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#InternalAPI">Phases de l'API</a></li>
32 <li><img alt="" src="../images/down.gif" /> <a href="#InternalRuleset">Traitement du jeu de règles</a></li>
33 </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
34 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></div>
35 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
37 <h2><a name="InternalAPI" id="InternalAPI">Phases de l'API</a></h2>
39 <p>Le traitement des requêtes par le serveur HTTP Apache se
40 déroule en plusieurs phases. Au cours de chaque phase, un ou
41 plusieurs modules peuvent être appelés pour traiter la partie
42 concernée du cycle de vie de la requête. Les différentes phases
43 peuvent consister en traduction d'URL en nom de fichier,
44 authentification, autorisation, gestion de contenu ou journalisation (la
45 liste n'est pas exhaustive).</p>
47 <p>mod_rewrite agit dans deux de ces phases (ou accroches - hooks -
48 comme on les nomme souvent) pour la réécriture des URLs.</p>
50 <p>Tout d'abord, il utilise le hook traduction URL vers nom de
51 fichier qui intervient après la lecture de la requête HTTP, mais
52 avant le processus d'autorisation. Ensuite, il utilise le hook
53 Fixup, qui intervient après les phases d'autorisation, après la
54 lecture des fichiers de configuration de niveau répertoire (fichiers
55 <code>.htaccess</code>), mais avant l'appel du gestionnaire de
58 <p>Ainsi, lorsqu'une requête arrive et une fois le serveur
59 correspondant ou le serveur virtuel déterminé, le moteur de
60 réécriture commence à traiter toute directive apparaissant dans la
61 configuration de niveau serveur (autrement dit dans le
62 fichier de configuration principal du serveur et les sections
63 <code class="directive"><a href="../mod/core.html#virtualhost"><Virtualhost></a></code>).
64 Tout ce processus s'exécute au cours de la phase de traduction URL
65 vers nom de fichier.</p>
67 <p>Quelques étapes plus loin, une fois les répertoires de données
68 finaux trouvés, les directives de configuration de niveau répertoire
69 (fichiers <code>.htaccess</code> et sections <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code>) sont appliquées. Ce processus
70 s'exécute au cours de la phase Fixup.</p>
72 <p>Dans tous ces cas, mod_rewrite réécrit le
73 <code>REQUEST_URI</code> soit vers une nouvelle URL, soit vers un
76 <p>Dans un contexte de niveau répertoire (autrement dit dans les
77 fichiers <code>.htaccess</code> et les sections
78 <code>Directory</code>), les règles de réécriture s'appliquent après
79 la traduction de l'URL en nom de fichier. C'est pourquoi le chemin
80 URL auquel mod_rewrite compare initialement les directives
81 <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est le
82 chemin complet vers le nom de fichier traduit amputé de la partie
83 répertoires (y compris le dernier slash).</p>
85 <p>Un exemple : si les règles se trouvent dans
86 /var/www/foo/.htaccess et si une requête pour /foo/bar/baz est
87 traité, une expression comme ^bar/baz$ correspondra.</p>
89 <p>Si une substitution intervient dans un contexte de répertoire,
90 une nouvelle sous-requête interne est générée avec la nouvelle URL,
91 ce qui relance le traitement des phases de la requête. Si la
92 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
93 devant préfixer cette substitution. Dans un contexte de répertoire,
94 il faut s'assurer de créer des règles qui
95 n'effectueront pas de substitution au
96 cours d'une passe ultérieure du processus de réécriture au niveau
97 répertoire afin d'éviter les bouclages . Voir <a href="http://wiki.apache.org/httpd/RewriteLooping">Bouclage dans le
98 processus de réécriture</a> pour une discussion plus détaillée à
99 propos de ce problème.</p>
101 <p>En conséquence de cette manipulation de l'URL , vous devrez
102 pensez à confectionner différemment vos règles de réécriture dans un
103 contexte de niveau répertoire. En particulier, rappelez-vous que le
104 chemin de répertoire sera absent de l'URL que vos règles de
105 réécriture verront. Voici quelques exemples qui permettront de
106 clarifier les choses :</p>
108 <table class="bordered">
111 <th>Position de la règle</th>
116 <td>Section VirtualHost</td>
117 <td>RewriteRule ^/images/(.+)\.jpg /images/$1.gif</td>
121 <td>Fichier .htaccess à la racine des documents</td>
122 <td>RewriteRule ^images/(.+)\.jpg images/$1.gif</td>
126 <td>Fichier .htaccess dans le répertoire images</td>
127 <td>RewriteRule ^(.+)\.jpg $1.gif</td>
132 <p>Pour une étude plus approfondie de la manière dont mod_rewrite
133 manipule les URLs dans les différents contextes, vous pouvez
134 consulter les <a href="../mod/mod_rewrite.html#logging">entrées du
135 journal</a> générées au cours du processus de réécriture.</p>
137 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
138 <div class="section">
139 <h2><a name="InternalRuleset" id="InternalRuleset">Traitement du jeu de règles</a></h2>
141 <p>Maintenant, quand mod_rewrite se lance dans ces deux phases de
142 l'API, il lit le jeu de règles configurées depuis la structure
143 contenant sa configuration (qui a été elle-même créée soit au
144 démarrage d'Apache pour le contexte du serveur, soit lors du
145 parcours des répertoires par le noyau d'Apache pour le contexte de
146 répertoire). Puis le moteur de réécriture est démarré avec le jeu
147 de règles contenu (une ou plusieurs règles associées à leurs
148 conditions). En lui-même, le mode opératoire du moteur de
149 réécriture d'URLs est exactement le même dans les deux contextes
150 de configuration. Seul le traitement du résultat final diffère.</p>
152 <p>L'ordre dans lequel les règles sont définies est important car
153 le moteur de réécriture les traite selon une chronologie
154 particulière (et pas très évidente). Le principe est le suivant :
155 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
156 à la suite des autres, et lorsqu'une règle s'applique, il parcourt
157 les éventuelles conditions (directives
158 <code>RewriteCond</code>directives) associées.
159 Pour des raisons historiques, les
160 conditions précèdent les règles, si bien que le déroulement du
161 contrôle est un peu compliqué. Voir la figure 1 pour plus de
164 <img src="../images/rewrite_process_uri.png" alt="Flux des comparaisons des directives RewriteRule et RewriteCond" /><br />
165 <dfn>Figure 1:</dfn>Déroulement du contrôle à travers le jeu de
168 <p>L'URL est tout d'abord comparée au
169 <em>Modèle</em> de chaque règle. Lorsqu'une règle ne s'applique
170 pas, mod_rewrite stoppe immédiatement le traitement de cette règle
171 et passe à la règle suivante. Si l'URL correspond au
172 <em>Modèle</em>, mod_rewrite recherche la présence de conditions
173 correspondantes (les directives Rewritecond apparaissant dans la
175 avant les règles de réécriture). S'il n'y en a pas, mod_rewrite remplace
176 l'URL par une chaîne élaborée à partir de la chaîne de
177 <em>Substitution</em>, puis passe à la règle suivante. Si des
178 conditions sont présentes, mod_rewrite lance un bouclage
179 secondaire afin de les traiter selon l'ordre dans lequel elles
180 sont définies. La logique de traitement des conditions est
181 différente : on ne compare pas l'URL à un modèle. Une chaîne de
182 test <em>TestString</em> est tout d'abord élaborée en développant
183 des variables, des références arrières, des recherches dans des
184 tables de correspondances, etc..., puis cette chaîne de test est
185 comparée au modèle de condition <em>CondPattern</em>. Si le modèle
186 ne correspond pas, les autres conditions du jeu ne sont pas
187 examinées et la règle correspondante ne s'applique pas. Si le
188 modèle correspond, la condition suivante est examinée et ainsi de
189 suite jusqu'à la dernière condition. Si toutes les conditions sont
190 satisfaites, le traitement de la règle en cours se poursuit avec
191 le remplacement de l'URL par la chaîne de <em>Substitution</em>.</p>
194 <div class="bottomlang">
195 <p><span>Langues Disponibles: </span><a href="../en/rewrite/tech.html" hreflang="en" rel="alternate" title="English"> en </a> |
196 <a href="../fr/rewrite/tech.html" title="Français"> fr </a></p>
197 </div><div id="footer">
198 <p class="apache">Copyright 2012 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
199 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p></div><script type="text/javascript">
200 if (typeof(prettyPrint) !== undefined) {