1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision: 1827608 -->
5 <!-- French translation : Lucien GENTIS -->
6 <!-- Reviewed by : Vincent Deffontaines -->
9 Licensed to the Apache Software Foundation (ASF) under one or more
10 contributor license agreements. See the NOTICE file distributed with
11 this work for additional information regarding copyright ownership.
12 The ASF licenses this file to You under the Apache License, Version 2.0
13 (the "License"); you may not use this file except in compliance with
14 the License. You may obtain a copy of the License at
16 http://www.apache.org/licenses/LICENSE-2.0
18 Unless required by applicable law or agreed to in writing, software
19 distributed under the License is distributed on an "AS IS" BASIS,
20 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 See the License for the specific language governing permissions and
22 limitations under the License.
25 <modulesynopsis metafile="mod_rewrite.xml.meta">
27 <name>mod_rewrite</name>
29 <description>Ce module fournit un moteur de réécriture à base de
30 règles permettant de réécrire les URLs des requêtes
31 à la volée</description>
33 <status>Extension</status>
34 <sourcefile>mod_rewrite.c</sourcefile>
35 <identifier>rewrite_module</identifier>
38 <p>Le module <module>mod_rewrite</module> utilise un moteur de
39 réécriture à base de règles, basé sur un interpréteur
40 d'expressions rationnelles PCRE, pour réécrire les URLs à la volée. Par
41 défaut, <module>mod_rewrite</module> met en correspondance une URL
42 avec le système de fichiers. Cependant, on peut aussi l'utiliser
43 pour rediriger une URL vers une autre URL, ou pour invoquer une
44 requête interne à destination du mandataire.</p>
45 <p><module>mod_rewrite</module> fournit une méthode souple et
46 puissante pour manipuler les URLs en utilisant un nombre illimité
47 de règles. Chaque règle peut être associée à un nombre illimité de
48 conditions, afin de vous permettre de réécrire les URLs en
49 fonction de variables du serveur, de variables d'environnement,
50 d'en-têtes HTTP, ou de repères temporels.</p>
51 <p><module>mod_rewrite</module> agit sur la totalité de l'URL, y
52 compris la partie chemin. Une règle de réécriture peut être
53 invoquée dans <code>httpd.conf</code> ou dans un fichier
54 <code>.htaccess</code>. Le chemin généré par une règle de
55 réécriture peut inclure une chaîne de paramètres, ou peut renvoyer
56 vers un traitement secondaire interne, une redirection vers une
57 requête externe ou vers le mandataire interne.</p>
59 <p>Vous trouverez d'avantage de détails, discussions et exemples
61 <a href="../rewrite/">documentation détaillée
62 sur mod_rewrite</a>.</p>
65 <section id="logging"><title>Journalisation</title>
67 <p><module>mod_rewrite</module> offre une journalisation détaillée
68 de ses actions aux niveaux de journalisation <code>trace1</code> à
69 <code>trace8</code>. Le niveau de journalisation peut être défini de
70 manière spécifique à <module>mod_rewrite</module> via la directive
71 <directive module="core">LogLevel</directive> : jusqu'au niveau
72 <code>debug</code> aucune action n'est journalisée, alors qu'elles
73 le sont pratiquement toutes au niveau <code>trace8</code>.</p>
76 L'utilisation d'un niveau de journalisation élevé pour
77 <module>mod_rewrite</module> va ralentir votre serveur HTTP Apache
78 de manière dramatique ! N'utilisez un niveau de journalisation
79 supérieur à <code>trace2</code> qu'à des fins de débogage !
82 <example><title>Exemple</title>
83 <highlight language="config">
84 LogLevel alert rewrite:trace3
88 <note><title>RewriteLog</title>
89 <p>Ceux qui sont familiers avec les versions précédentes de
90 <module>mod_rewrite</module> vont probablement rechercher en vain les
91 directives <code>RewriteLog</code> et
92 <code>RewriteLogLevel</code>. Elles ont été en effet remplacées
93 par une configuration de la journalisation par module, comme
97 <p>Pour extraire les traces spécifiques à
98 <module>mod_rewrite</module>, affichez le fichier journal en
99 redirigeant la sortie vers grep :</p>
101 tail -f error_log|fgrep '[rewrite:'
108 <name>RewriteEngine</name>
109 <description>Active ou désactive l'exécution du
110 moteur de réécriture</description>
111 <syntax>RewriteEngine on|off</syntax>
112 <default>RewriteEngine off</default>
113 <contextlist><context>server config</context><context>virtual host</context>
114 <context>directory</context><context>.htaccess</context></contextlist>
115 <override>FileInfo</override>
119 <p>La directive <directive>RewriteEngine</directive> active ou
120 désactive l'exécution du moteur de réécriture. Si sa valeur est
121 <code>off</code>, ce module n'exécutera aucun traitement et ne
122 mettra pas à jour les variables d'environnement
123 <code>SCRIPT_URx</code>.</p>
125 <p>Plutôt que de commenter toutes les directives <directive
126 module="mod_rewrite">RewriteRule</directive>, il est préférable
127 d'utiliser cette directive si l'on souhaite désactiver les
128 règles de réécriture dans un contexte particulier.</p>
130 <p>Notez que les hôtes virtuels n'héritent pas des
131 configurations de réécriture. Ceci implique que vous devez
132 insérer une directive <code>RewriteEngine on</code> dans chaque
133 hôte virtuel pour lequel vous souhaitez utiliser des règles
136 <p>Les directives <directive module="mod_rewrite">RewriteMap</directive> du type
137 <code>prg</code> ne sont pas prises en compte au cours de
138 l'initialisation du serveur si elle ont été définies dans un
139 contexte où la directive <directive>RewriteEngine</directive> n'a
140 pas été définie à <code>on</code>.</p>
147 <name>RewriteOptions</name>
148 <description>Configure certaines options spéciales
149 pour le moteur de réécriture</description>
150 <syntax>RewriteOptions <var>Options</var></syntax>
151 <contextlist><context>server config</context><context>virtual host</context>
152 <context>directory</context><context>.htaccess</context></contextlist>
153 <override>FileInfo</override>
156 <p>La directive <directive>RewriteOptions</directive> définit
157 certaines options spéciales pour la configuration au niveau du
158 serveur ou du répertoire. La chaîne de caractères <em>Option</em>
159 ne peut actuellement prendre qu'une des valeurs suivantes :</p>
162 <dt><code>Inherit</code></dt>
165 <p>Ceci force la configuration locale à hériter de la
166 configuration du niveau supérieur. Dans le contexte des hôtes
167 virtuels, cela signifie que les correspondances, conditions et
168 règles du serveur principal sont héritées. Dans le contexte des
169 répertoires, cela signifie que les conditions et règles de la
170 configuration <code>.htaccess</code> ou les sections <directive
171 type="section" module="core">Directory</directive> du répertoire
172 parent sont héritées. Les règles héritées sont virtuellement
173 copiées dans la section où cette directive est utilisée. Si elles
174 sont utilisées avec des règles locales, les règles héritées sont
175 placées après ces dernières. La place de cette directive - avant
176 ou après les règles locales - n'a aucune influence sur ce
177 comportement. Si des règles locales ont forcé l'arrêt de la
178 réécriture, les règles héritées ne seront pas traitées.</p>
180 <note type="warning">
181 Les règles héritées du niveau parent sont appliquées
182 <strong>after</strong> après les règles spécifiées dans le niveau
187 <dt><code>InheritBefore</code></dt>
189 <p>Même effet que l'option <code>Inherit</code> ci-dessus, mais
190 les règles spécifiées dans le niveau parent s'appliquent
191 <strong>avant</strong> les règles spécifiées dans le niveau
193 Disponible depuis la version 2.3.10 du serveur HTTP Apache.</p>
196 <dt><code>InheritDown</code></dt>
199 <p>Si cette option est activée, toutes les configurations enfants
200 hériteront de la configuration courante. Il en est de même si l'on
201 spécifie <code>RewriteOptions Inherit</code> dans toutes les
202 configurations enfants. Voir l'option <code>Inherit</code> pour
203 plus de détails à propos de la manière dont les relations
204 parent-enfants sont traitées.<br />
205 Cette option est disponible à partir
206 de la version 2.4.8 du serveur HTTP Apache.</p>
209 <dt><code>InheritDownBefore</code></dt>
212 <p>L'effet de cette option est équivalent à celui de l'option
213 <code>InheritDown</code> ci-dessus, mais les règles de la
214 configuration parente s'appliquent <strong>avant</strong> toute
215 règle de la configuration enfant.<br />
216 Cette option est disponible à partir
217 de la version 2.4.8 du serveur HTTP Apache.</p>
220 <dt><code>IgnoreInherit</code></dt>
223 <p>Si cette option est activée, les configurations courante et
224 enfants ignoreront toute règle héritée d'une configuration parente
225 via les options <code>InheritDown</code> ou
226 <code>InheritDownBefore</code>.<br />
227 Cette option est disponible à partir
228 de la version 2.4.8 du serveur HTTP Apache.</p>
231 <dt><code>AllowNoSlash</code></dt>
233 <p>Par défaut, <module>mod_rewrite</module> ignore les URLs qui
234 correspondent à un répertoire sur disque, mais ne comportent pas
235 de slash final, afin que le module <module>mod_dir</module>
236 redirige le client vers l'URL canonique avec un slash final.</p>
238 <p>Lorsque la directive <directive
239 module="mod_dir">DirectorySlash</directive> est définie à off, il
240 est possible de spécifier l'option <code>AllowNoSlash</code> pour
241 s'assurer que les règles de réécriture ne soient plus ignorées.
242 Si on le souhaite, cette option permet de faire s'appliquer des
243 règles de réécriture qui correspondent à un répertoire sans slash
244 final au sein de fichiers .htaccess.<br />
245 Elle est disponible à
246 partir de la version 2.4.0 du serveur HTTP Apache.</p>
249 <dt><code>AllowAnyURI</code></dt>
252 <p>A partir de la version 2.2.22 de httpd, lorsqu'une directive <directive
253 module="mod_rewrite">RewriteRule</directive> se situe dans un
254 contexte de <code>serveur virtuel</code> ou de serveur principal,
255 <module>mod_rewrite</module> ne traitera les règles de réécriture
256 que si l'URI de la requête respecte la syntaxe d'un <a
257 href="directive-dict.html#Syntax">chemin URL</a>. Ceci permet
258 d'éviter certains problèmes de sécurité où des règles
259 particulières pourraient permettre des développements de modèles
261 href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3368">CVE-2011-3368</a>
263 href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4317">CVE-2011-4317</a>).
264 Pour s'affranchir de la restriction relative à la syntaxe des chemins URL, on peut
265 utiliser l'option <code>AllowAnyURI</code>, afin de permettre à
266 <module>mod_rewrite</module> d'appliquer le jeu de règles à toute
267 chaîne de requête URI, sans vérifier si cette dernière respecte la
268 grammaire des chemins URL définie dans la spécification HTTP.<br />
269 Disponible depuis la version 2.4.3 du serveur HTTP Apache.</p>
271 <note type="warning">
272 <title>Avertissement à propos de la sécurité</title>
274 <p>L'utilisation de cette option rendra le serveur vulnérable à
275 certains problèmes de sécurité si les règles de réécritures
276 concernées n'ont pas été rédigées avec soin. Il est par conséquent
277 <strong>fortement recommandé</strong> de ne pas utiliser cette
278 option. En particulier, prêtez attention aux chaînes en entrée contenant le
279 caractère '<code>@</code>', qui peuvent modifier l'interprétation
280 de l'URI réécrite, comme indiqué dans les liens ci-dessus.</p>
284 <dt><code>MergeBase</code></dt>
287 <p>Avec cette option, la valeur de la directive <directive
288 module="mod_rewrite">RewriteBase</directive> est recopiée depuis
289 une valeur explicitement définie dans tout sous-répertoire qui ne
290 définit pas sa propre directive <directive
291 module="mod_rewrite">RewriteBase</directive>. Il s'agissait du
292 comportement par défaut avec les versions 2.4.0 à 2.4.3, et ce
293 drapeau qui permet de retrouver ce comportement est disponible
294 depuis la version 2.4.4 du serveur HTTP Apache.</p>
297 <dt><code>IgnoreContextInfo</code></dt>
301 substitution relative dans un contexte de répertoire (htaccess),
302 et si la directive <directive
303 module="mod_rewrite">RewriteBase</directive> n'a pas été définie,
304 ce module utilise des informations en provenance d'une extension
305 d'URL et du contexte du système de fichiers pour transformer la
306 sustitution relative en URL. Par exemple, les modules
307 <module>mod_userdir</module> et <module>mod_alias</module>
308 utilisent ces informations de contexte étendu. Disponible à partir de la
309 version 2.4.16 du serveur HTTP Apache.</p>
312 <dt><code>LegacyPrefixDocRoot</code></dt>
315 <p>Avant la version 2.4.26, si une substitution était une URL absolue qui
316 correspondait au serveur virtuel courant, l'URL pouvait être tout d'abord
317 réduite à sa partie chemin, puis enfin en chemin local. Comme l'URL peut
318 être réduite en chemin local, le chemin doit être préfixé par la
319 valeur de la directive DocumentRoot, ce qui permet d'interdire l'accès à
320 un fichier tel que /tmp/myfile suite à une requête pour
321 http://host/file/myfile avec la <directive
322 module="mod_rewrite">RewriteRule</directive> suivante :</p>
323 <highlight language="config">
324 RewriteRule /file/(.*) http://localhost/tmp/$1
326 <p>Cette option permet de restaurer l'ancien comportement lorsqu'un chemin
327 local obtenu à partir de la réduction d'une URL n'est pas préfixé par la
328 valeur de la directive DocumentRoot. Disponible à partir de la version
329 2.4.26 du serveur HTTP Apache.</p>
332 <dt><code>LongURLOptimization</code></dt>
334 <p>Cette option permet de réduire la consommation de mémoire des jeux de
335 règles longs et non optimisés qui enregistrent de manière répétitive de
336 longues valeurs dans des variables au sein des directives RewriteCond et
337 RewriteRule. Disponible à partir de la version 2.5 du serveur HTTP Apache.</p>
346 <name>RewriteMap</name>
347 <description>Définit une fonction de mise en correspondance pour la
348 recherche de mots-clés</description>
349 <syntax>RewriteMap <em>MapName</em> <em>MapType</em>:<em>MapSource</em> [<em>MapTypeOptions</em>]
351 <contextlist><context>server config</context><context>virtual host</context>
353 <compatibility>Le troisième paramètre, MapTypeOptions, est disponible à partir
354 de la version 2.4.29 du serveur HTTP Apache</compatibility>
357 <p>La directive <directive>RewriteMap</directive> définit une
358 <em>Table de correspondance pour la réécriture</em> que les
359 fonctions de mise en correspondance
360 peuvent utiliser dans les chaînes de substitution des règles
361 pour insérer/substituer des champs en recherchant des mots-clés.
362 La source utilisée pour cette recherche peut être de plusieurs
365 <p><a id="mapfunc" name="mapfunc"><em>MapName</em></a> est le nom de la table de correspondance
366 et servira à spécifier une fonction de mise en correspondance
367 pour les chaînes de substitution d'une règle de réécriture selon
368 une des constructions suivantes :</p>
371 <strong><code>${</code> <em>MapName</em> <code>:</code>
372 <em>mot-clé</em> <code>}</code><br />
373 <code>${</code> <em>MapName</em> <code>:</code>
374 <em>mot-clé</em> <code>|</code> <em>valeur par défaut</em>
375 <code>}</code></strong>
378 <p>Lorsqu'une telle construction est rencontrée, la table de
379 correspondance <em>MapName</em> est consultée
380 et la clé <em>mot-clé</em> recherchée. Si la clé est trouvée, la
381 construction est remplacée par
382 la <em>valeur de remplacement</em>. Si la clé n'est pas trouvée,
383 elle est remplacée par la <em>valeur par défaut</em>, ou par une
384 chaîne vide si aucune <em>valeur par défaut</em> n'est
385 spécifiée. La valeur vide se comporte comme si la
386 clé était absente ; il est donc impossible de distinguer une
387 valeur vide d'une absence de clé.</p>
389 <p>Par exemple, vous pouvez définir une directive
390 <directive>RewriteMap</directive> comme suit </p>
392 <highlight language="config">
393 RewriteMap map-exemple "txt:/chemin/vers/fichier/map.txt"
396 <p>Vous pourrez ensuite utiliser cette table dans une
397 directive <directive module="mod_rewrite">RewriteRule</directive> comme suit :</p>
399 <highlight language="config">
400 RewriteRule "^/ex/(.*)" "${map-exemple:$1}"
403 <p>La signification de l'argument <em>MapTypeOptions</em> dépend du <em>MapType</em>
404 spécifié. Veuillez vous référer au document <a
405 href="../rewrite/rewritemap.html">Utiliser RewriteMap</a> pour
408 <p>Les combinaisons suivantes pour <em>type de correspondance</em>
409 et <em>MapSource</em>
410 peuvent être utilisées :</p>
414 <dd>Un fichier texte contenant des paires clé-valeur séparées
415 par des espaces, une paire par ligne (<a
416 href="../rewrite/rewritemap.html#txt">Détails ...</a>).</dd>
419 <dd>Sélection aléatoire d'une entrée depuis un fichier texte (<a
420 href="../rewrite/rewritemap.html#rnd">Détails ...</a>).</dd>
423 <dd>Recherche une entrée dans un fichier dbm contenant des
424 paires nom-valeur. Le condensé hash est élaboré à partir d'un
425 format de fichier texte via l'utilitaire <code><a
426 href="../programs/httxt2dbm.html">httxt2dbm</a></code> (<a
427 href="../rewrite/rewritemap.html#dbm">Détails ...</a>).</dd>
430 <dd>Une des quatre fonctions internes disponibles que fournit
431 <code>RewriteMap</code>: toupper, tolower, escape ou unescape
432 (<a href="../rewrite/rewritemap.html#int">Détails ...</a>).</dd>
435 <dd>Appelle un programme externe ou un script pour effectuer la
436 réécriture (<a href="../rewrite/rewritemap.html#prg">Détails
439 <dt>dbd or fastdbd</dt>
440 <dd>Une commande SQL SELECT à exécuter pour rechercher la cible
441 de réécriture (<a href="../rewrite/rewritemap.html#dbd">Détails
445 <p>Vous trouverez plus de détails et de nombreux exemples dans le <a
446 href="../rewrite/rewritemap.html">RewriteMap HowTo</a>.</p>
452 <name>RewriteBase</name>
453 <description>Définit l'URL de base pour les réécritures au niveau
454 répertoire</description>
455 <syntax>RewriteBase <em>chemin_URL</em></syntax>
456 <default>Pas de valeur par défaut</default>
457 <contextlist><context>directory</context><context>.htaccess</context>
459 <override>FileInfo</override>
462 <p>La directive <directive>RewriteBase</directive> permet de
463 spécifier le préfixe d'URL à utiliser dans un contexte de
464 répertoire (htaccess) pour les directives
465 <directive module="mod_rewrite">RewriteRule</directive> qui réécrivent vers un chemin
467 <p>Cette directive est <em>obligatoire</em> si vous utilisez un
468 chemin relatif dans une substitution, et dans un contexte de
469 répertoire (htaccess), sauf si au moins une de ces conditions est
472 <li>La requête initiale, ainsi que la substitution, se
473 situent par raport à la valeur de la directive
474 <directive module="core">DocumentRoot</directive> (c'est à
475 dire que pour y accéder, il n'est pas nécessaire d'utiliser
476 une directive telle qu'<directive
477 module="mod_alias">Alias</directive>).</li>
478 <li>Le chemin du système de fichiers vers le répertoire
479 contenant la <directive module="mod_rewrite">RewriteRule</directive>, suffixé par
480 la substitution relative est aussi valide en tant qu'URL sur
481 le serveur (ce qui est rare).</li>
482 <li>A partir de la version 2.4.16 du serveur HTTP Apache,
483 cette directive peut être omise lorsque la requête est mise en
484 correspondance avec le système de fichiers via la directive
485 <directive module="mod_alias">Alias</directive> ou le module
486 <module>mod_userdir</module>.</li>
489 <p>Dans l'exemple ci-dessous, la directive
490 <directive>RewriteBase</directive> est nécessaire afin d'éviter une
491 réécriture en http://example.com/opt/myapp-1.2.3/welcome.html car la
492 ressource n'était pas relative à la racine des documents. Cette erreur
493 de configuration aurait conduit le serveur à rechercher un répertoire
494 "opt" à la racine des documents.</p>
496 <highlight language="config">
497 DocumentRoot "/var/www/example.com"
498 AliasMatch "^/myapp" "/opt/myapp-1.2.3"
499 <Directory "/opt/myapp-1.2.3">
501 RewriteBase "/myapp/"
502 RewriteRule "^index\.html$" "welcome.html"
511 <name>RewriteCond</name>
512 <description>Définit une condition qui devra être satisfaite pour que
513 la réécriture soit effectuée
516 <em>chaîne_de_test</em> <em>expression_de_comparaison</em> [<em>drapeaux</em>]</syntax>
517 <contextlist><context>server config</context><context>virtual host</context>
518 <context>directory</context><context>.htaccess</context></contextlist>
519 <override>FileInfo</override>
522 <p>La directive <directive>RewriteCond</directive> permet de définir une
523 condition d'exécution d'une règle. Une ou plusieurs conditions
524 <directive>RewriteCond</directive> peuvent précéder une
525 directive <directive module="mod_rewrite"
526 >RewriteRule</directive>. La règle de réécriture correspondante n'est
527 ainsi exécutée que si ces conditions sont satisfaites,
528 <strong>et</strong> si l'URI correspond au modèle spécifié dans la
531 <p><em>TestString</em> est une chaîne qui peut contenir les
532 extensions suivantes en plus du texte simple :</p>
536 <strong>références arrières de règle de réécriture</strong> :
537 ce sont des références arrières de la forme
538 <strong><code>$N</code></strong> (0 <= N <= 9). $1 à $9
539 permettent d'accéder aux parties regroupées (entre
540 parenthèses) du modèle, issues de la <code>RewriteRule</code>
541 concernée par le jeu de conditions <code>RewriteCond</code>
542 courant. $0 donne accès à l'ensemble de la chaîne
543 correspondant au modèle.</li>
545 <strong>Références arrières de condition de réécriture
546 </strong> : ce sont des références arrières de la forme
547 <strong><code>%N</code></strong> (0 <= N <= 9). %1 à %9
548 permettent d'accéder aux parties regroupées (entre
549 parenthèses) du modèle, issues de la dernière
550 condition <code>RewriteCond</code> satisfaite du jeu de conditions <code>RewriteCond</code>
551 courant. %0 donne accès à l'ensemble de la chaîne
552 correspondant au modèle.</li>
554 <strong>extensions de table de réécriture</strong> :
555 ce sont des extensions de la forme <strong><code
556 >${nomTable:clé|défaut}</code></strong>. Voir la <a
557 >href="#mapfunc">documentation sur RewriteMap</a>
558 pour plus de détails.
561 <strong>Variables du serveur</strong> :
562 ce sont des variables de la forme
563 <strong><code>%{</code> <em>NAME_OF_VARIABLE</em> <code>}</code></strong>,
564 où <em>NOM_DE_VARIABLE</em> peut contenir une chaîne issue
565 de la liste suivante :
568 <columnspec><column width=".3"/><column width=".3"/>
569 <column width=".3"/></columnspec>
571 <th>En-têtes HTTP :</th> <th>connexion & requête:</th> <th></th>
580 HTTP_PROXY_CONNECTION<br />
582 HTTP_USER_AGENT<br />
587 CONN_REMOTE_ADDR<br />
589 CONTEXT_DOCUMENT_ROOT<br />
599 SCRIPT_FILENAME<br />
606 <th>variables internes au serveur :</th> <th>date et heure :</th> <th>spéciaux :</th>
618 SERVER_PROTOCOL<br />
619 SERVER_SOFTWARE<br />
635 CONN_REMOTE_ADDR<br />
639 REQUEST_FILENAME<br />
647 <p>Ces variables correspondent toutes aux en-têtes MIME
648 HTTP de mêmes noms, au variables C du serveur HTTP Apache, ou
649 aux champs <code>struct tm</code> du système Unix. La
650 plupart d'entre elles sont documentées <a
651 href="../expr.html#vars">ici</a>, dans la
652 spécification CGI ou ailleurs dans le
655 <p>SERVER_NAME et SERVER_PORT dépendent respectivement
656 des valeurs des directives <directive
657 module="core">UseCanonicalName</directive> et <directive
658 module="core">UseCanonicalPhysicalPort</directive>.</p>
660 <p>Parmi les variables
661 spécifiques à <module>mod_rewrite</module>, ou trouve les suivantes :</p>
664 <dt><code>API_VERSION</code></dt>
666 <dd>C'est la version de l'API des modules Apache httpd
667 (l'interface interne entre le serveur et les modules)
668 pour la construction courante de httpd, telle qu'elle
669 est définie dans include/ap_mmn.h. La version de l'API
670 des modules correspond à la version du serveur Apache
672 utilisé (par exemple, pour la version 1.3.14 d'Apache
674 il s'agit de la version 19990320:10), mais intéresse
675 principalement les auteurs de modules.</dd>
677 <dt><code>CONN_REMOTE_ADDR</code></dt>
679 <dd>A partir de la version 2.4.8 : l'adresse IP distante de
680 la connexion (voir le module
681 <module>mod_remoteip</module>).</dd>
683 <dt><code>HTTPS</code></dt>
685 <dd>Contient le texte "on" si la connexion
686 utilise SSL/TLS, "off" dans le cas contraire
687 (Cette variable peut être utilisée sans problème, que
688 <module>mod_ssl</module> soit chargé ou non).</dd>
690 <dt><code>IS_SUBREQ</code></dt>
692 <dd>Contient le texte "true" si la requête en cours
693 de traitement est une sous-requête, "false" dans le
694 cas contraire. Une sous-requête est générée quand un
695 module a besoin de se référer à des fichiers ou URIs
696 addidionnels pour pouvoir mener à bien sa tâche.</dd>
698 <dt><code>REMOTE_ADDR</code></dt>
699 <dd>L'adresse IP de l'hôte distant (se référer au
700 module <module>mod_remoteip</module>).</dd>
702 <dt><code>REQUEST_FILENAME</code></dt>
704 <dd>Le chemin complet local au système de fichiers
705 du fichier ou du script correspondant
706 à la requête, s'il a déjà été déterminé par le serveur
707 au moment où on y fait référence. Dans le cas
708 contraire, et en particulier dans le cas d'un serveur
709 virtuel, <code>REQUEST_FILENAME</code> contient la
710 valeur de <code>REQUEST_URI</code>. En fonction de la
711 valeur de la directive <directive
712 module="core">AcceptPathInfo</directive>, le serveur
713 peut n'utiliser que certains éléments de tête du
714 <code>REQUEST_URI</code> pour déterminer à quel
715 fichier correspond la requête.</dd>
717 <dt><code>REQUEST_SCHEME</code></dt>
719 <dd>Contient le protocole de la requête (en général
720 "http" ou "https"). La valeur peut être modifiée par
721 la directive <directive
722 module="core">ServerName</directive>.</dd>
724 <dt><code>REQUEST_URI</code></dt>
726 <dd>La partie chemin de l'URI de la requête, comme
727 "/index.html". Ceci exclut en particulier la chaîne de
728 paramètres de la requête qui est contenue dans la
729 variable <code>QUERY_STRING</code>.</dd>
731 <dt><code>THE_REQUEST</code></dt>
733 <dd>La ligne de requête HTTP complète envoyée par le
734 navigateur au serveur (par exemple, "<code>GET
735 /index.html HTTP/1.1</code>"), à l'exclusion de tout
736 en-tête ajouté par le navigateur. Cette
737 valeur n'a pas été déséchappée (décodée), à la
738 différence de la plupart des variables suivantes.</dd>
744 <p>Si la <em>chaîne_de_test</em> contient la valeur spéciale
745 <code>expr</code>, <em>expression_de_comparaison</em> sera traité
746 en tant qu'expression rationnelle de type <a
747 href="../expr.html">ap_expr</a>. Si des en-têtes HTTP sont
748 référencés dans l'expression rationnelle, et si le drapeau
749 <code>novary</code> n'est pas activé, ils seront ajoutés à
752 <p>Autres points à connaître ::</p>
755 <p>Les variables <code>SCRIPT_FILENAME</code> et
756 <code>REQUEST_FILENAME</code> contiennent toutes deux la valeur
757 du champ <code>filename</code> de la
758 structure interne <code>request_rec</code>du serveur HTTP Apache.
759 Le premier nom correspond au nom de variable bien connu CGI,
760 alors que le second est l'équivalent de REQUEST_URI (qui
761 contient la valeur du champ <code>uri</code> de
762 <code>request_rec</code>).</p>
763 <p>Si une substitution intervient et si la réécriture se
764 poursuit, la valeur des deux variables sera mise à jour en
766 <p>Dans le contexte du serveur principal (c'est à dire avant que
767 la requête ne soit mise en correspondance avec le système de
768 fichiers), SCRIPT_FILENAME et REQUEST_FILENAME ne peuvent pas
769 contenir le chemin entier dans le système de fichiers local car
770 ce chemin b'est pas connu à ce stade du traitement. Dans ce cas,
771 les deux variables contiendront la valeur de REQUEST_URI. Pour
772 obtenir le chemin complet de la requête dans le système de
773 fichiers local dans le contexte du serveur principal, utilisez une
774 référence avant à base d'URL
775 <code>%{LA-U:REQUEST_FILENAME}</code> pour déterminer la valeur
776 finale de REQUEST_FILENAME.</p></li>
780 <code>%{ENV:<em>variable</em>}</code>, où <em>variable</em> peut
781 correspondre à une variable d'environnement quelconque.</li>
783 <code>%{ENV:variable}</code> est aussi disponible, où
784 <em>variable</em> peut correspondre à toute variable
785 d'environnement. Peut être consulté via des structures internes
786 d'Apache httpd et (si on ne les trouve pas ici) via la fonction
787 <code>getenv()</code> à partir du processus du serveur Apache
790 <li>Que <module>mod_ssl</module> soit chargé ou non, on peut
791 utiliser <code>%{SSL:variable}</code>, où <em>variable</em>
792 peut être remplacé par le nom d'une
793 <a href="mod_ssl.html#envvars">variable
794 d'environnement SSL</a> . Si <module>mod_ssl</module> n'est pas
795 chargé, cette variable contiendra toujours une chaîne vide.
796 Exemple : <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> pourra
797 contenir la valeur <code>128</code>. Ces variables sont
798 disponibles même si l'option <code>StdEnvVars</code> de la
799 directive <directive module="mod_ssl">SSLOptions</directive> n'a
800 pas été définie.</li>
803 On peut utiliser <code>%{HTTP:en-tête}</code>, où
804 <em>en-tête</em> peut correspondre à tout nom d'en-tête MIME
805 HTTP, pour extraire la valeur d'un en-tête envoyé dans la
806 requête HTTP. Par exemple, <code>%{HTTP:Proxy-Connection}</code>
807 contiendra la valeur de l'en-tête HTTP
808 "<code>Proxy-Connection:</code>".
809 Si on utilise un en-tête HTTP
810 dans une condition, et si cette condition est évaluée à
811 <code>vrai</code> pour la requête, cet en-tête sera ajouté à l'en-tête Vary de
812 la réponse. Il ne le sera pas si la condition est évaluée à
813 <code>faux</code>. L'ajout de l'en-tête HTTP à l'en-tête Vary
814 est nécessaire à une mise en cache appropriée.
815 <p>Il faut garder à l'esprit que les conditions suivent une
816 logique de cout-circuit si le drapeau
817 '<strong><code>ornext|OR</code></strong>' est utilisé, et que de
818 ce fait, certaines d'entre elles ne seront pas évaluées.</p>
821 <li>A des fins de référence avant, on peut utiliser,
822 <a id="LA-U" name="LA-U"><code>%{LA-U:variable}</code></a>, qui
823 permet d'effectuer une sous-requête interne à base d'URL, afin
824 de déterminer la valeur finale de <em>variable</em>. Ceci permet
825 d'accéder à la valeur d'une variable pour la réécriture inconnue
826 à ce stade du traitement, mais qui sera définie au
827 cours d'une phase ultérieure.
828 <p>Par exemple, pour effectuer une réécriture dépendant de la
829 variable <code>REMOTE_USER</code> dans le contexte du serveur
830 principal (fichier <code>httpd.conf</code>), vous devez utiliser
831 <code>%{LA-U:REMOTE_USER}</code> - cette variable est définie
832 par la phase d'autorisation qui intervient <em>après</em> la
833 phase de traduction d'URL (pendant laquelle <module>mod_rewrite</module>
835 <p>Par contre, comme <module>mod_rewrite</module> implémente son contexte de
836 répertoire (fichier <code>.htaccess</code>) via la phase Fixup
837 de l'API, et comme la phase d'autorisation intervient
838 <em>avant</em> cette dernière, vous pouvez vous contenter
839 d'utiliser <code>%{REMOTE_USER}</code> dans ce contexte.</p></li>
842 <code>%{LA-F:variable}</code> peut être utilisée pour effectuer
843 une sous-requête interne (basée sur le nom de fichier), afin de
844 déterminer la valeur finale de <em>variable</em>. La plupart du
845 temps, elle est identique à LA-U (voir ci-dessus).</li>
849 <p><em>expression_de_comparaison</em> est une expression
850 rationnelle qui est appliquée à l'instance actuelle de
851 <em>chaîne_de_test</em>. <em>chaîne_de_test</em> est d'abord
852 évaluée, puis comparée à
853 l'<em>expression_de_comparaison</em>.</p>
855 <p><em>expression_de_comparaison</em> est en général une
856 <em>expression rationnelle compatible perl</em>, mais vous
857 disposez des syntaxes supplémentaires suivantes pour effectuer
858 d'autres tests utiles sur <em>chaîne_de_test</em> :
862 <li>Vous pouvez préfixer l'expression avec un caractère
863 '<code>!</code>' (point d'exclamation) pour inverser le résultat
864 de la condition, quelle que soit l'<em>expression de
865 comparaison</em> utilisée.</li>
867 <li>Vous pouvez effectuer des comparaisons lexicographiques de
871 <dt><strong><expression</strong></dt>
872 <dd>inférieur au sens lexicographique<br />
873 Traite l'<em>expression</em> comme une chaîne de
874 caractères et la compare lexicographiquement à
875 <em>chaîne_de_test</em>. La condition est satisfaite si
876 <em>chaîne_de_test</em> est inférieure au sens
877 lexicographique à l'<em>expression</em>.</dd>
879 <dt><strong>>expression</strong></dt>
880 <dd>supérieur au sens lexicographique<br />
881 Traite l'<em>expression</em> comme une chaîne de
882 caractères et la compare lexicographiquement à
883 <em>chaîne_de_test</em>. La condition est satisfaite si
884 <em>chaîne_de_test</em> est supérieure au sens
885 lexicographique à l'<em>expression</em>.</dd>
887 <dt><strong>=expression</strong></dt>
888 <dd>égal au sens lexicographique<br />
889 Traite l'<em>expression</em> comme une chaîne de
890 caractères et la compare lexicographiquement à
891 <em>chaîne_de_test</em>. La condition est satisfaite si
892 <em>chaîne_de_test</em> est égale au sens
893 lexicographique à l'<em>expression</em> (les deux chaînes
894 sont exactement identiques, caractère pour caractère). Si
895 <em>expression</em> est <code>""</code> (deux guillemets),
896 <em>chaîne_de_test</em> est comparée à la
899 <dt><strong><=expression de comparaison</strong></dt>
900 <dd>inférieur ou égal à au sens lexicographique<br />
901 Considère l'<em>expression_de_comparaison</em> comme une
902 chaîne de caractères et la compare au sens lexicographique à
903 la <em>chaîne_de_test</em>. Vrai si <em>chaîne_de_test</em>
904 précède lexicographiquement <em>expression_de_comparaison</em>, ou est
905 égale à <em>expression_de_comparaison</em> (les deux chaînes
906 sont identiques, caractère pour caractère).</dd>
908 <dt><strong>>=expression de comparaison</strong></dt>
909 <dd>supérieur ou égal à au sens lexicographique<br />
910 Considère l'<em>expression_de_comparaison</em> comme une
911 chaîne de caractères et la compare au sens lexicographique à
912 la <em>chaîne_de_test</em>. Vrai si <em>chaîne_de_test</em>
913 suit lexicographiquement <em>expression_de_comparaison</em>, ou est
914 égale à <em>expression_de_comparaison</em> (les deux chaînes
915 sont identiques, caractère pour caractère).</dd>
920 Vous pouvez effectuer des comparaisons d'entiers :
923 <dt><strong>-eq</strong></dt>
924 <dd>est numériquement égal à<br />
925 La <em>chaîne_de_test</em> est considérée comme un entier,
926 et est comparée numériquement à l'<em>expression de
927 comparaison</em>. Vrai si les deux expressions sont
928 numériquement égales.</dd>
930 <dt><strong>-ge</strong></dt>
931 <dd>est numériquement supérieur ou égal à<br />
932 La <em>chaîne_de_test</em> est considérée comme un entier,
933 et est comparée numériquement à l'<em>expression de
934 comparaison</em>. Vrai si <em>chaîne_de_test</em> est
935 numériquement supérieure ou égale à
936 <em>expression_de_comparaison</em>.</dd>
938 <dt><strong>-gt</strong></dt>
939 <dd>est numériquement supérieur à<br />
940 La <em>chaîne_de_test</em> est considérée comme un entier,
941 et est comparée numériquement à l'<em>expression de
942 comparaison</em>. Vrai si <em>chaîne_de_test</em> est
944 supérieure à <em>expression_de_comparaison</em>.</dd>
946 <dt><strong>-le</strong></dt>
947 <dd>est numériquement inférieur ou égal à<br />
948 La <em>chaîne_de_test</em> est considérée comme un entier,
949 et est comparée numériquement à l'<em>expression de
950 comparaison</em>. Vrai si <em>chaîne_de_test</em> est
952 inférieure ou égale à <em>expression_de_comparaison</em>.
953 Attention à la confusion avec le drapeau <strong>-l</strong>
954 en utilisant la variante the <strong>-L</strong> ou
955 <strong>-h</strong>.</dd>
957 <dt><strong>-lt</strong></dt>
958 <dd>est numériquement inférieur à<br />
959 La <em>chaîne_de_test</em> est considérée comme un entier,
960 et est comparée numériquement à l'<em>expression de
961 comparaison</em>. Vrai si <em>chaîne_de_test</em> est
963 inférieure à <em>expression_de_comparaison</em>.
964 Attention à la confusion avec le drapeau <strong>-l</strong>
965 en utilisant la variante the <strong>-L</strong> ou
966 <strong>-h</strong>.</dd>
968 <dt><strong>-ne</strong></dt>
969 <dd>Est numériquement <strong>n</strong>on <strong>é</strong>gal à<br />
970 La <em>Chaîne de test</em> est considérée comme un entier et est
971 numériquement comparée à l'<em>expression de comparaison</em>. Vrai
972 si les deux éléments comparés sont numériquement différents.
973 Equivalent à <code>!-eq</code>.</dd>
978 <li>Vous pouvez effectuer différents tests sur les attributs de
982 <dt><strong>-d</strong></dt>
983 <dd>est un <strong>r</strong>épertoire<br />
984 Traite <em>chaîne_de_test</em> comme un chemin et vérifie
985 s'il existe ou pas, et s'il s'agit d'un répertoire.</dd>
987 <dt><strong>-f</strong></dt>
988 <dd>est un <strong>f</strong>ichier régulier<br />
989 Traite <em>chaîne_de_test</em> comme un chemin et vérifie
990 s'il existe ou pas, et s'il s'agit d'un fichier régulier.</dd>
992 <dt><strong>-F</strong></dt>
993 <dd>test de l'existence d'un fichier via une sous-requête<br />
994 Vérifie si <em>chaîne_de_test</em> est un fichier valide,
995 accessible à travers tous les contrôles d'accès du serveur
996 actuellement configurés pour ce chemin. C'est une
997 sous-requête interne qui effectue cette vérification - à
998 utiliser avec précautions car les performances du serveur
999 peuvent s'en trouver affectées !</dd>
1001 <dt><strong>-h</strong></dt>
1002 <dd>est un lien symbolique, selon la convention bash<br />
1003 Voir <strong>-l</strong>.</dd>
1005 <dt><strong>-l</strong></dt>
1006 <dd>est un <strong>l</strong>ien symbolique<br />
1007 Considère la <em>chaîne_de_test</em> comme un chemin et
1008 vérifie son existence et si elle est un lien symbolique. On
1009 peut aussi utiliser la convention bash <strong>-L</strong>
1010 ou <strong>-h</strong> lorsqu'il y a risque de confusion
1011 avec les tests <strong>-lt</strong> ou <strong>-le</strong>.</dd>
1013 <dt><strong>-L</strong></dt>
1014 <dd>est un lien symbolique, selon la convention bash<br />
1015 Voir <strong>-l</strong>.</dd>
1017 <dt><strong>-s</strong></dt>
1018 <dd>est un fichier régulier d'une certaine taille<br />
1019 Considère la <em>chaîne_de_test</em> comme un chemin et
1020 vérifie son existence et si elle est un fichier régulier
1021 d'une taille supérieure à zéro.</dd>
1023 <dt><strong>-U</strong></dt>
1024 <dd><p>test de l'existence d'une
1025 URL via une sous-requête<br />
1026 Vérifie si <em>chaîne_de_test</em> est une URL valide,
1027 accessible à travers tous les contrôles d'accès du serveur
1028 actuellement configurés pour ce chemin. C'est une
1029 sous-requête interne qui effectue cette vérification - à
1030 utiliser avec précautions car les performances du serveur
1031 peuvent s'en trouver affectées !</p>
1032 <p>Ce drapeau ne renvoie <em>que</em> des informations
1033 concernant le contrôle d'accès, l'authentification et
1034 l'autorisation. Il ne renvoie <em>pas</em> d'informations
1035 concernant le code d'état que le gestionnaire configuré
1036 (static file, CGI, proxy, etc...) aurait, quant à lui,
1039 <dt><strong>-x</strong></dt>
1040 <dd>a l'attribut d'exécution positionné<br />
1041 Considère la <em>chaîne_de_test</em> comme un chemin et
1042 vérifie son existence et si elle a son attribut d'exécution
1043 positionné. Ce positionnement est déterminé en fonction de
1044 l'OS sous-jacent.</dd>
1050 <highlight language="config">
1051 RewriteCond /var/www/%{REQUEST_URI} !-f
1052 RewriteRule ^(.+) /other/archive/$1 [R]
1058 <p>Si la <em>chaîne_de_test</em> contient la valeur spéciale
1059 <code>expr</code>, la <em>chaîne de comparaison</em> sera
1060 traitée en tant qu'expression rationnelle de type <a
1061 href="../expr.html">ap_expr</a>.</p>
1064 Dans l'exemple ci-dessous, on utilise <code>-strmatch</code>
1065 pour comparer le <code>REFERER</code> avec le nom d'hôte du
1066 site afin de bloquer le hotlinking (référencement direct)
1070 <highlight language="config">
1071 RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
1072 RewriteRule "^/images" "-" [F]
1077 <p>Vous pouvez aussi définir certains drapeaux pour
1078 l'<em>expression_de_comparaison</em> en ajoutant ces
1079 <strong><code>[</code><em>drapeaux</em><code>]</code></strong>
1080 comme troisième argument de la directive
1081 <directive>RewriteCond</directive>, où <em>drapeaux</em> est un
1082 sous-ensemble séparé par des virgules des drapeaux suivants :</p>
1085 <li>'<strong><code>nocase|NC</code></strong>'
1086 (<strong>n</strong>o <strong>c</strong>ase)<br />
1087 Rend le test insensible à la casse - il n'est pas fait de
1088 distinction entre majuscules et minuscules, à la fois dans le
1089 développement de <em>chaîne_de_test</em> et dans
1090 <em>expression_de_comparaison</em>. Ce drapeau n'est pris en
1091 compte que lors d'une comparaison entre <em>chaîne_de_test</em>
1092 et <em>expression_de_comparaison</em>. Il ne l'est pas pour les
1093 vérification par sous-requêtes ou sur le système de
1097 '<strong><code>ornext|OR</code></strong>'
1098 (<strong>ou</strong> condition suivante)<br />
1099 Permet de chaîner les conditions de règles avec un OU au
1100 lieu du AND implicite. Exemple typique :
1102 <highlight language="config">
1103 RewriteCond "%{REMOTE_HOST}" "^host1" [OR]
1104 RewriteCond "%{REMOTE_HOST}" "^host2" [OR]
1105 RewriteCond "%{REMOTE_HOST}" "^host3"
1106 RewriteRule ...règles concernant tous ces hôtes...
1109 Sans ce drapeau, les paires
1110 condition/règle devraient être écrites trois fois.
1113 <li>'<strong><code>novary|NV</code></strong>'
1114 (<strong>n</strong>o <strong>v</strong>ary)<br />
1115 Si la condition contient un en-tête HTTP, ce drapeau empêche
1116 ce dernier d'être ajouté à l'en-tête Vary de la réponse. <br />
1117 L'utilisation de ce drapeau peut provoquer une mise en cache
1118 incorrecte de la réponse, si la représentation de cette réponse
1119 varie avec la valeur de l'en-tête considéré. Ce drapeau ne
1120 devrait donc être utilisé que si l'on maîtrise parfaitement le
1121 fonctionnement de l'en-tête Vary.
1126 <p><strong>Exemple :</strong></p>
1128 <p>Pour réécrire la page d'accueil d'un site en fonction de
1129 l'en-tête ``<code>User-Agent:</code>'' de la requête, vous
1130 pouvez utiliser ce qui suit : </p>
1132 <highlight language="config">
1133 RewriteCond "%{HTTP_USER_AGENT}" "(iPhone|Blackberry|Android)"
1134 RewriteRule "^/$" "/homepage.mobile.html" [L]
1136 RewriteRule "^/$" "/homepage.std.html" [L]
1139 <p>Explications : si vous utilisez un navigateur
1140 qui s'identifie comme un
1141 navigateur de plateforme mobile (notez que l'exemple est
1142 incomplet car il existe de nombreuses autres plateformes
1143 mobiles), c'est la version pour mobile de la page d'accueil qui
1144 sera renvoyée. Dans le cas contraire, ce sera la page d'accueil
1149 </directivesynopsis>
1152 <name>RewriteRule</name>
1153 <description>Définit les règles pour le moteur de réécriture</description>
1155 <em>Modèle</em> <em>Substitution</em> [<em>drapeaux</em>]</syntax>
1156 <contextlist><context>server config</context><context>virtual host</context>
1157 <context>directory</context><context>.htaccess</context></contextlist>
1158 <override>FileInfo</override>
1161 <p>La directive <directive>RewriteRule</directive> est le
1162 véritable cheval de trait de la réécriture. La directive peut
1163 apparaître plusieurs fois, chaque instance définissant une
1164 règle de réécriture particulière. L'ordre dans lequel ces règles
1165 sont définies est important - il s'agit de l'ordre dans lequel
1166 les règles seront appliquées au cours du processus de
1169 <p><a id="patterns" name="patterns"><em>Modèle</em></a> est une
1170 <a id="regexp" name="regexp">expression rationnelle</a>
1171 compatible perl. Ce avec quoi ce modèle est comparé dépend de l'endroit où
1172 la directive <directive>RewriteRule</directive> est définie.</p>
1174 <note><title><a id="what_is_matched" name="what_is_matched">Qu'est-ce qui est comparé ?</a></title>
1177 <li><p>Dans un contexte de serveur virtuel <directive
1178 module="core">VirtualHost</directive>, le <em>modèle</em> est tout
1179 d'abord comparé à la portion de l'URL située entre le nom d'hôte
1180 éventuellement accompagné du port, et la chaîne de paramètres (par
1181 exemple "/app1/index.html"). Il s'agit du <a
1182 href="directive-dict.html#Syntax">URL-path</a> décodé de sa valeur "%xx".</p></li>
1184 <li><p>Dans un contexte de répertoire (sections <directive
1185 module="core">Directory</directive> et fichiers .htaccess), le
1186 <em>Modèle</em> est comparé avec une partie de chemin ; par exemple une
1187 requête pour "/app1/index.html" entraînera une comparaison avec
1188 "app1/index.html" ou "index.html" selon l'endroit où la directive
1189 <directive>RewriteRule</directive> est définie.</p>
1191 <p>Le chemin où la règle est défini est supprimé du chemin correspondant
1192 du système de fichiers avant comparaison (jusqu'au slash final compris).
1193 En conséquence de cette suppression, les règles définies dans
1194 ce contexte n'effectuent des comparaisons qu'avec la portion du chemin
1195 du système de fichiers "en dessous" de l'endroit où la règle est définie.</p>
1197 <p>Le chemin correspondant actuel du système de fichiers est déterminé par
1198 des directives telles que <directive module="core">DocumentRoot</directive> et
1199 <directive module="mod_alias">Alias</directive>, ou même le résultat de
1200 substitutions dans des règles <directive>RewriteRule</directive> précédentes.
1204 <li><p>Si vous souhaitez faire une comparaison sur le nom
1205 d'hôte, le port, ou la chaîne de requête, utilisez une
1206 directive <directive module="mod_rewrite">RewriteCond</directive>
1207 comportant respectivement les variables
1208 <code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, ou
1209 <code>%{QUERY_STRING}</code>.</p></li>
1214 <note><title>Réécritures dans un contexte de répertoire</title>
1216 <li>L'utilisation du moteur de réécriture dans les
1217 fichiers <a href="../howto/htaccess.html">.htaccess</a> et les sections
1219 type="section" module="core">Directory</directive> est un peu plus
1222 <li>Pour activer le moteur de réécriture dans ces contextes, vous devez
1223 définir "<code>RewriteEngine On</code>" <strong>et</strong>
1224 "<code>Options FollowSymLinks</code>". Si l'administrateur a désactivé
1225 la possibilité de modifier l'option <code>FollowSymLinks</code> au
1226 niveau du répertoire d'un utilisateur, vous ne pouvez pas utiliser le
1227 moteur de réécriture. Cette restriction a été instaurée à des fins de
1230 <li>Voir la directive
1231 <directive module="mod_rewrite">RewriteBase</directive> pour plus de détails à
1232 propos de l'ajout du préfixe après les substitutions relatives.</li>
1234 <li>Si vous souhaitez effectuer une comparaison en prenant en compte
1236 chemin de l'URL dans un contexte de répertoire (htaccess), vous devez
1237 utiliser la variable <code>%{REQUEST_URI}</code> dans la directive
1238 <directive module="mod_rewrite">RewriteCond</directive>.</li>
1240 <li>Le prefixe supprimé se termine toujours par un slash, ce qui
1241 signifie que la comparaison s'effectue avec une chaîne qui ne comporte
1242 <em>jamais</em> de slash de début. Ainsi, un <em>modèle</em> contenant
1243 <code>^/</code> ne correspondra jamais dans un contexte de répertoire.</li>
1245 <li>Bien que les règles de réécriture soient permises du point de vue de
1246 la syntaxe dans les sections <directive type="section"
1247 module="core">Location</directive> et <directive type="section"
1248 module="core">Files</directive> (y compris leurs versions sous forme
1249 d'expression rationnelle), elles n'y sont pas prises en compte, et
1250 n'y sont à priori d'aucune utilité. Les substitutions
1251 relatives sont une fonctionnalité qui n'est, elle non-plus pas supportée
1252 dans ce genre de contexte.</li>
1256 <p>Pour quelques conseils à propos des <glossary
1257 ref="regex">expressions rationnelles</glossary>, voir le
1259 href="../rewrite/intro.html#regex">Introduction à
1260 mod_rewrite</a>.</p>
1262 <p>Dans <module>mod_rewrite</module>, on peut aussi utiliser le caractère
1263 NOT ('<code>!</code>') comme préfixe de modèle. Ceci vous permet
1264 d'inverser la signification d'un modèle, soit pour dire
1265 ``<em>si l'URL considérée ne correspond <strong>PAS</strong> à
1266 ce modèle</em>''. Le caractère NON peut donc être utilisé à
1267 titre exceptionnel, lorsqu'il est plus simple d'effectuer une
1268 comparaison avec le modèle inversé, ou dans la dernière règle
1271 <note><title>Note</title>
1272 Si vous utilisez le caractère NON pour inverser la signification d'un
1273 modèle, vous ne pouvez pas inclure de parties génériques groupées dans
1274 le modèle. Ceci est dû au fait que, lorsque le modèle ne correspond
1275 pas (autrement dit, sa négation correspond), les groupes sont vides.
1276 Ainsi, si vous utilisez des modèles inversés, vous ne pouvez
1277 pas vous référer aux groupes par <code>$N</code> dans la chaîne de
1281 <p>Dans une règle de réécriture,
1282 <a id="rhs" name="rhs"><em>Substitution</em></a> est la chaîne
1283 de caractères qui remplace le chemin de l'URL original qui
1284 correspondait au <em>Modèle</em>. <em>Substitution</em> peut
1289 <dt>un chemin du système de fichiers</dt>
1291 <dd>Il indique alors la localisation dans le système de
1292 fichiers de la ressource qui doit être envoyée au
1293 client. Les substitutions ne sont traitées en tant que chemins du
1294 système de fichiers que si la règle est configurée dans un
1295 contexte de serveur (serveur virtuel), et si le premier
1296 composant du chemin dans la substitution existe dans le système
1299 <dt>chemin d'URL</dt>
1301 <dd>Un chemin relatif à la valeur de <directive
1302 module="core">DocumentRoot</directive> vers la ressource qui
1303 doit être servie. Notez que <module>mod_rewrite</module>
1304 essaie de deviner si vous avez spécifié un chemin du système
1305 de fichiers ou un chemin d'URL en vérifiant si la première
1306 partie du chemin existe à la racine du système de fichiers.
1307 Par exemple, si vous avez spécifié comme chaîne de
1308 <em>Substitution</em> <code>/www/file.html</code>, cette
1309 dernière sera traitée comme un chemin d'URL <em>à moins</em>
1310 qu'un répertoire nommé <code>www</code> n'existe à la racine
1311 de votre système de fichiers (ou dans le cas d'une
1312 réécriture au sein d'un fichier <code>.htaccess</code>,
1313 relativement à la racine des documents), auquel cas la chaîne de
1314 substitution sera traitée comme un chemin du système de
1315 fichiers. Si vous désirez que d'autres directives de
1316 correspondance d'URL (comme la directive <directive
1317 module="mod_alias">Alias</directive>) soient appliquées au
1318 chemin d'URL résultant, utilisez le drapeau <code>[PT]</code>
1319 comme décrit ci-dessous.</dd>
1321 <dt>URL absolue</dt>
1323 <dd>Si une URL absolue est spécifiée,
1324 <module>mod_rewrite</module> vérifie si le nom d'hôte
1325 correspond à celui de l'hôte local. Si c'est le cas, le
1326 protocole et le nom d'hôte sont supprimés, et ce qui reste est
1327 traité comme un chemin d'URL. Dans le cas contraire, une
1328 redirection externe vers l'URL indiquée est effectuée. Pour
1329 forcer une redirection externe vers l'hôte local, voir le
1330 drapeau <code>[R]</code> ci-dessous.</dd>
1332 <dt><code>-</code> (tiret)</dt>
1334 <dd>Un tiret indique qu'aucune substitution ne doit être
1335 effectuée (le chemin considéré est transmis sans changement).
1336 Ceci est utile quand un drapeau doit être appliqué sans
1337 modifier le chemin (voir ci-dessous).</dd>
1341 <p>En plus du texte, la chaîne <em>Substitution</em> peut
1345 <li>des références arrières (<code>$N</code>) vers le modèle
1346 d'une directive RewriteRule</li>
1348 <li>des références arrières (<code>%N</code>) vers le dernier
1349 modèle d'une directive RewriteCond qui correspondait</li>
1351 <li>des variables du serveur comme dans les chaînes de test de
1352 condition d'une règle (<code>%{VARNAME}</code>)</li>
1355 <a href="#mapfunc">fonctions de comparaison</a>
1356 (<code>${nom correspondance:clé|défaut}</code>)</li>
1359 <p>Les références arrières sont des identificateurs de la forme
1360 <code>$</code><strong>N</strong> (<strong>N</strong>=0..9), qui
1361 seront remplacés par le contenu du <strong>N</strong>ème groupe
1362 du <em>Modèle</em> qui correspondait. Les variables du serveur
1363 sont les mêmes que dans la <em>Chaîne_de_test</em> d'une
1364 directive <directive module="mod_rewrite">RewriteCond</directive>. Les
1365 fonctions de comparaison sont issues de la directive <directive
1366 module="mod_rewrite">RewriteMap</directive> dans la
1367 section de laquelle elles sont décrites. Ces trois types de
1368 variables sont évaluées dans l'ordre ci-dessus.</p>
1370 <p>Chaque règle de réécriture s'applique au résultat de la règle
1371 précédente, selon l'ordre dans lequel elles ont été définies dans
1372 le fichier de configuration. Le chemin de l'URL ou du système de fichier (voir
1373 ci-dessus <a href="#what_is_matched">Qu'est-ce qui est
1374 comparé ?</a>) est <strong>intégralement
1375 remplacée</strong> par la chaîne de <em>Substitution</em> et le
1376 processus de réécriture se poursuit jusqu'à ce que toutes les
1377 règles aient été appliquées, ou qu'il soit explicitement stoppé
1379 href="../rewrite/flags.html#flag_l"><code><strong>L</strong></code></a>,
1380 ou par un autre drapeau qui implique un arrêt immédiat, comme
1381 <code><strong>END</strong></code> ou
1382 <code><strong>F</strong></code>.</p>
1384 <note><title>Modifier la chaîne de requête</title>
1385 <p>Par défaut, la chaîne de requête est transmise sans
1386 modification. Vous pouvez cependant créer dans la chaîne de
1387 substitution des URLs dont une partie constitue une chaîne de
1388 requête. Pour cela, ajoutez simplement un point d'interrogation
1389 dans la chaîne de substitution pour indiquer que le texte qui
1390 suit doit être réinjecté dans la chaîne de requête. Pour
1391 supprimer une chaîne de requête, terminez simplement la chaîne de
1392 substitution par un point d'interrogation. Pour combiner les
1393 nouvelles chaînes de requête avec les anciennes, utilisez le
1394 drapeau <code>[QSA]</code>.</p>
1398 <p>En outre, vous pouvez spécifier des <a name="rewriteflags"
1399 id="rewriteflags">actions</a> spéciales à effectuer en ajoutant
1401 <strong><code>[</code><em>drapeaux</em><code>]</code></strong>
1402 comme troisième argument de la directive
1403 <directive>RewriteRule</directive>. Séparés par des virgules au sein d'une
1404 liste encadrée par des crochets, les <em>drapeaux</em> peuvent
1405 être choisis dans la table suivante. Vous trouverez plus de
1406 détails, et des exemples pour chaque drapeau dans le <a
1407 href="../rewrite/flags.html">document à propos des drapeaux de
1410 <table border="1" style="zebra">
1411 <tr><th>Drapeaux et syntaxe</th>
1416 <td>Echappe les caractères non-alphanumériques
1417 dans les références arrières <em>avant</em>
1418 d'appliquer la transformation. <em><a
1419 href="../rewrite/flags.html#flag_b">détails ...</a></em></td>
1422 <td>backrefnoplus|BNP</td>
1423 <td>Avec ce drapeau, si les références arrières sont échappées,
1424 les espaces seront échappés en %20 au lieu de +. Ceci s'avère
1425 utile lorsqu'une référence arrière est utilisée dans la partie
1426 chemin, et non dans la chaîne de paramètres de la requête ;
1427 pour plus de détails, voir <em><a
1428 href="../rewrite/flags.html#flag_bnp">ici.</a></em></td>
1433 <td>La règle est chaînée avec la règle suivante. Si la règle
1434 échoue, la ou les règles avec lesquelles elle est est chaînée
1435 seront sautées. <em><a
1436 href="../rewrite/flags.html#flag_c">détails ...</a></em></td>
1439 <td>cookie|CO=<em>NAME</em>:<em>VAL</em></td>
1440 <td>Définit un cookie au niveau du navigateur client. La syntaxe
1442 CO=<em>NAME</em>:<em>VAL</em>:<em>domain</em>[:<em>lifetime</em>[:<em>path</em>[:<em>secure</em>[:<em>httponly</em>]]]] <em><a href="../rewrite/flags.html#flag_co">details ...</a></em>
1443 <em><a href="../rewrite/flags.html#flag_co">détails ...</a></em>
1447 <td>discardpath|DPI</td>
1448 <td>Supprime la partie PATH_INFO de l'URI réécrit. <em><a
1449 href="../rewrite/flags.html#flag_dpi">détails
1454 <td>Stoppe le processus de réécriture immédiatement et
1455 n'applique plus aucune règle. Empêche aussi l'application
1456 ultérieure de règles de réécriture dans les contextes de
1457 répertoire et de fichier .htaccess (disponible à partir de la
1458 version 2.3.9 du serveur HTTP Apache). <em><a
1459 href="../rewrite/flags.html#flag_end">détails ...</a></em></td>
1462 <td>env|E=[!]<em>VAR</em>[:<em>VAL</em>]</td>
1463 <td>Définit la variable d'environnement <em>VAR</em> (à la valeur
1464 <em>VAL</em> si elle est fournie). La variante !<em>VAR</em>
1465 annule la définition de la variable <em>VAR</em>.<em><a
1466 href="../rewrite/flags.html#flag_e">détails ...</a></em></td>
1469 <td>forbidden|F</td>
1470 <td>Renvoie une réponse 403 FORBIDDEN au navigateur client.
1471 <em><a href="../rewrite/flags.html#flag_f">détails ...</a></em></td>
1475 <td>Renvoie un message d'erreur 410 GONE au navigateur client. <em><a
1476 href="../rewrite/flags.html#flag_g">détails ...</a></em></td>
1479 <td>Handler|H=<em>Gestionnaire de contenu</em></td>
1480 <td>L'URI résultant est envoyé au <em>Gestionnaire de
1481 contenu</em> pour traitement. <em><a
1482 href="../rewrite/flags.html#flag_h">détails ...</a></em></td>
1486 <td>Arrête le processus de réécriture immédiatement et n'applique
1487 plus aucune règle. Prêtez une attention particulière aux mises
1488 en garde concernant les contextes de niveau répertoire et
1489 .htaccess (voir aussi le drapeau END). <em><a
1490 href="../rewrite/flags.html#flag_l">détails ...</a></em></td>
1494 <td>Réexécute le processus de réécriture à partir de la première
1495 règle, en utilisant le résultat du jeu de règles, sous réserve
1496 qu'il y ait un point de départ. <em><a
1497 href="../rewrite/flags.html#flag_n">détails
1502 <td>Rend la comparaison entre modèles insensible à la casse.
1503 <em><a href="../rewrite/flags.html#flag_nc">détails ...</a></em></td>
1506 <td>noescape|NE</td>
1507 <td>Empêche mod_rewrite d'effectuer un échappement hexadécimal
1508 des caractères spéciaux dans le résultat de la réécriture. <em><a
1509 href="../rewrite/flags.html#flag_ne">détails ...</a></em></td>
1512 <td>nosubreq|NS</td>
1513 <td>La règle est sautée si la requête courante est une
1514 sous-requête interne. <em><a
1515 href="../rewrite/flags.html#flag_ns">détails ...</a></em></td>
1519 <td>Force l'envoi en interne de l'URL de substitution en tant
1520 que requête mandataire. <em><a
1521 href="../rewrite/flags.html#flag_p">détails
1525 <td>passthrough|PT</td>
1526 <td>L'URI résultant est repassé au moteur de mise en
1527 correspondance des URLs pour y être traité par d'autres
1528 traducteurs URI-vers-nom de fichier, comme <code>Alias</code> ou
1529 <code>Redirect</code>. <em><a
1530 href="../rewrite/flags.html#flag_pt">détails ...</a></em></td>
1533 <td>qsappend|QSA</td>
1534 <td>Ajoute toute chaîne de paramètres présente dans l'URL de la
1535 requête originale à toute chaîne de paramètres créée dans la
1536 cible de réécriture. <em><a
1537 href="../rewrite/flags.html#flag_qsa">détails ...</a></em></td>
1540 <td>qsdiscard|QSD</td>
1541 <td>Supprime toute chaîne de paramètres de l'URI entrant. <em><a
1542 href="../rewrite/flags.html#flag_qsd">détails
1547 <td>Interprète le dernier (le plus à droite) point d'interrogation comme
1548 le délimiteur de la chaîne de paramètres de la requête, au lieu du
1549 premier (le plus à gauche) comme c'est le cas habituellement. Disponble
1550 à partir de la version 2.4.19 du serveur HTTP Apache. <em><a
1551 href="../rewrite/flags.html#flag_qsl">détails ...</a></em></td>
1555 <td>redirect|R[=<em>code</em>]</td>
1556 <td>Force une redirection externe, avec un code de statut HTTP
1558 href="../rewrite/flags.html#flag_r">détails ...</a></em>
1562 <td>skip|S=<em>nombre</em></td>
1563 <td>Si la règle courante s'applique, le moteur de réécriture
1564 doit sauter les <em>nombre</em> règles suivantes. <em><a
1565 href="../rewrite/flags.html#flag_s">détails ...</a></em></td>
1568 <td>type|T=<em>MIME-type</em></td>
1569 <td>Force l'attribution du <glossary>Type-MIME</glossary>
1570 spécifié au fichier cible. <em><a
1571 href="../rewrite/flags.html#flag_t">détails ...</a></em></td>
1575 <note><title>Développement du répertoire home</title>
1576 <p> Quand la chaîne de substitution commence par quelque chose comme
1577 "/~user" (de manière explicite ou par références arrières), <module>mod_rewrite</module>
1578 développe le répertoire home sans tenir compte de la présence ou de la
1579 configuration du module <module>mod_userdir</module>.</p>
1581 <p> Ce développement n'est pas effectué si le drapeau <em>PT</em> est
1582 utilisé dans la directive <directive module="mod_rewrite">RewriteRule</directive></p>
1585 <p>Voici toutes les combinaisons de substitution et leurs
1586 significations :</p>
1588 <p><strong>Dans la configuration au niveau du serveur principal
1589 (<code>httpd.conf</code>)<br />
1590 pour la requête ``<code>GET
1591 /chemin/infochemin</code>'':</strong><br />
1594 <table border="1" style="zebra">
1597 <th>Résultat de la substitution</th>
1601 <td>^/un_chemin(.*) autre_chemin$1</td>
1602 <td>invalide, non supporté</td>
1606 <td>^/un_chemin(.*) autre_chemin$1 [R]</td>
1607 <td>invalide, non supporté</td>
1611 <td>^/un_chemin(.*) autre_chemin$1 [P]</td>
1612 <td>invalide, non supporté</td>
1616 <td>^/un_chemin(.*) /autre_chemin$1</td>
1617 <td>/autre_chemin/info_chemin</td>
1621 <td>^/un_chemin(.*) /autre_chemin$1 [R]</td>
1622 <td>http://cet_hote/autre_chemin/info_chemin via une redirection externe</td>
1626 <td>^/un_chemin(.*) /autre_chemin$1 [P]</td>
1627 <td>sans objet, non supporté</td>
1631 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1</td>
1632 <td>/autre_chemin/info_chemin</td>
1636 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1 [R]</td>
1637 <td>http://cet_hote/autre_chemin/info_chemin via une redirection externe</td>
1641 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1 [P]</td>
1642 <td>sans objet, non supporté</td>
1646 <td>^/un_chemin(.*) http://autre_hote/autre_chemin$1</td>
1647 <td>http://autre_hote/autre_chemin/info_chemin via une redirection externe</td>
1651 <td>^/un_chemin(.*) http://autre_hote/autre_chemin$1 [R]</td>
1652 <td>http://autre_hote/autre_chemin/info_chemin (le drapeau [R] est
1657 <td>^/somepath(.*) http://otherhost/otherpath$1 [P]</td>
1658 <td>http://otherhost/otherpath/pathinfo via internal proxy</td>
1662 <p><strong>Dans une configuration de niveau répertoire pour
1663 <code>/chemin</code><br />
1664 (<code>/chemin/physique/vers/chemin/.htacccess</code>, avec
1665 <code>RewriteBase "/chemin"</code>)<br />
1666 pour la requête ``<code>GET
1667 /chemin/chemin-local/infochemin</code>'':</strong><br />
1670 <table border="1" style="zebra">
1674 <th>Résultat de la substitution</th>
1678 <td>^chemin-local(.*) autre-chemin$1</td>
1679 <td>/chemin/autre-chemin/infochemin</td>
1683 <td>^chemin-local(.*) autre-chemin$1 [R]</td>
1684 <td>http://cet-hôte/chemin/autre-chemin/infochemin via redirection
1689 <td>^chemin-local(.*) autre-chemin$1 [P]</td>
1690 <td>n'a pas lieu d'être, non supporté</td>
1694 <td>^chemin-local(.*) /autre-chemin$1</td>
1695 <td>/autre-chemin/infochemin</td>
1699 <td>^chemin-local(.*) /autre-chemin$1 [R]</td>
1700 <td>http://cet-hôte/autre-chemin/infochemin via redirection externe</td>
1704 <td>^chemin-local(.*) /autre-chemin$1 [P]</td>
1705 <td>n'a pas lieu d'être, non supporté</td>
1709 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1</td>
1710 <td>/autre-chemin/infochemin</td>
1714 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1 [R]</td>
1715 <td>http://cet-hôte/autre-chemin/infochemin via redirection externe</td>
1719 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1 [P]</td>
1720 <td>n'a pas lieu d'être, non supporté</td>
1724 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1</td>
1725 <td>http://autre hôte/autre-chemin/infochemin via redirection externe</td>
1729 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1 [R]</td>
1730 <td>http://autre hôte/autre-chemin/infochemin via redirection externe
1731 (le drapeau [R] est redondant)</td>
1735 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1 [P]</td>
1736 <td>http://autre hôte/autre-chemin/infochemin via un mandataire interne</td>
1742 </directivesynopsis>