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>Dtails techniques sur le module Apache mod_rewrite - Serveur Apache HTTP Version 2.4</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.min.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/directives.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.4</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.4</a> > <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>Dtails 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="Franais"> fr </a></p>
</div>
<p>Ce document passe en revue certains dtails 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 rgles</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">Contrle d'accs</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 avances</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 requtes par le serveur HTTP Apache se
droule en plusieurs phases. Au cours de chaque phase, un ou
plusieurs modules peuvent tre appels pour traiter la partie
concerne du cycle de vie de la requte. Les diffrentes 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 rcriture des URLs.</p>
<p>Tout d'abord, il utilise le hook traduction URL vers nom de
fichier qui intervient aprs la lecture de la requte HTTP, mais
avant le processus d'autorisation. Ensuite, il utilise le hook
Fixup, qui intervient aprs les phases d'autorisation, aprs la
lecture des fichiers de configuration de niveau rpertoire (fichiers
<code>.htaccess</code>), mais avant l'appel du gestionnaire de
contenu.</p>
<p>Ainsi, lorsqu'une requte arrive et une fois le serveur
correspondant ou le serveur virtuel dtermin, le moteur de
rcriture 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'excute au cours de la phase de traduction URL
vers nom de fichier.</p>
<p>Quelques tapes plus loin, une fois les rpertoires de donnes
finaux trouvs, les directives de configuration de niveau rpertoire
(fichiers <code>.htaccess</code> et sections <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code>) sont appliques. Ce processus
s'excute au cours de la phase Fixup.</p>
<p>Dans tous ces cas, mod_rewrite rcrit le
<code>REQUEST_URI</code> soit vers une nouvelle URL, soit vers un
nom de fichier.</p>
<p>Dans un contexte de niveau rpertoire (autrement dit dans les
fichiers <code>.htaccess</code> et les sections
<code>Directory</code>), les rgles de rcriture s'appliquent aprs
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
rpertoires (y compris le dernier slash).</p>
<p>Un exemple : si les rgles se trouvent dans
/var/www/foo/.htaccess et si une requte pour /foo/bar/baz est
trait, une expression comme ^bar/baz$ correspondra.</p>
<p>Si une substitution intervient dans un contexte de rpertoire,
une nouvelle sous-requte interne est gnre avec la nouvelle URL,
ce qui relance le traitement des phases de la requte. Si la
substitution est un chemin relatif, la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritebase">RewriteBase</a></code> dtermine le chemin URL
devant prfixer cette substitution. Dans un contexte de rpertoire,
il faut s'assurer de crer des rgles qui
n'effectueront pas de substitution au
cours d'une passe ultrieure du processus de rcriture au niveau
rpertoire afin d'viter les bouclages . Voir <a href="http://wiki.apache.org/httpd/RewriteLooping">Bouclage dans le
processus de rcriture</a> pour une discussion plus dtaille
propos de ce problme.</p>
<p>En consquence de cette manipulation de l'URL , vous devrez
pensez confectionner diffremment vos rgles de rcriture dans un
contexte de niveau rpertoire. En particulier, rappelez-vous que le
chemin de rpertoire sera absent de l'URL que vos rgles de
rcriture verront. Voici quelques exemples qui permettront de
clarifier les choses :</p>
<table class="bordered">
<tr>
<th>Position de la rgle</th>
<th>Rgle</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 rpertoire images</td>
<td>RewriteRule ^(.+)\.jpg $1.gif</td>
</tr>
</table>
<p>Pour une tude plus approfondie de la manire dont mod_rewrite
manipule les URLs dans les diffrents contextes, vous pouvez
consulter les <a href="../mod/mod_rewrite.html#logging">entres du
journal</a> gnres au cours du processus de rcriture.</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 rgles</a></h2>
<p>Maintenant, quand mod_rewrite se lance dans ces deux phases de
l'API, il lit le jeu de rgles configures depuis la structure
contenant sa configuration (qui a t elle-mme cre soit au
dmarrage d'Apache pour le contexte du serveur, soit lors du
parcours des rpertoires par le noyau d'Apache pour le contexte de
rpertoire). Puis le moteur de rcriture est dmarr avec le jeu
de rgles contenu (une ou plusieurs rgles associes leurs
conditions). En lui-mme, le mode opratoire du moteur de
rcriture d'URLs est exactement le mme dans les deux contextes
de configuration. Seul le traitement du rsultat final diffre.</p>
<p>L'ordre dans lequel les rgles sont dfinies est important car
le moteur de rcriture les traite selon une chronologie
particulire (et pas trs vidente). Le principe est le suivant :
le moteur de rcriture traite les rgles (les directives <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>) les unes
la suite des autres, et lorsqu'une rgle s'applique, il parcourt
les ventuelles conditions (directives
<code>RewriteCond</code>directives) associes.
Pour des raisons historiques, les
conditions prcdent les rgles, si bien que le droulement du
contrle est un peu compliqu. Voir la figure 1 pour plus de
dtails.</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>Droulement du contrle travers le jeu de
rgles de rcriture
</p>
<p>L'URL est tout d'abord compare au
<em>Modle</em> de chaque rgle. Lorsqu'une rgle ne s'applique
pas, mod_rewrite stoppe immdiatement le traitement de cette rgle
et passe la rgle suivante. Si l'URL correspond au
<em>Modle</em>, mod_rewrite recherche la prsence de conditions
correspondantes (les directives Rewritecond apparaissant dans la
configuration juste
avant les rgles de rcriture). S'il n'y en a pas, mod_rewrite remplace
l'URL par une chane labore partir de la chane de
<em>Substitution</em>, puis passe la rgle suivante. Si des
conditions sont prsentes, mod_rewrite lance un bouclage
secondaire afin de les traiter selon l'ordre dans lequel elles
sont dfinies. La logique de traitement des conditions est
diffrente : on ne compare pas l'URL un modle. Une chane de
test <em>TestString</em> est tout d'abord labore en dveloppant
des variables, des rfrences arrires, des recherches dans des
tables de correspondances, etc..., puis cette chane de test est
compare au modle de condition <em>CondPattern</em>. Si le modle
ne correspond pas, les autres conditions du jeu ne sont pas
examines et la rgle correspondante ne s'applique pas. Si le
modle correspond, la condition suivante est examine et ainsi de
suite jusqu' la dernire condition. Si toutes les conditions sont
satisfaites, le traitement de la rgle en cours se poursuit avec
le remplacement de l'URL par la chane 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="Franais"> 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/2.4/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/directives.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>
|