2 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision : 1403476 -->
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
94 mentionné plus haut.
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>Pour désactiver le module, il vaut mieux utiliser cette
126 directive que commenter toutes les directives <directive
127 module="mod_rewrite">RewriteRule</directive> !</p>
129 <p>Notez que les hôtes virtuels n'héritent pas des
130 configurations de réécriture. Ceci implique que vous devez
131 insérer une directive <code>RewriteEngine on</code> dans chaque
132 hôte virtuel pour lequel vous souhaitez utiliser des règles
133 de réécriture.</p>
135 <p>Les directives <directive>RewriteMap</directive> du type
136 <code>prg</code> ne sont pas prises en compte au cours de
137 l'initialisation du serveur si elle ont été définies dans un
138 contexte où la directive <directive>RewriteEngine</directive> n'a
139 pas été définie à <code>on</code>.</p>
146 <name>RewriteOptions</name>
147 <description>Configure certaines options spéciales
148 pour le moteur de réécriture</description>
149 <syntax>RewriteOptions <var>Options</var></syntax>
150 <contextlist><context>server config</context><context>virtual host</context>
151 <context>directory</context><context>.htaccess</context></contextlist>
152 <override>FileInfo</override>
153 <compatibility><code>MaxRedirects</code> n'est plus disponible depuis
154 la version version 2.1</compatibility>
157 <p>La directive <directive>RewriteOptions</directive> définit
158 certaines options spéciales pour la configuration au niveau du
159 serveur ou du répertoire. La chaîne de caractères <em>Option</em>
160 ne peut actuellement prendre qu'une des valeurs suivantes :</p>
163 <dt><code>Inherit</code></dt>
166 <p>Ceci force la configuration locale à hériter de la
167 configuration du niveau supérieur. Dans le contexte des hôtes
168 virtuels, cela signifie que les correspondances, conditions et
169 règles du serveur principal sont héritées. Dans le contexte des
170 répertoires, cela signifie que les conditions et règles de la
171 configuration <code>.htaccess</code> ou les sections <directive
172 type="section" module="core">Directory</directive> du répertoire
173 parent sont héritées. Les règles héritées sont virtuellement
174 copiées dans la section où cette directive est utilisée. Si elles
175 sont utilisées avec des règles locales, les règles héritées sont
176 placées après ces dernières. La place de cette directive - avant
177 ou après les règles locales - n'a aucune influence sur ce
178 comportement. Si des règles locales ont forcé l'arrêt de la
179 réécriture, les règles héritées ne seront pas traitées.</p>
181 <note type="warning">
182 Les règles héritées du niveau parent sont appliquées
183 <strong>after</strong> après les règles spécifiées dans le niveau
188 <dt><code>InheritBefore</code></dt>
190 <p>Même effet que l'option <code>Inherit</code> ci-dessus, mais
191 les règles spécifiées dans le niveau parent s'appliquent
192 <strong>avant</strong> les règles spécifiées dans le niveau
193 enfant. Disponible depuis la version 2.3.10 du serveur HTTP
197 <dt><code>AllowNoSlash</code></dt>
199 <p>Par défaut, <module>mod_rewrite</module> ignore les URLs qui
200 correspondent à un répertoire sur disque, mais ne comportent pas
201 de slash final, afin que le module <module>mod_dir</module>
202 redirige le client vers l'URL canonique avec un slash final.</p>
204 <p>Lorsque la directive <directive
205 module="mod_dir">DirectorySlash</directive> est définie à off, il
206 est possible de spécifier l'option <code>AllowNoSlash</code> pour
207 s'assurer que les règles de réécriture ne soient plus ignorées.
208 Si on le souhaite, cette option permet de faire s'appliquer des
209 règles de réécriture qui correspondent à un répertoire sans slash
210 final au sein de fichiers .htaccess. Elle est disponible à
211 partir de la version 2.4.0 du serveur HTTP Apache.</p>
214 <dt><code>AllowAnyURI</code></dt>
217 <p>A partir de la version 2.2.22 de httpd, lorsqu'une directive <directive
218 module="mod_rewrite">RewriteRule</directive> se situe dans un
219 contexte de <code>serveur virtuel</code> ou de serveur principal,
220 <module>mod_rewrite</module> ne traitera les règles de réécriture
221 que si l'URI de la requête respecte la syntaxe d'un <a
222 href="./directive-dict.html#Syntax">chemin URL</a>. Ceci permet
223 d'éviter certains problèmes de sécurité où des règles
224 particulières pourraient permettre des développements de modèles
226 href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3368">CVE-2011-3368</a>
228 href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4317">CVE-2011-4317</a>).
229 Pour s'affranchir de la restriction relative à la syntaxe des chemins URL, on peut
230 utiliser l'option <code>AllowAnyURI</code>, afin de permettre à
231 <module>mod_rewrite</module> d'appliquer le jeu de règles à toute
232 chaîne de requête URI, sans vérifier si cette dernière respecte la
233 grammaire des chemins URL définie dans la spécification HTTP.</p>
235 <note type="warning">
236 <title>Avertissement à propos de la sécurité</title>
238 <p>L'utilisation de cette option rendra le serveur vulnérable à
239 certains problèmes de sécurité si les règles de réécritures
240 concernées n'ont pas été rédigées avec soin. Il est par conséquent
241 <strong>fortement recommandé</strong> de ne pas utiliser cette
242 option. En particulier, prêtez attention aux chaînes en entrée contenant le
243 caractère '<code>@</code>', qui peuvent modifier l'interprétation
244 de l'URI réécrite, comme indiqué dans les liens ci-dessus.</p>
254 <name>RewriteMap</name>
255 <description>Définit une fonction de mise en correspondance pour la
256 recherche de mots-clés</description>
257 <syntax>RewriteMap <em>nom de la correspondance</em> <em>type de
258 correspondance</em>:<em>source de la correspondance</em>
260 <contextlist><context>server config</context><context>virtual host</context>
262 <compatibility>Il est possible de choisir entre plusieurs types de
263 bases de données depuis la version 2.0.41 du serveur HTTP Apache</compatibility>
266 <p>La directive <directive>RewriteMap</directive> définit une
267 <em>Table de correspondance pour la réécriture</em> que les
268 fonctions de mise en correspondance
269 peuvent utiliser dans les chaînes de substitution des règles
270 pour insérer/substituer des champs en recherchant des mots-clés.
271 La source utilisée pour cette recherche peut être de plusieurs
274 <p><a id="mapfunc" name="mapfunc"><em>nom de la
275 correspondance</em></a> est le nom de la table de correspondance
276 et servira à spécifier une fonction de mise en correspondance
277 pour les chaînes de substitution d'une règle de réécriture selon
278 une des constructions suivantes :</p>
281 <strong><code>${</code> <em>nom de la
282 correspondance</em> <code>:</code>
283 <em>mot-clé</em> <code>}</code><br />
284 <code>${</code> <em>nom de la
285 correspondance</em> <code>:</code>
286 <em>mot-clé</em> <code>|</code> <em>valeur par défaut</em>
287 <code>}</code></strong>
290 <p>Lorsqu'une telle construction est rencontrée, la table de
291 correspondance <em>Nom de la correspondance</em> est consultée
292 et la clé <em>mot-clé</em> recherchée. Si la clé est trouvée, la
293 construction est remplacée par
294 la <em>valeur de remplacement</em>. Si la clé n'est pas trouvée,
295 elle est remplacée par la <em>valeur par défaut</em>, ou par une
296 chaîne vide si aucune <em>valeur par défaut</em> n'est
297 spécifiée. La valeur vide se comporte comme si la
298 clé était absente ; il est donc impossible de distinguer une
299 valeur vide d'une absence de clé.</p>
301 <p>Par exemple, vous pouvez définir une directive
302 <directive>RewriteMap</directive> comme suit </p>
304 <highlight language="config">
305 RewriteMap map-exemple txt:/chemin/vers/fichier/map.txt
308 <p>Vous pourrez ensuite utiliser cette table dans une
309 directive <directive>RewriteRule</directive> comme suit :</p>
311 <highlight language="config">
312 RewriteRule ^/ex/(.*) ${map-exemple:$1}
315 <p>Les combinaisons suivantes pour <em>type de correspondance</em>
316 et <em>source de la correspondance</em>
317 peuvent être utilisées :</p>
321 <dd>Un fichier texte contenant des paires clé-valeur séparées
322 par des espaces, une paire par ligne (<a
323 href="../rewrite/rewritemap.html#txt">Détails ...</a>).</dd>
326 <dd>Sélection aléatoire d'une entrée depuis un fichier texte (<a
327 href="../rewrite/rewritemap.html#rnd">Détails ...</a>).</dd>
330 <dd>Recherche une entrée dans un fichier dbm contenant des
331 paires nom-valeur. Le condensé hash est élaboré à partir d'un
332 format de fichier texte via l'utilitaire <code><a
333 href="../programs/httxt2dbm.html">httxt2dbm</a></code> (<a
334 href="../rewrite/rewritemap.html#dbm">Détails ...</a>).</dd>
337 <dd>Une des quatre fonctions internes disponibles que fournit
338 <code>RewriteMap</code>: toupper, tolower, escape ou unescape
339 (<a href="../rewrite/rewritemap.html#int">Détails ...</a>).</dd>
342 <dd>Appelle un programme externe ou un script pour effectuer la
343 réécriture (<a href="../rewrite/rewritemap.html#int">Détails
346 <dt>dbd or fastdbd</dt>
347 <dd>Une commande SQL SELECT à exécuter pour rechercher la cible
348 de réécriture (<a href="../rewrite/rewritemap.html#int">Détails
352 <p>Vous trouverez plus de détails et de nombreux exemples dans le <a
353 href="../rewrite/rewritemap.html">RewriteMap HowTo</a>.</p>
359 <name>RewriteBase</name>
360 <description>Définit l'URL de base pour les réécritures au niveau
361 répertoire</description>
362 <syntax>RewriteBase <em>chemin URL</em></syntax>
363 <default>Pas de valeur par défaut</default>
364 <contextlist><context>directory</context><context>.htaccess</context>
366 <override>FileInfo</override>
369 <p>La directive <directive>RewriteBase</directive> permet de
370 spécifier le préfixe d'URL à utiliser dans un contexte de
371 répertoire (htaccess) pour les directives
372 <directive>RewriteRule</directive> qui réécrivent vers un chemin
374 <p>Cette directive est <em>obligatoire</em> si vous utilisez un
375 chemin relatif dans une substitution, et dans un contexte de
376 répertoire (htaccess), sauf si au moins une de ces conditions est
377 vérifiée :</p>
379 <li>La requête initiale, ainsi que la substitution, sont dans
380 la <directive module="core">DocumentRoot</directive> (c'est à
381 dire que pour y accéder, il n'est pas nécessaire d'utiliser
382 une directive telle qu'<directive
383 module="mod_alias">Alias</directive>).</li>
384 <li>Le chemin du système de fichiers vers le répertoire
385 contenant la <directive>RewriteRule</directive>, suffixé par
386 la substitution relative est aussi valide en tant qu'URL sur
387 le serveur (ce qui est rare).</li>
390 <p>Dans l'exemple ci-dessous, la directive
391 <directive>RewriteBase</directive> est nécessaire afin d'éviter une
392 réécriture en http://example.com/opt/myapp-1.2.3/welcome.html car la
393 ressource n'était pas relative à la racine des documents. Cette erreur
394 de configuration aurait conduit le serveur à rechercher un répertoire
395 "opt" à la racine des documents.</p>
397 <highlight language="config">
398 DocumentRoot /var/www/example.com
399 Alias /myapp /opt/myapp-1.2.3
400 <Directory /opt/myapp-1.2.3>
403 RewriteRule ^index\.html$ welcome.html
411 <name>RewriteCond</name>
412 <description>Définit une condition qui devra être satisfaite pour que
413 la réécriture soit effectuée
416 <em>chaîne de test</em> <em>expression de comparaison</em></syntax>
417 <contextlist><context>server config</context><context>virtual host</context>
418 <context>directory</context><context>.htaccess</context></contextlist>
419 <override>FileInfo</override>
422 <p>La directive <directive>RewriteCond</directive> permet de définir une
423 condition d'exécution d'une règle. Une ou plusieurs conditions
424 <directive>RewriteCond</directive> peuvent précéder une
425 directive <directive module="mod_rewrite"
426 >RewriteRule</directive>. La règle de réécriture correspondante n'est
427 ainsi exécutée que si ces conditions sont satisfaites,
428 <strong>et</strong> si l'URI correspond au modèle spécifié dans la
431 <p><em>TestString</em> est une chaîne qui peut contenir les
432 extensions suivantes en plus du texte simple :</p>
436 <strong>références arrières de règle de réécriture</strong> :
437 ce sont des références arrières de la forme
438 <strong><code>$N</code></strong> (0 <= N <= 9). $1 à $9
439 permettent d'accéder aux parties regroupées (entre
440 parenthèses) du modèle, issues de la <code>RewriteRule</code>
441 concernée par le jeu de conditions <code>RewriteCond</code>
442 courant. $0 donne accès à l'ensemble de la chaîne
443 correspondant au modèle.</li>
445 <strong>Références arrières de condition de réécriture
446 </strong> : ce sont des références arrières de la forme
447 <strong><code>%N</code></strong> (0 <= N <= 9). %1 à %9
448 permettent d'accéder aux parties regroupées (entre
449 parenthèses) du modèle, issues de la <code>RewriteRule</code>
450 concernée par le jeu de conditions <code>RewriteCond</code>
451 courant. %0 donne accès à l'ensemble de la chaîne
452 correspondant au modèle.</li>
454 <strong>extensions de table de réécriture</strong> :
455 ce sont des extensions de la forme <strong><code
456 >${nomTable:clé|défaut}</code></strong>. Voir la <a
457 >href="#mapfunc">documentation sur RewriteMap</a>
458 pour plus de détails.
461 <strong>Variables du serveur</strong> :
462 ce sont des variables de la forme
463 <strong><code>%{</code> <em>NAME_OF_VARIABLE</em> <code>}</code></strong>,
464 où <em>NOM_DE_VARIABLE</em> peut contenir une chaîne issue
465 de la liste suivante :
468 <columnspec><column width=".3"/><column width=".3"/>
469 <column width=".3"/></columnspec>
471 <th>En-têtes HTTP :</th> <th>connexion & requête:</th> <th></th>
476 HTTP_USER_AGENT<br />
481 HTTP_PROXY_CONNECTION<br />
492 SCRIPT_FILENAME<br />
502 <th>variables internes au serveur :</th> <th>date et heure :</th> <th>spéciaux :</th>
512 SERVER_PROTOCOL<br />
513 SERVER_SOFTWARE<br />
531 REQUEST_FILENAME<br />
539 <p>Ces variables correspondent toutes aux en-têtes MIME
540 HTTP de mêmes noms, au variables C du serveur HTTP Apache, ou
541 aux champs <code>struct tm</code> du système Unix. La
542 plupart d'entre elles sont documentées ailleurs dans le
543 manuel ou dans la spécification CGI.</p>
545 <p>SERVER_NAME et SERVER_PORT dépendent respectivement
546 des valeurs des directives <directive
547 module="core">UseCanonicalName</directive> et <directive
548 module="core">UseCanonicalPhysicalPort</directive>.</p>
550 <p>Parmi les variables
551 spécifiques à mod_rewrite, ou trouve les suivantes :</p>
554 <dt><code>IS_SUBREQ</code></dt>
556 <dd>Contient le texte "true" si la requête en cours
557 de traitement est une sous-requête, "false" dans le
558 cas contraire. Une sous-requête est générée quand un
559 module a besoin de se référer à des fichiers ou URIs
560 addidionnels pour pouvoir mener à bien sa tâche.</dd>
562 <dt><code>API_VERSION</code></dt>
564 <dd>C'est la version de l'API des modules Apache httpd
565 (l'interface interne entre le serveur et les modules)
566 pour la construction courante de httpd, telle qu'elle
567 est définie dans include/ap_mmn.h. La version de l'API
568 des modules correspond à la version du serveur Apache
570 utilisé (par exemple, pour la version 1.3.14 d'Apache
572 il s'agit de la version 19990320:10), mais intéresse
573 principalement les auteurs de modules.</dd>
575 <dt><code>THE_REQUEST</code></dt>
577 <dd>La ligne de requête HTTP complète envoyée par le
578 navigateur au serveur (par exemple, "<code>GET
579 /index.html HTTP/1.1</code>"), à l'exclusion de tout
580 en-tête ajouté par le navigateur. Cette
581 valeur n'a pas été déséchappée (décodée), à la
582 différence de la plupart des variables suivantes.</dd>
584 <dt><code>REQUEST_URI</code></dt>
586 <dd>La partie chemin de l'URI de la requête, comme
587 "/index.html". En particulier, ceci exclut la chaîne
588 de paramètres qui est quant à elle disponible via sa
589 propre variable <code>QUERY_STRING</code>.</dd>
591 <dt><code>REQUEST_FILENAME</code></dt>
593 <dd>Le chemin complet local au système de fichiers
594 du fichier ou du script correspondant
595 à la requête, s'il a déjà été déterminé par le serveur
596 au moment où on y fait référence. Dans le cas
597 contraire, et en particulier dans le cas d'un serveur
598 virtuel, <code>REQUEST_FILENAME</code> contient la
599 valeur de <code>REQUEST_URI</code>.</dd>
601 <dt><code>HTTPS</code></dt>
603 <dd>Contient le texte "on" si la connexion
604 utilise SSL/TLS, "off" dans le cas contraire
605 (Cette variable peut être utilisée sans problème, que
606 <module>mod_ssl</module> soit chargé ou non.</dd>
608 <dt><code>REQUEST_SCHEME</code></dt>
610 <dd>Contient le protocole de la requête (en général
611 "http" ou "https"). La valeur peut être modifiée par
612 la directive <directive
613 module="core">ServerName</directive>.</dd>
620 <p>Si la <em>chaîne de test</em> contient la valeur spéciale
621 <code>expr</code>, <em>expression de comparaison</em> sera traité
622 en tant qu'expression rationnelle de type <a
623 href="../expr.html">ap_expr</a>. Si des en-têtes HTTP sont
624 référencés dans l'expression rationnelle, et si le drapeau
625 <code>novary</code> n'est pas activé, ils seront ajoutés à
626 l'en-tête Vary.</p>
628 <p>Autres points à connaître ::</p>
631 <p>Les variables <code>SCRIPT_FILENAME</code> et
632 <code>REQUEST_FILENAME</code> contiennent toutes deux la valeur
633 du champ <code>filename</code> de la
634 structure interne <code>request_rec</code>du serveur HTTP Apache.
635 Le premier nom correspond au nom de variable bien connu CGI,
636 alors que le second est l'équivalent de REQUEST_URI (qui
637 contient la valeur du champ <code>uri</code> de
638 <code>request_rec</code>).</p>
639 <p>Si une substitution intervient et si la réécriture se
640 poursuit, la valeur des deux variables sera mise à jour en
641 conséquence.</p>
642 <p>Dans le contexte du serveur principal (c'est à dire avant que
643 la requête ne soit mise en correspondance avec le système de
644 fichiers), SCRIPT_FILENAME et REQUEST_FILENAME ne peuvent pas
645 contenir le chemin entier dans le système de fichiers local car
646 ce chemin b'est pas connu à ce stade du traitement. Dans ce cas,
647 les deux variables contiendront la valeur de REQUEST_URI. Pour
648 obtenir le chemin complet de la requête dans le système de
649 fichiers local dans le contexte du serveur principal, utilisez une
650 référence avant à base d'URL
651 <code>%{LA-U:REQUEST_FILENAME}</code> pour déterminer la valeur
652 finale de REQUEST_FILENAME.</p></li>
656 <code>%{ENV:<em>variable</em>}</code>, où <em>variable</em> peut
657 correspondre à une variable d'environnement quelconque.</li>
659 <code>%{ENV:variable}</code> est aussi disponible, où
660 <em>variable</em> peut correspondre à toute variable
661 d'environnement. Peut être consulté via des structures internes
662 d'Apache httpd et (si on ne les trouve pas ici) via la fonction
663 <code>getenv()</code> à partir du processus du serveur Apache
666 <li>Que <module>mod_ssl</module> soit chargé ou non, on peut
667 utiliser <code>%{SSL:variable}</code>, où <em>variable</em>
668 peut être remplacé par le nom d'une
669 <a href="mod_ssl.html#envvars">variable
670 d'environnement SSL</a> . Si <module>mod_ssl</module> n'est pas
671 chargé, cette variable contiendra toujours une chaîne vide.
672 Exemple : <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> pourra
673 contenir la valeur <code>128</code>.</li>
676 On peut utiliser <code>%{HTTP:en-tête}</code>, où
677 <em>en-tête</em> peut correspondre à tout nom d'en-tête MIME
678 HTTP, pour extraire la valeur d'un en-tête envoyé dans la
679 requête HTTP. Par exemple, <code>%{HTTP:Proxy-Connection}</code>
680 contiendra la valeur de l'en-tête HTTP
681 "<code>Proxy-Connection:</code>".
682 Si on utilise un en-tête HTTP
683 dans une condition, et si cette condition est évaluée à
684 <code>vrai</code> pour la requête, cet en-tête sera ajouté à l'en-tête Vary de
685 la réponse. Il ne le sera pas si la condition est évaluée à
686 <code>faux</code>. L'ajout de l'en-tête HTTP à l'en-tête Vary
687 est nécessaire à une mise en cache appropriée.
688 <p>Il faut garder à l'esprit que les conditions suivent une
689 logique de cout-circuit si le drapeau
690 '<strong><code>ornext|OR</code></strong>' est utilisé, et que de
691 ce fait, certaines d'entre elles ne seront pas évaluées.</p>
694 <li>A des fins de référence avant, on peut utiliser,
695 <code>%{LA-U:variable}</code>, qui
696 permet d'effectuer une sous-requête interne à base d'URL, afin
697 de déterminer la valeur finale de <em>variable</em>. Ceci permet
698 d'accéder à la valeur d'une variable pour la réécriture inconnue
699 à ce stade du traitement, mais qui sera définie au
700 cours d'une phase ultérieure.
701 <p>Par exemple, pour effectuer une réécriture dépendant de la
702 variable <code>REMOTE_USER</code> dans le contexte du serveur
703 principal (fichier <code>httpd.conf</code>), vous devez utiliser
704 <code>%{LA-U:REMOTE_USER}</code> - cette variable est définie
705 par la phase d'autorisation qui intervient <em>après</em> la
706 phase de traduction d'URL (pendant laquelle mod_rewrite opère).</p>
707 <p>Par contre, comme mod_rewrite implémente son contexte de
708 répertoire (fichier <code>.htaccess</code>) via la phase Fixup
709 de l'API, et comme la phase d'autorisation intervient
710 <em>avant</em> cette dernière, vous pouvez vous contenter
711 d'utiliser <code>%{REMOTE_USER}</code> dans ce contexte.</p></li>
714 <code>%{LA-F:variable}</code> peut être utilisée pour effectuer
715 une sous-requête interne (basée sur le nom de fichier), afin de
716 déterminer la valeur finale de <em>variable</em>. La plupart du
717 temps, elle est identique à LA-U (voir ci-dessus).</li>
721 <p><em>expression de comparaison</em> est une expression
722 rationnelle qui est appliquée à l'instance actuelle de
723 <em>chaîne de test</em>. <em>chaîne de test</em> est d'abord
724 évaluée, puis comparée à
725 l'<em>expression de comparaison</em>.</p>
727 <p><em>expression de comparaison</em> est en général une
728 <em>expression rationnelle compatible perl</em>, mais vous
729 disposez des syntaxes supplémentaires suivantes pour effectuer
730 d'autres tests utiles sur <em>chaîne de test</em> :
734 <li>Vous pouvez préfixer l'expression avec un caractère
735 '<code>!</code>' (point d'exclamation) pour indiquer une
736 expression de <strong>non</strong>-correspondance.</li>
738 <li>Vous pouvez effectuer des comparaisons lexicographiques de
742 <li>'<strong><expression</strong>' (inférieur au sens
743 lexicographique)<br />
744 Traite l'<em>expression</em> comme une chaîne de
745 caractères et la compare lexicographiquement à
746 <em>chaîne de test</em>. La condition est satisfaite si
747 <em>chaîne de test</em> est inférieure au sens
748 lexicographique à l'<em>expression</em>.</li>
750 <li>'<strong>>expression</strong>' (supérieur au sens
751 lexicographique)<br />
752 Traite l'<em>expression</em> comme une chaîne de
753 caractères et la compare lexicographiquement à
754 <em>chaîne de test</em>. La condition est satisfaite si
755 <em>chaîne de test</em> est supérieure au sens
756 lexicographique à l'<em>expression</em>.</li>
758 <li>'<strong>=expression</strong>' (égal au sens
759 lexicographique)<br />
760 Traite l'<em>expression</em> comme une chaîne de
761 caractères et la compare lexicographiquement à
762 <em>chaîne de test</em>. La condition est satisfaite si
763 <em>chaîne de test</em> est égale au sens
764 lexicographique à l'<em>expression</em> (les deux chaînes
765 sont exactement identiques, caractère pour caractère). Si
766 <em>expression</em> est <code>""</code> (deux guillemets),
767 <em>chaîne de test</em> est comparée à la chaîne vide.</li>
769 <li>'<strong><=expression de comparaison</strong>' (inférieur ou égal à
770 au sens lexicographique)<br />
771 Considère l'<em>expression de comparaison</em> comme une
772 chaîne de caractères et la compare au sens lexicographique à
773 la <em>chaîne de test</em>. Vrai si <em>chaîne de test</em>
774 précède lexicographiquement <em>expression de comparaison</em>, ou est
775 égale à <em>expression de comparaison</em> (les deux chaînes
776 sont identiques, caractère pour caractère).</li>
778 <li>'<strong>>=expression de comparaison</strong>'
779 (supérieur ou égal à au sens lexicographique)<br />
780 Considère l'<em>expression de comparaison</em> comme une
781 chaîne de caractères et la compare au sens lexicographique à
782 la <em>chaîne de test</em>. Vrai si <em>chaîne de test</em>
783 suit lexicographiquement <em>expression de comparaison</em>, ou est
784 égale à <em>expression de comparaison</em> (les deux chaînes
785 sont identiques, caractère pour caractère).</li>
789 Vous pouvez effectuer des comparaisons d'entiers :
792 <li>'<strong>-eq</strong>' (est numériquement égal à)<br />
793 La <em>chaîne de test</em> est considérée comme un entier,
794 et est comparée numériquement à l'<em>expression de
795 comparaison</em>. Vrai si les deux expressions sont
796 numériquement égales.</li>
798 <li>'<strong>-ge</strong>' (est numériquement supérieur ou
799 égal à)<br />
800 La <em>chaîne de test</em> est considérée comme un entier,
801 et est comparée numériquement à l'<em>expression de
802 comparaison</em>. Vrai si <em>chaîne de test</em> est
804 supérieure ou égale à <em>expression de comparaison</em>.</li>
806 <li>'<strong>-gt</strong>' (est numériquement supérieur à)<br />
807 La <em>chaîne de test</em> est considérée comme un entier,
808 et est comparée numériquement à l'<em>expression de
809 comparaison</em>. Vrai si <em>chaîne de test</em> est
811 supérieure à <em>expression de comparaison</em>.</li>
813 <li>'<strong>-le</strong>' (est numériquement inférieur ou
814 égal à)<br />
815 La <em>chaîne de test</em> est considérée comme un entier,
816 et est comparée numériquement à l'<em>expression de
817 comparaison</em>. Vrai si <em>chaîne de test</em> est
819 inférieure ou égale à <em>expression de comparaison</em>.
820 Attention à la confusion avec le drapeau <strong>-l</strong>
821 en utilisant la variante the <strong>-L</strong> ou
822 <strong>-h</strong>.</li>
824 <li>'<strong>-lt</strong>' (est numériquement inférieur à)<br />
825 La <em>chaîne de test</em> est considérée comme un entier,
826 et est comparée numériquement à l'<em>expression de
827 comparaison</em>. Vrai si <em>chaîne de test</em> est
829 inférieure à <em>expression de comparaison</em>.
830 Attention à la confusion avec le drapeau <strong>-l</strong>
831 en utilisant la variante the <strong>-L</strong> ou
832 <strong>-h</strong>.</li>
837 <li>Vous pouvez effectuer différents tests sur les attributs de
841 <li>'<strong>-d</strong>' (est un répertoire -
842 <strong>d</strong>irectory)<br />
843 Traite <em>chaîne de test</em> comme un chemin et vérifie
844 s'il existe ou pas, et s'il s'agit d'un répertoire.</li>
846 <li>'<strong>-f</strong>' (est un
847 <strong>f</strong>ichier régulier)<br />
848 Traite <em>chaîne de test</em> comme un chemin et vérifie
849 s'il existe ou pas, et s'il s'agit d'un fichier régulier.</li>
851 <li>'<strong>-F</strong>' (test de l'existence d'un fichier
852 via une sous-requête)<br />
853 Vérifie si <em>chaîne de test</em> est un fichier valide,
854 accessible à travers tous les contrôles d'accès du serveur
855 actuellement configurés pour ce chemin. C'est une
856 sous-requête interne qui effectue cette vérification - à
857 utiliser avec précautions car les performances du serveur
858 peuvent s'en trouver affectées !</li>
860 <li>'<strong>-H</strong>' (est un lien symbolique, selon la
861 convention bash)<br />
862 Voir <strong>-l</strong>.</li>
864 <li>'<strong>-l</strong>' (est un lien symbolique)<br />
865 Considère la <em>chaîne de test</em> comme un chemin et
866 vérifie son existence et si elle est un lien symbolique. On
867 peut aussi utiliser la convention bash <strong>-L</strong>
868 ou <strong>-h</strong> lorsqu'il y a risque de confusion
869 avec les tests <strong>-lt</strong> ou <strong>-le</strong>.</li>
871 <li>'<strong>-L</strong>' (est un lien symbolique, selon la
872 convention bash)<br />
873 Voir <strong>-l</strong>.</li>
875 <li>'<strong>-s</strong>' (est un fichier régulier d'une
876 certaine taille)<br />
877 Considère la <em>chaîne de test</em> comme un chemin et
878 vérifie son existence et si elle est un fichier régulier
879 d'une taille supérieure à zéro.</li>
881 <li>'<strong>-U</strong>' (test de l'existence d'une
882 <strong>U</strong>RL via une sous-requête)<br />
883 Vérifie si <em>chaîne de test</em> est une URL valide,
884 accessible à travers tous les contrôles d'accès du serveur
885 actuellement configurés pour ce chemin. C'est une
886 sous-requête interne qui effectue cette vérification - à
887 utiliser avec précautions car les performances du serveur
888 peuvent s'en trouver affectées !</li>
890 <li>'<strong>-x</strong>' (a l'attribut d'exécution positionné)<br />
891 Considère la <em>chaîne de test</em> comme un chemin et
892 vérifie son existence et si elle a son attribut d'exécution
893 positionné. Ce positionnement est déterminé en fonction de
894 l'OS sous-jacent.</li>
898 <note><title>Note :</title>
899 Tous ces tests peuvent aussi être préfixés par un point
900 d'exclamation ('!') pour inverser leur signification.
905 <p>Si la <em>chaîne de test</em> contient la valeur spéciale
906 <code>expr</code>, la <em>chaîne de comparaison</em> sera
907 traitée en tant qu'expression rationnelle de type <a
908 href="../expr.html">ap_expr</a>.</p>
911 Dans l'exemple ci-dessous, on utilise <code>-strmatch</code>
912 pour comparer le <code>REFERER</code> avec le nom d'hôte du
913 site afin de bloquer le hotlinking (référencement direct)
914 non désiré.
917 <highlight language="config">
918 RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"<br />
919 RewriteRule ^/images - [F]
923 <li>Vous pouvez aussi définir certains drapeaux pour
924 l'<em>expression de comparaison</em> en ajoutant ces
925 <strong><code>[</code><em>drapeaux</em><code>]</code></strong>
926 comme troisième argument de la directive
927 <code>RewriteCond</code>, où <em>drapeaux</em> est un
928 sous-ensemble séparé par des virgules des drapeaux suivants :
931 <li>'<strong><code>nocase|NC</code></strong>'
932 (<strong>n</strong>o <strong>c</strong>ase)<br />
933 Rend le test insensible à la casse - il n'est pas fait de
934 distinction entre majuscules et minuscules, à la fois dans le
935 développement de <em>chaîne de test</em> et dans
936 <em>expression de comparaison</em>. Ce drapeau n'est pris en
937 compte que lors d'une comparaison entre <em>chaîne de test</em>
938 et <em>expression de comparaison</em>. Il ne l'est pas pour les
939 vérification par sous-requêtes ou sur le système de
943 '<strong><code>ornext|OR</code></strong>'
944 (<strong>ou</strong> condition suivante)<br />
945 Permet de chaîner les conditions de règles avec un OU au
946 lieu du AND implicite. Exemple typique :
948 <highlight language="config">
949 RewriteCond %{REMOTE_HOST} ^host1 [OR]
950 RewriteCond %{REMOTE_HOST} ^host2 [OR]
951 RewriteCond %{REMOTE_HOST} ^host3
952 RewriteRule ...règles concernant tous ces hôtes...
955 Sans ce drapeau, les paires
956 condition/règle devraient être écrites trois fois.
959 <li>'<strong><code>novary|NV</code></strong>'
960 (<strong>n</strong>o <strong>v</strong>ary)<br />
961 Si la condition contient un en-tête HTTP, ce drapeau empêche
962 ce dernier d'être ajouté à l'en-tête Vary de la réponse. <br />
963 L'utilisation de ce drapeau peut provoquer une mise en cache
964 incorrecte de la réponse, si la représentation de cette réponse
965 varie avec la valeur de l'en-tête considéré. Ce drapeau ne
966 devrait donc être utilisé que si l'on maîtrise parfaitement le
967 fonctionnement de l'en-tête Vary.
973 <p><strong>Exemple :</strong></p>
975 <p>Pour réécrire la page d'accueil d'un site en fonction de
976 l'en-tête ``<code>User-Agent:</code>'' de la requête, vous
977 pouvez utiliser ce qui suit : </p>
979 <highlight language="config">
980 RewriteCond %{HTTP_USER_AGENT} ^Mozilla
981 RewriteRule ^/$ /homepage.max.html [L]
983 RewriteCond %{HTTP_USER_AGENT} ^Lynx
984 RewriteRule ^/$ /homepage.min.html [L]
986 RewriteRule ^/$ /homepage.std.html [L]
989 <p>Explications : si vous utilisez un navigateur
990 (Netscape Navigator, Mozilla etc) qui s'identifie comme
991 'Mozilla', vous accèderez à la page d'accueil max (qui
992 peut contenir des frames, ou d'autres ressources
993 particulières).
994 Si vous utilisez le navigateur Lynx (qui est un navigateur
995 en mode texte), vous accèderez à une page d'accueil min
996 (qui peut être une version conçue pour une navigation simple
997 basée sur le texte).
998 Si aucune de ces conditions n'est satisfaite (vous utilisez tout
999 autre navigateur, ou votre navigateur s'identifie de manière non
1000 standard), vous accèderez à la page d'accueil std
1005 </directivesynopsis>
1008 <name>RewriteRule</name>
1009 <description>Définit les règles pour le moteur de réécriture</description>
1011 <em>Modèle</em> <em>Substitution</em> [<em>drapeaux</em>]</syntax>
1012 <contextlist><context>server config</context><context>virtual host</context>
1013 <context>directory</context><context>.htaccess</context></contextlist>
1014 <override>FileInfo</override>
1017 <p>La directive <directive>RewriteRule</directive> est le
1018 véritable cheval de trait de la réécriture. La directive peut
1019 apparaître plusieurs fois, chaque instance définissant une
1020 règle de réécriture particulière. L'ordre dans lequel ces règles
1021 sont définies est important - il s'agit de l'ordre dans lequel
1022 les règles seront appliquées au cours du processus de
1023 réécriture.</p>
1025 <p><a id="patterns" name="patterns"><em>Modèle</em></a> est une
1026 <a id="regexp" name="regexp">expression rationnelle</a>
1027 compatible perl. Dans la première règle de réécriture,
1028 l'expression est comparée au (%-decoded)
1029 <a href="./directive-dict.html#Syntax">chemin de l'URL</a> (ou au
1030 <a href="./directive-dict.html#Syntax">chemin fichier</a>, en
1031 fonction du contexte) de la
1032 requête. Les expressions suivantes sont comparées à la sortie de
1033 la dernière règle de réécriture qui
1036 <note><title><a id="what_is_matched" name="what_is_matched">Qu'est-ce qui est comparé ?</a></title>
1038 <p>Dans un contexte de serveur virtuel <directive
1039 module="core">VirtualHost</directive>, le <em>modèle</em> est tout
1040 d'abord comparé à la portion de l'URL située entre le nom d'hôte
1041 éventuellement accompagné du port, et la chaîne de paramètres (par
1042 exemple "/app1/index.html").</p>
1044 <p>Dans les contextes de répertoire <directive
1045 module="core">Directory</directive> et htaccess, le
1046 <em>modèle</em> est tout d'abord comparé au chemin du <em>système
1047 de fichiers</em>, après suppression du préfixe ou chemin de base
1048 ayant conduit le serveur vers la règle <directive>RewriteRule</directive> (par
1049 exemple "app1/index.html" ou
1050 "index.html" selon l'endroit où les directives sont définies).</p>
1052 <p>Si vous souhaitez faire une comparaison sur le nom
1053 d'hôte, le port, ou la chaîne de requête, utilisez une
1054 directive <directive module="mod_rewrite">RewriteCond</directive>
1055 comportant respectivement les variables
1056 <code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, ou
1057 <code>%{QUERY_STRING}</code>.</p>
1060 <note><title>Réécritures dans un contexte de répertoire</title>
1062 <li>L'utilisation du moteur de réécriture dans les
1063 fichiers <a href="../howto/htaccess.html">.htaccess</a> et les sections
1065 type="section" module="core">Directory</directive> est un peu plus
1068 <li>Pour activer le moteur de réécriture dans ces contextes, vous devez
1069 définir "<code>RewriteEngine On</code>" <strong>et</strong>
1070 "<code>Options FollowSymLinks</code>". Si l'administrateur a désactivé
1071 la possibilité de modifier l'option <code>FollowSymLinks</code> au
1072 niveau du répertoire d'un utilisateur, vous ne pouvez pas utiliser le
1073 moteur de réécriture. Cette restriction a été instaurée à des fins de
1074 sécurité.</li>
1076 <li>Lorsqu'on utilise le moteur de réécriture dans un fichier
1077 <code>.htaccess</code>, le chemin de base du répertoire courant (qui est
1078 toujours le même pour ce même répertoire) est automatiquement
1079 <em>supprimé</em> au cours de la comparaison avec le modèle de la règle
1080 de réécriture, et automatiquement <em>ajouté</em> lorsqu'une
1081 substitution relative (ne débutant pas par un slash ou un nom de
1082 protocole) arrive à la fin d'un jeu de règles. Voir la directive
1083 <directive module="mod_rewrite">RewriteBase</directive> pour plus de
1084 détails à propos de l'ajout du préfixe après les substitutions
1087 <li>Si vous souhaitez effectuer une comparaison en prenant en compte
1088 l'intégralité du
1089 chemin de l'URL dans un contexte de répertoire (htaccess), vous devez
1090 utiliser la variable <code>%{REQUEST_URI}</code> dans la directive
1091 <directive>RewriteCond</directive>.</li>
1093 <li>Le prefixe supprimé se termine toujours par un slash, ce qui
1094 signifie que la comparaison s'effectue avec une chaîne qui ne comporte
1095 <em>jamais</em> de slash de début. Ainsi, un <em>modèle</em> contenant
1096 <code>^/</code> ne correspondra jamais dans un contexte de répertoire.</li>
1098 <li>Bien que les règles de réécriture soient permises du point de vue de
1099 la syntaxe dans les sections <directive type="section"
1100 module="core">Location</directive> et <directive type="section"
1101 module="core">Files</directive>, elles n'y sont pas prises en compte, et
1102 n'y sont à priori d'aucune utilité.</li>
1106 <p>Pour quelques conseils à propos des <glossary
1107 ref="regex">expressions rationnelles</glossary>, voir le
1109 href="../rewrite/intro.html#regex">Introduction à
1110 mod_rewrite</a>.</p>
1112 <p>Dans mod_rewrite, on peut aussi utiliser le caractère NON
1113 ('<code>!</code>') comme préfixe de modèle. Ceci vous permet
1114 d'inverser la signification d'un modèle, soit pour dire
1115 ``<em>si l'URL considérée ne correspond <strong>PAS</strong> à
1116 ce modèle</em>''. Le caractère NON peut donc être utilisé à
1117 titre exceptionnel, lorsqu'il est plus simple d'effectuer une
1118 comparaison avec le modèle inversé, ou dans la dernière règle
1119 par défaut.</p>
1121 <note><title>Note</title>
1122 Si vous utilisez le caractère NON pour inverser la signification d'un
1123 modèle, vous ne pouvez pas inclure de parties génériques groupées dans
1124 le modèle. Ceci est dû au fait que, lorsque le modèle ne correspond
1125 pas (autrement dit, sa négation correspond), les groupes sont vides.
1126 Ainsi, si vous utilisez des modèles inversés, vous ne pouvez
1127 pas vous référer aux groupes par <code>$N</code> dans la chaîne de
1131 <p>Dans une règle de réécriture,
1132 <a id="rhs" name="rhs"><em>Substitution</em></a> est la chaîne
1133 de caractères qui remplace le chemin de l'URL original qui
1134 correspondait au <em>Modèle</em>. <em>Substitution</em> peut
1139 <dt>un chemin du système de fichiers</dt>
1141 <dd>Il indique alors la localisation dans le système de
1142 fichiers de la ressource qui doit être envoyée au
1143 client. Les substitutions ne sont traitées en tant que chemins du
1144 système de fichiers que si la règle est configurée dans un
1145 contexte de serveur (serveur virtuel), et si le premier
1146 composant du chemin dans la substitution existe dans le système
1149 <dt>chemin d'URL</dt>
1151 <dd>Un chemin relatif à la valeur de <directive
1152 module="core">DocumentRoot</directive> vers la ressource qui
1153 doit être servie. Notez que <module>mod_rewrite</module>
1154 essaie de deviner si vous avez spécifié un chemin du système
1155 de fichiers ou un chemin d'URL en vérifiant si la première
1156 partie du chemin existe à la racine du système de fichiers.
1157 Par exemple, si vous avez spécifié comme chaîne de
1158 <em>Substitution</em> <code>/www/file.html</code>, cette
1159 dernière sera traitée comme un chemin d'URL <em>à moins</em>
1160 qu'un répertoire nommé <code>www</code> n'existe à la racine
1161 de votre système de fichiers (ou dans le cas d'une
1162 réécriture au sein d'un fichier <code>.htaccess</code>,
1163 relativement à la racine des documents), auquel cas la chaîne de
1164 substitution sera traitée comme un chemin du système de
1165 fichiers. Si vous désirez que d'autres directives de
1166 correspondance d'URL (comme la directive <directive
1167 module="mod_alias">Alias</directive>) soient appliquées au
1168 chemin d'URL résultant, utilisez le drapeau <code>[PT]</code>
1169 comme décrit ci-dessous.</dd>
1171 <dt>URL absolue</dt>
1173 <dd>Si une URL absolue est spécifiée,
1174 <module>mod_rewrite</module> vérifie si le nom d'hôte
1175 correspond à celui de l'hôte local. Si c'est le cas, le
1176 protocole et le nom d'hôte sont supprimés, et ce qui reste est
1177 traité comme un chemin d'URL. Dans le cas contraire, une
1178 redirection externe vers l'URL indiquée est effectuée. Pour
1179 forcer une redirection externe vers l'hôte local, voir le
1180 drapeau <code>[R]</code> ci-dessous.</dd>
1182 <dt><code>-</code> (tiret)</dt>
1184 <dd>Un tiret indique qu'aucune substitution ne doit être
1185 effectuée (le chemin considéré est transmis sans changement).
1186 Ceci est utile quand un drapeau doit être appliqué sans
1187 modifier le chemin (voir ci-dessous).</dd>
1191 <p>En plus du texte, la chaîne <em>Substition</em> peut
1195 <li>des références arrières (<code>$N</code>) vers le modèle
1196 d'une directive RewriteRule</li>
1198 <li>des références arrières (<code>%N</code>) vers le dernier
1199 modèle d'une directive RewriteCond qui correspondait</li>
1201 <li>des variables du serveur comme dans les chaînes de test de
1202 condition d'une règle (<code>%{VARNAME}</code>)</li>
1205 <a href="#mapfunc">fonctions de comparaison</a>
1206 (<code>${nom correspondance:clé|défaut}</code>)</li>
1209 <p>Les références arrières sont des identificateurs de la forme
1210 <code>$</code><strong>N</strong> (<strong>N</strong>=0..9), qui
1211 seront remplacés par le contenu du <strong>N</strong>ème groupe
1212 du <em>Modèle</em> qui correspondait. Les variables du serveur
1213 sont les mêmes que dans la <em>Chaîne de test</em> d'une
1214 directive <code>RewriteCond</code>. Les fonctions de comparaison
1215 sont issues de la directive <code>RewriteMap</code> dans la
1216 section de laquelle elles sont décrites. Ces trois types de
1217 variables sont évaluées dans l'ordre ci-dessus.</p>
1219 <p>Chaque règle de réécriture s'applique au résultat de la règle
1220 précédente, selon l'ordre dans lequel elles ont été définies dans
1221 le fichier de configuration. Le chemin de l'URL ou du système de fichier (voir
1222 ci-dessus <a href="#what_is_matched">Qu'est-ce qui est
1223 comparé ?</a>) est <strong>intégralement
1224 remplacée</strong> par la chaîne de <em>Substitution</em> et le
1225 processus de réécriture se poursuit jusqu'à ce que toutes les
1226 règles aient été appliquées, ou qu'il soit explicitement stoppé
1228 href="../rewrite/flags.html#flag_l"><code><strong>L</strong></code></a>,
1229 ou par un autre drapeau qui implique un arrêt immédiat, comme
1230 <code><strong>END</strong></code> ou
1231 <code><strong>F</strong></code>.</p>
1233 <note><title>Modifier la chaîne de requête</title>
1234 <p>Par défaut, la chaîne de requête est transmise sans
1235 modification. Vous pouvez cependant créer dans la chaîne de
1236 substitution des URLs dont une partie constitue une chaîne de
1237 requête. Pour cela, ajoutez simplement un point d'interrogation
1238 dans la chaîne de substitution pour indiquer que le texte qui
1239 suit doit être réinjecté dans la chaîne de requête. Pour
1240 supprimer une chaîne de requête, terminez simplement la chaîne de
1241 substitution par un point d'interrogation. Pour combiner les
1242 nouvelles chaînes de requête avec les anciennes, utilisez le
1243 drapeau <code>[QSA]</code>.</p>
1247 <p>En outre, vous pouvez spécifier des <a name="rewriteflags"
1248 id="rewriteflags">actions</a> spéciales à effectuer en ajoutant
1250 <strong><code>[</code><em>drapeaux</em><code>]</code></strong>
1251 comme troisième argument de la directive
1252 <code>RewriteRule</code>. Séparés par des virgules au sein d'une
1253 liste encadrée par des crochets, les <em>drapeaux</em> peuvent
1254 être choisis dans la table suivante. Vous trouverez plus de
1255 détails, et des exemples pour chaque drapeau dans le <a
1256 href="../rewrite/flags.html">document à propos des drapeaux de
1257 réécriture.</a></p>
1260 <tr><th>Drapeaux et syntaxe</th>
1265 <td>Echappe les caractères non-alphanumériques <em>avant</em>
1266 d'appliquer la transformation. <em><a
1267 href="../rewrite/flags.html#flag_b">détails ...</a></em></td>
1271 <td>La règle est chaînée avec la règle suivante. Si la règle
1272 échoue, la ou les règles avec lesquelles elle est est chaînée
1273 seront sautées. <em><a
1274 href="../rewrite/flags.html#flag_c">détails ...</a></em></td>
1277 <td>cookie|CO=<em>NAME</em>:<em>VAL</em></td>
1278 <td>Définit un cookie au niveau du navigateur client. La syntaxe
1279 complète est :
1280 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>
1281 <em><a href="../rewrite/flags.html#flag_co">détails ...</a></em>
1285 <td>discardpath|DPI</td>
1286 <td>Supprime la partie PATH_INFO de l'URI réécrit. <em><a
1287 href="../rewrite/flags.html#flag_dpi">détails
1291 <td>env|E=[!]<em>VAR</em>[:<em>VAL</em>]</td>
1292 <td>Définit la variable d'environnement <em>VAR</em> (à la valeur
1293 <em>VAL</em> si elle est fournie). La variante !<em>VAR</em>
1294 annule la définition de la variable <em>VAR</em>.<em><a
1295 href="../rewrite/flags.html#flag_e">détails ...</a></em></td>
1298 <td>forbidden|F</td>
1299 <td>Renvoie une réponse 403 FORBIDDEN au navigateur client.
1300 <em><a href="../rewrite/flags.html#flag_f">détails ...</a></em></td>
1304 <td>Renvoie un message d'erreur 410 GONE au navigateur client. <em><a
1305 href="../rewrite/flags.html#flag_g">détails ...</a></em></td>
1308 <td>Handler|H=<em>Gestionnaire de contenu</em></td>
1309 <td>L'URI résultant est envoyé au <em>Gestionnaire de
1310 contenu</em> pour traitement. <em><a
1311 href="../rewrite/flags.html#flag_h">détails ...</a></em></td>
1315 <td>Arrête le processus de réécriture immédiatement et n'applique
1316 plus aucune règle. Prêtez une attention particulière aux mises
1317 en garde concernant les contextes de niveau répertoire et
1318 .htaccess (voir aussi le drapeau END). <em><a
1319 href="../rewrite/flags.html#flag_l">détails ...</a></em></td>
1323 <td>Réexécute le processus de réécriture à partir de la première
1324 règle, en utilisant le résultat du jeu de règles, sous réserve
1325 qu'il y ait un point de départ. <em><a
1326 href="../rewrite/flags.html#flag_n">détails
1331 <td>Rend la comparaison entre modèles insensible à la casse.
1332 <em><a href="../rewrite/flags.html#flag_nc">détails ...</a></em></td>
1335 <td>noescape|NE</td>
1336 <td>Empêche mod_rewrite d'effectuer un échappement hexadécimal
1337 des caractères spéciaux dans le résultat de la réécriture. <em><a
1338 href="../rewrite/flags.html#flag_ne">détails ...</a></em></td>
1341 <td>nosubreq|NS</td>
1342 <td>La règle est sautée si la requête courante est une
1343 sous-requête interne. <em><a
1344 href="../rewrite/flags.html#flag_ns">détails ...</a></em></td>
1348 <td>Force l'envoi en interne de l'URL de substitution en tant
1349 que requête mandataire. <em><a
1350 href="../rewrite/flags.html#flag_p">détails
1354 <td>passthrough|PT</td>
1355 <td>L'URI résultant est repassé au moteur de mise en
1356 correspondance des URLs pour y être traité par d'autres
1357 traducteurs URI-vers-nom de fichier, comme <code>Alias</code> ou
1358 <code>Redirect</code>. <em><a
1359 href="../rewrite/flags.html#flag_pt">détails ...</a></em></td>
1362 <td>qsappend|QSA</td>
1363 <td>Ajoute toute chaîne de paramètres présente dans l'URL de la
1364 requête originale à toute chaîne de paramètres créée dans la
1365 cible de réécriture. <em><a
1366 href="../rewrite/flags.html#flag_qsa">détails ...</a></em></td>
1369 <td>qsdiscard|QSD</td>
1370 <td>Supprime toute chaîne de paramètres de l'URI entrant. <em><a
1371 href="../rewrite/flags.html#flag_qsd">détails
1375 <td>redirect|R[=<em>code</em>]</td>
1376 <td>Force une redirection externe, avec un code de statut HTTP
1378 href="../rewrite/flags.html#flag_r">détails ...</a></em>
1383 <td>Arrête le processus de réécriture immédiatement et
1384 n'applique plus aucune règle. Empêche aussi l'exécution
1385 ultérieure de règles de réécriture dans des contextes de
1386 répertoire et des fichiers .htaccess (disponible depuis la
1387 version 2.3.9) <em><a
1388 href="../rewrite/flags.html#flag_l">détails ...</a></em></td>
1391 <td>skip|S=<em>nombre</em></td>
1392 <td>Si la règle courante s'applique, le moteur de réécriture
1393 doit sauter les <em>nombre</em> règles suivantes. <em><a
1394 href="../rewrite/flags.html#flag_s">détails ...</a></em></td>
1397 <td>type|T=<em>MIME-type</em></td>
1398 <td>Force l'attribution du <glossary>Type-MIME</glossary>
1399 spécifié au fichier cible. <em><a
1400 href="../rewrite/flags.html#flag_t">détails ...</a></em></td>
1404 <note><title>Développement du répertoire home</title>
1405 <p> Quand la chaîne de substitution commence par quelque chose comme
1406 "/~user" (de manière explicite ou par références arrières), mod_rewrite
1407 développe le répertoire home sans tenir compte de la présence ou de la
1408 configuration du module <module>mod_userdir</module>.</p>
1410 <p> Ce développement n'est pas effectué si le drapeau <em>PT</em> est
1411 utilisé dans la directive <directive module="mod_rewrite">RewriteRule</directive></p>
1414 <p>Voici toutes les combinaisons de substitution et leurs
1415 significations :</p>
1417 <p><strong>Dans la configuration au niveau du serveur principal
1418 (<code>httpd.conf</code>)<br />
1419 pour la requête ``<code>GET
1420 /chemin/infochemin</code>'':</strong><br />
1425 <th>Règle</th>
1426 <th>Résultat de la substitution</th>
1430 <td>^/un_chemin(.*) autre_chemin$1</td>
1431 <td>invalide, non supporté</td>
1435 <td>^/un_chemin(.*) autre_chemin$1 [R]</td>
1436 <td>invalide, non supporté</td>
1440 <td>^/un_chemin(.*) autre_chemin$1 [P]</td>
1441 <td>invalide, non supporté</td>
1445 <td>^/un_chemin(.*) /autre_chemin$1</td>
1446 <td>/autre_chemin/info_chemin</td>
1450 <td>^/un_chemin(.*) /autre_chemin$1 [R]</td>
1451 <td>http://cet_hote/autre_chemin/info_chemin via une redirection externe</td>
1455 <td>^/un_chemin(.*) /autre_chemin$1 [P]</td>
1456 <td>sans objet, non supporté</td>
1460 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1</td>
1461 <td>/autre_chemin/info_chemin</td>
1465 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1 [R]</td>
1466 <td>http://cet_hote/autre_chemin/info_chemin via une redirection externe</td>
1470 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1 [P]</td>
1471 <td>sans objet, non supporté</td>
1475 <td>^/un_chemin(.*) http://autre_hote/autre_chemin$1</td>
1476 <td>http://autre_hote/autre_chemin/info_chemin via une redirection externe</td>
1480 <td>^/un_chemin(.*) http://autre_hote/autre_chemin$1 [R]</td>
1481 <td>http://autre_hote/autre_chemin/info_chemin (le drapeau [R] est
1486 <td>^/somepath(.*) http://otherhost/otherpath$1 [P]</td>
1487 <td>http://otherhost/otherpath/pathinfo via internal proxy</td>
1491 <p><strong>Dans une configuration de niveau répertoire pour
1492 <code>/chemin</code><br />
1493 (<code>/chemin/physique/vers/chemin/.htacccess</code>, avec
1494 <code>RewriteBase /chemin</code>)<br />
1495 pour la requête ``<code>GET
1496 /chemin/chemin-local/infochemin</code>'':</strong><br />
1502 <th>Règle</th>
1503 <th>Résultat de la substitution</th>
1507 <td>^chemin-local(.*) autre-chemin$1</td>
1508 <td>/chemin/autre-chemin/infochemin</td>
1512 <td>^chemin-local(.*) autre-chemin$1 [R]</td>
1513 <td>http://cet-hôte/chemin/autre-chemin/infochemin via redirection
1518 <td>^chemin-local(.*) autre-chemin$1 [P]</td>
1519 <td>n'a pas lieu d'être, non supporté</td>
1523 <td>^chemin-local(.*) /autre-chemin$1</td>
1524 <td>/autre-chemin/infochemin</td>
1528 <td>^chemin-local(.*) /autre-chemin$1 [R]</td>
1529 <td>http://cet-hôte/autre-chemin/infochemin via redirection externe</td>
1533 <td>^chemin-local(.*) /autre-chemin$1 [P]</td>
1534 <td>n'a pas lieu d'être, non supporté</td>
1538 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1</td>
1539 <td>/autre-chemin/infochemin</td>
1543 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1 [R]</td>
1544 <td>http://cet-hôte/autre-chemin/infochemin via redirection externe</td>
1548 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1 [P]</td>
1549 <td>n'a pas lieu d'être, non supporté</td>
1553 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1</td>
1554 <td>http://autre hôte/autre-chemin/infochemin via redirection externe</td>
1558 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1 [R]</td>
1559 <td>http://autre hôte/autre-chemin/infochemin via redirection externe
1560 (le drapeau [R] est redondant)</td>
1564 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1 [P]</td>
1565 <td>http://autre hôte/autre-chemin/infochemin via un mandataire interne</td>
1571 </directivesynopsis>