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