2 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision: 1421892:1448508 (outdated) -->
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>
247 <dt><code>MergeBase</code></dt>
250 <p>Avec cette option, la valeur de la directive <directive
251 module="mod_rewrite">RewriteBase</directive> est copiée depuis le
252 répertoire où elle est explicitement définie dans tout
253 sous-répertoire qui ne définit pas sa propre directive <directive
254 module="mod_rewrite">RewriteBase</directive>. C'était le
255 comportement par défaut de la version 2.4.0 à la version 2.4.3, et
256 cette option permet de le rétablir à partir de la version 2.4.4 du
257 serveur HTTP Apache.</p>
265 <name>RewriteMap</name>
266 <description>Définit une fonction de mise en correspondance pour la
267 recherche de mots-clés</description>
268 <syntax>RewriteMap <em>nom de la correspondance</em> <em>type de
269 correspondance</em>:<em>source de la correspondance</em>
271 <contextlist><context>server config</context><context>virtual host</context>
275 <p>La directive <directive>RewriteMap</directive> définit une
276 <em>Table de correspondance pour la réécriture</em> que les
277 fonctions de mise en correspondance
278 peuvent utiliser dans les chaînes de substitution des règles
279 pour insérer/substituer des champs en recherchant des mots-clés.
280 La source utilisée pour cette recherche peut être de plusieurs
283 <p><a id="mapfunc" name="mapfunc"><em>nom de la
284 correspondance</em></a> est le nom de la table de correspondance
285 et servira à spécifier une fonction de mise en correspondance
286 pour les chaînes de substitution d'une règle de réécriture selon
287 une des constructions suivantes :</p>
290 <strong><code>${</code> <em>nom de la
291 correspondance</em> <code>:</code>
292 <em>mot-clé</em> <code>}</code><br />
293 <code>${</code> <em>nom de la
294 correspondance</em> <code>:</code>
295 <em>mot-clé</em> <code>|</code> <em>valeur par défaut</em>
296 <code>}</code></strong>
299 <p>Lorsqu'une telle construction est rencontrée, la table de
300 correspondance <em>Nom de la correspondance</em> est consultée
301 et la clé <em>mot-clé</em> recherchée. Si la clé est trouvée, la
302 construction est remplacée par
303 la <em>valeur de remplacement</em>. Si la clé n'est pas trouvée,
304 elle est remplacée par la <em>valeur par défaut</em>, ou par une
305 chaîne vide si aucune <em>valeur par défaut</em> n'est
306 spécifiée. La valeur vide se comporte comme si la
307 clé était absente ; il est donc impossible de distinguer une
308 valeur vide d'une absence de clé.</p>
310 <p>Par exemple, vous pouvez définir une directive
311 <directive>RewriteMap</directive> comme suit </p>
313 <highlight language="config">
314 RewriteMap map-exemple txt:/chemin/vers/fichier/map.txt
317 <p>Vous pourrez ensuite utiliser cette table dans une
318 directive <directive>RewriteRule</directive> comme suit :</p>
320 <highlight language="config">
321 RewriteRule ^/ex/(.*) ${map-exemple:$1}
324 <p>Les combinaisons suivantes pour <em>type de correspondance</em>
325 et <em>source de la correspondance</em>
326 peuvent être utilisées :</p>
330 <dd>Un fichier texte contenant des paires clé-valeur séparées
331 par des espaces, une paire par ligne (<a
332 href="../rewrite/rewritemap.html#txt">Détails ...</a>).</dd>
335 <dd>Sélection aléatoire d'une entrée depuis un fichier texte (<a
336 href="../rewrite/rewritemap.html#rnd">Détails ...</a>).</dd>
339 <dd>Recherche une entrée dans un fichier dbm contenant des
340 paires nom-valeur. Le condensé hash est élaboré à partir d'un
341 format de fichier texte via l'utilitaire <code><a
342 href="../programs/httxt2dbm.html">httxt2dbm</a></code> (<a
343 href="../rewrite/rewritemap.html#dbm">Détails ...</a>).</dd>
346 <dd>Une des quatre fonctions internes disponibles que fournit
347 <code>RewriteMap</code>: toupper, tolower, escape ou unescape
348 (<a href="../rewrite/rewritemap.html#int">Détails ...</a>).</dd>
351 <dd>Appelle un programme externe ou un script pour effectuer la
352 réécriture (<a href="../rewrite/rewritemap.html#int">Détails
355 <dt>dbd or fastdbd</dt>
356 <dd>Une commande SQL SELECT à exécuter pour rechercher la cible
357 de réécriture (<a href="../rewrite/rewritemap.html#int">Détails
361 <p>Vous trouverez plus de détails et de nombreux exemples dans le <a
362 href="../rewrite/rewritemap.html">RewriteMap HowTo</a>.</p>
368 <name>RewriteBase</name>
369 <description>Définit l'URL de base pour les réécritures au niveau
370 répertoire</description>
371 <syntax>RewriteBase <em>chemin URL</em></syntax>
372 <default>Pas de valeur par défaut</default>
373 <contextlist><context>directory</context><context>.htaccess</context>
375 <override>FileInfo</override>
378 <p>La directive <directive>RewriteBase</directive> permet de
379 spécifier le préfixe d'URL à utiliser dans un contexte de
380 répertoire (htaccess) pour les directives
381 <directive>RewriteRule</directive> qui réécrivent vers un chemin
383 <p>Cette directive est <em>obligatoire</em> si vous utilisez un
384 chemin relatif dans une substitution, et dans un contexte de
385 répertoire (htaccess), sauf si au moins une de ces conditions est
386 vérifiée :</p>
388 <li>La requête initiale, ainsi que la substitution, sont dans
389 la <directive module="core">DocumentRoot</directive> (c'est à
390 dire que pour y accéder, il n'est pas nécessaire d'utiliser
391 une directive telle qu'<directive
392 module="mod_alias">Alias</directive>).</li>
393 <li>Le chemin du système de fichiers vers le répertoire
394 contenant la <directive>RewriteRule</directive>, suffixé par
395 la substitution relative est aussi valide en tant qu'URL sur
396 le serveur (ce qui est rare).</li>
399 <p>Dans l'exemple ci-dessous, la directive
400 <directive>RewriteBase</directive> est nécessaire afin d'éviter une
401 réécriture en http://example.com/opt/myapp-1.2.3/welcome.html car la
402 ressource n'était pas relative à la racine des documents. Cette erreur
403 de configuration aurait conduit le serveur à rechercher un répertoire
404 "opt" à la racine des documents.</p>
406 <highlight language="config">
407 DocumentRoot /var/www/example.com
408 Alias /myapp /opt/myapp-1.2.3
409 <Directory /opt/myapp-1.2.3>
412 RewriteRule ^index\.html$ welcome.html
420 <name>RewriteCond</name>
421 <description>Définit une condition qui devra être satisfaite pour que
422 la réécriture soit effectuée
425 <em>chaîne de test</em> <em>expression de comparaison</em></syntax>
426 <contextlist><context>server config</context><context>virtual host</context>
427 <context>directory</context><context>.htaccess</context></contextlist>
428 <override>FileInfo</override>
431 <p>La directive <directive>RewriteCond</directive> permet de définir une
432 condition d'exécution d'une règle. Une ou plusieurs conditions
433 <directive>RewriteCond</directive> peuvent précéder une
434 directive <directive module="mod_rewrite"
435 >RewriteRule</directive>. La règle de réécriture correspondante n'est
436 ainsi exécutée que si ces conditions sont satisfaites,
437 <strong>et</strong> si l'URI correspond au modèle spécifié dans la
440 <p><em>TestString</em> est une chaîne qui peut contenir les
441 extensions suivantes en plus du texte simple :</p>
445 <strong>références arrières de règle de réécriture</strong> :
446 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>Références arrières de condition de réécriture
455 </strong> : ce sont des références arrières de la forme
456 <strong><code>%N</code></strong> (0 <= N <= 9). %1 à %9
457 permettent d'accéder aux parties regroupées (entre
458 parenthèses) du modèle, issues de la <code>RewriteRule</code>
459 concernée par le jeu de conditions <code>RewriteCond</code>
460 courant. %0 donne accès à l'ensemble de la chaîne
461 correspondant au modèle.</li>
463 <strong>extensions de table de réécriture</strong> :
464 ce sont des extensions de la forme <strong><code
465 >${nomTable:clé|défaut}</code></strong>. Voir la <a
466 >href="#mapfunc">documentation sur RewriteMap</a>
467 pour plus de détails.
470 <strong>Variables du serveur</strong> :
471 ce sont des variables de la forme
472 <strong><code>%{</code> <em>NAME_OF_VARIABLE</em> <code>}</code></strong>,
473 où <em>NOM_DE_VARIABLE</em> peut contenir une chaîne issue
474 de la liste suivante :
477 <columnspec><column width=".3"/><column width=".3"/>
478 <column width=".3"/></columnspec>
480 <th>En-têtes HTTP :</th> <th>connexion & requête:</th> <th></th>
485 HTTP_USER_AGENT<br />
490 HTTP_PROXY_CONNECTION<br />
501 SCRIPT_FILENAME<br />
511 <th>variables internes au serveur :</th> <th>date et heure :</th> <th>spéciaux :</th>
521 SERVER_PROTOCOL<br />
522 SERVER_SOFTWARE<br />
540 REQUEST_FILENAME<br />
548 <p>Ces variables correspondent toutes aux en-têtes MIME
549 HTTP de mêmes noms, au variables C du serveur HTTP Apache, ou
550 aux champs <code>struct tm</code> du système Unix. La
551 plupart d'entre elles sont documentées ailleurs dans le
552 manuel ou dans la spécification CGI.</p>
554 <p>SERVER_NAME et SERVER_PORT dépendent respectivement
555 des valeurs des directives <directive
556 module="core">UseCanonicalName</directive> et <directive
557 module="core">UseCanonicalPhysicalPort</directive>.</p>
559 <p>Parmi les variables
560 spécifiques à mod_rewrite, ou trouve les suivantes :</p>
563 <dt><code>IS_SUBREQ</code></dt>
565 <dd>Contient le texte "true" si la requête en cours
566 de traitement est une sous-requête, "false" dans le
567 cas contraire. Une sous-requête est générée quand un
568 module a besoin de se référer à des fichiers ou URIs
569 addidionnels pour pouvoir mener à bien sa tâche.</dd>
571 <dt><code>API_VERSION</code></dt>
573 <dd>C'est la version de l'API des modules Apache httpd
574 (l'interface interne entre le serveur et les modules)
575 pour la construction courante de httpd, telle qu'elle
576 est définie dans include/ap_mmn.h. La version de l'API
577 des modules correspond à la version du serveur Apache
579 utilisé (par exemple, pour la version 1.3.14 d'Apache
581 il s'agit de la version 19990320:10), mais intéresse
582 principalement les auteurs de modules.</dd>
584 <dt><code>THE_REQUEST</code></dt>
586 <dd>La ligne de requête HTTP complète envoyée par le
587 navigateur au serveur (par exemple, "<code>GET
588 /index.html HTTP/1.1</code>"), à l'exclusion de tout
589 en-tête ajouté par le navigateur. Cette
590 valeur n'a pas été déséchappée (décodée), à la
591 différence de la plupart des variables suivantes.</dd>
593 <dt><code>REQUEST_URI</code></dt>
595 <dd>La partie chemin de l'URI de la requête, comme
596 "/index.html". En particulier, ceci exclut la chaîne
597 de paramètres qui est quant à elle disponible via sa
598 propre variable <code>QUERY_STRING</code>.</dd>
600 <dt><code>REQUEST_FILENAME</code></dt>
602 <dd>Le chemin complet local au système de fichiers
603 du fichier ou du script correspondant
604 à la requête, s'il a déjà été déterminé par le serveur
605 au moment où on y fait référence. Dans le cas
606 contraire, et en particulier dans le cas d'un serveur
607 virtuel, <code>REQUEST_FILENAME</code> contient la
608 valeur de <code>REQUEST_URI</code>.</dd>
610 <dt><code>HTTPS</code></dt>
612 <dd>Contient le texte "on" si la connexion
613 utilise SSL/TLS, "off" dans le cas contraire
614 (Cette variable peut être utilisée sans problème, que
615 <module>mod_ssl</module> soit chargé ou non.</dd>
617 <dt><code>REQUEST_SCHEME</code></dt>
619 <dd>Contient le protocole de la requête (en général
620 "http" ou "https"). La valeur peut être modifiée par
621 la directive <directive
622 module="core">ServerName</directive>.</dd>
629 <p>Si la <em>chaîne de test</em> contient la valeur spéciale
630 <code>expr</code>, <em>expression de comparaison</em> sera traité
631 en tant qu'expression rationnelle de type <a
632 href="../expr.html">ap_expr</a>. Si des en-têtes HTTP sont
633 référencés dans l'expression rationnelle, et si le drapeau
634 <code>novary</code> n'est pas activé, ils seront ajoutés à
635 l'en-tête Vary.</p>
637 <p>Autres points à connaître ::</p>
640 <p>Les variables <code>SCRIPT_FILENAME</code> et
641 <code>REQUEST_FILENAME</code> contiennent toutes deux la valeur
642 du champ <code>filename</code> de la
643 structure interne <code>request_rec</code>du serveur HTTP Apache.
644 Le premier nom correspond au nom de variable bien connu CGI,
645 alors que le second est l'équivalent de REQUEST_URI (qui
646 contient la valeur du champ <code>uri</code> de
647 <code>request_rec</code>).</p>
648 <p>Si une substitution intervient et si la réécriture se
649 poursuit, la valeur des deux variables sera mise à jour en
650 conséquence.</p>
651 <p>Dans le contexte du serveur principal (c'est à dire avant que
652 la requête ne soit mise en correspondance avec le système de
653 fichiers), SCRIPT_FILENAME et REQUEST_FILENAME ne peuvent pas
654 contenir le chemin entier dans le système de fichiers local car
655 ce chemin b'est pas connu à ce stade du traitement. Dans ce cas,
656 les deux variables contiendront la valeur de REQUEST_URI. Pour
657 obtenir le chemin complet de la requête dans le système de
658 fichiers local dans le contexte du serveur principal, utilisez une
659 référence avant à base d'URL
660 <code>%{LA-U:REQUEST_FILENAME}</code> pour déterminer la valeur
661 finale de REQUEST_FILENAME.</p></li>
665 <code>%{ENV:<em>variable</em>}</code>, où <em>variable</em> peut
666 correspondre à une variable d'environnement quelconque.</li>
668 <code>%{ENV:variable}</code> est aussi disponible, où
669 <em>variable</em> peut correspondre à toute variable
670 d'environnement. Peut être consulté via des structures internes
671 d'Apache httpd et (si on ne les trouve pas ici) via la fonction
672 <code>getenv()</code> à partir du processus du serveur Apache
675 <li>Que <module>mod_ssl</module> soit chargé ou non, on peut
676 utiliser <code>%{SSL:variable}</code>, où <em>variable</em>
677 peut être remplacé par le nom d'une
678 <a href="mod_ssl.html#envvars">variable
679 d'environnement SSL</a> . Si <module>mod_ssl</module> n'est pas
680 chargé, cette variable contiendra toujours une chaîne vide.
681 Exemple : <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> pourra
682 contenir la valeur <code>128</code>.</li>
685 On peut utiliser <code>%{HTTP:en-tête}</code>, où
686 <em>en-tête</em> peut correspondre à tout nom d'en-tête MIME
687 HTTP, pour extraire la valeur d'un en-tête envoyé dans la
688 requête HTTP. Par exemple, <code>%{HTTP:Proxy-Connection}</code>
689 contiendra la valeur de l'en-tête HTTP
690 "<code>Proxy-Connection:</code>".
691 Si on utilise un en-tête HTTP
692 dans une condition, et si cette condition est évaluée à
693 <code>vrai</code> pour la requête, cet en-tête sera ajouté à l'en-tête Vary de
694 la réponse. Il ne le sera pas si la condition est évaluée à
695 <code>faux</code>. L'ajout de l'en-tête HTTP à l'en-tête Vary
696 est nécessaire à une mise en cache appropriée.
697 <p>Il faut garder à l'esprit que les conditions suivent une
698 logique de cout-circuit si le drapeau
699 '<strong><code>ornext|OR</code></strong>' est utilisé, et que de
700 ce fait, certaines d'entre elles ne seront pas évaluées.</p>
703 <li>A des fins de référence avant, on peut utiliser,
704 <code>%{LA-U:variable}</code>, qui
705 permet d'effectuer une sous-requête interne à base d'URL, afin
706 de déterminer la valeur finale de <em>variable</em>. Ceci permet
707 d'accéder à la valeur d'une variable pour la réécriture inconnue
708 à ce stade du traitement, mais qui sera définie au
709 cours d'une phase ultérieure.
710 <p>Par exemple, pour effectuer une réécriture dépendant de la
711 variable <code>REMOTE_USER</code> dans le contexte du serveur
712 principal (fichier <code>httpd.conf</code>), vous devez utiliser
713 <code>%{LA-U:REMOTE_USER}</code> - cette variable est définie
714 par la phase d'autorisation qui intervient <em>après</em> la
715 phase de traduction d'URL (pendant laquelle mod_rewrite opère).</p>
716 <p>Par contre, comme mod_rewrite implémente son contexte de
717 répertoire (fichier <code>.htaccess</code>) via la phase Fixup
718 de l'API, et comme la phase d'autorisation intervient
719 <em>avant</em> cette dernière, vous pouvez vous contenter
720 d'utiliser <code>%{REMOTE_USER}</code> dans ce contexte.</p></li>
723 <code>%{LA-F:variable}</code> peut être utilisée pour effectuer
724 une sous-requête interne (basée sur le nom de fichier), afin de
725 déterminer la valeur finale de <em>variable</em>. La plupart du
726 temps, elle est identique à LA-U (voir ci-dessus).</li>
730 <p><em>expression de comparaison</em> est une expression
731 rationnelle qui est appliquée à l'instance actuelle de
732 <em>chaîne de test</em>. <em>chaîne de test</em> est d'abord
733 évaluée, puis comparée à
734 l'<em>expression de comparaison</em>.</p>
736 <p><em>expression de comparaison</em> est en général une
737 <em>expression rationnelle compatible perl</em>, mais vous
738 disposez des syntaxes supplémentaires suivantes pour effectuer
739 d'autres tests utiles sur <em>chaîne de test</em> :
743 <li>Vous pouvez préfixer l'expression avec un caractère
744 '<code>!</code>' (point d'exclamation) pour indiquer une
745 expression de <strong>non</strong>-correspondance.</li>
747 <li>Vous pouvez effectuer des comparaisons lexicographiques de
751 <li>'<strong><expression</strong>' (inférieur au sens
752 lexicographique)<br />
753 Traite l'<em>expression</em> comme une chaîne de
754 caractères et la compare lexicographiquement à
755 <em>chaîne de test</em>. La condition est satisfaite si
756 <em>chaîne de test</em> est inférieure au sens
757 lexicographique à l'<em>expression</em>.</li>
759 <li>'<strong>>expression</strong>' (supérieur au sens
760 lexicographique)<br />
761 Traite l'<em>expression</em> comme une chaîne de
762 caractères et la compare lexicographiquement à
763 <em>chaîne de test</em>. La condition est satisfaite si
764 <em>chaîne de test</em> est supérieure au sens
765 lexicographique à l'<em>expression</em>.</li>
767 <li>'<strong>=expression</strong>' (égal au sens
768 lexicographique)<br />
769 Traite l'<em>expression</em> comme une chaîne de
770 caractères et la compare lexicographiquement à
771 <em>chaîne de test</em>. La condition est satisfaite si
772 <em>chaîne de test</em> est égale au sens
773 lexicographique à l'<em>expression</em> (les deux chaînes
774 sont exactement identiques, caractère pour caractère). Si
775 <em>expression</em> est <code>""</code> (deux guillemets),
776 <em>chaîne de test</em> est comparée à la chaîne vide.</li>
778 <li>'<strong><=expression de comparaison</strong>' (inférieur ou égal à
779 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 précède 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>
787 <li>'<strong>>=expression de comparaison</strong>'
788 (supérieur ou égal à au sens lexicographique)<br />
789 Considère l'<em>expression de comparaison</em> comme une
790 chaîne de caractères et la compare au sens lexicographique à
791 la <em>chaîne de test</em>. Vrai si <em>chaîne de test</em>
792 suit lexicographiquement <em>expression de comparaison</em>, ou est
793 égale à <em>expression de comparaison</em> (les deux chaînes
794 sont identiques, caractère pour caractère).</li>
798 Vous pouvez effectuer des comparaisons d'entiers :
801 <li>'<strong>-eq</strong>' (est numériquement égal à)<br />
802 La <em>chaîne de test</em> est considérée comme un entier,
803 et est comparée numériquement à l'<em>expression de
804 comparaison</em>. Vrai si les deux expressions sont
805 numériquement égales.</li>
807 <li>'<strong>-ge</strong>' (est numériquement supérieur ou
808 égal à)<br />
809 La <em>chaîne de test</em> est considérée comme un entier,
810 et est comparée numériquement à l'<em>expression de
811 comparaison</em>. Vrai si <em>chaîne de test</em> est
813 supérieure ou égale à <em>expression de comparaison</em>.</li>
815 <li>'<strong>-gt</strong>' (est numériquement supérieur à)<br />
816 La <em>chaîne de test</em> est considérée comme un entier,
817 et est comparée numériquement à l'<em>expression de
818 comparaison</em>. Vrai si <em>chaîne de test</em> est
820 supérieure à <em>expression de comparaison</em>.</li>
822 <li>'<strong>-le</strong>' (est numériquement inférieur ou
823 égal à)<br />
824 La <em>chaîne de test</em> est considérée comme un entier,
825 et est comparée numériquement à l'<em>expression de
826 comparaison</em>. Vrai si <em>chaîne de test</em> est
828 inférieure ou égale à <em>expression de comparaison</em>.
829 Attention à la confusion avec le drapeau <strong>-l</strong>
830 en utilisant la variante the <strong>-L</strong> ou
831 <strong>-h</strong>.</li>
833 <li>'<strong>-lt</strong>' (est numériquement inférieur à)<br />
834 La <em>chaîne de test</em> est considérée comme un entier,
835 et est comparée numériquement à l'<em>expression de
836 comparaison</em>. Vrai si <em>chaîne de test</em> est
838 inférieure à <em>expression de comparaison</em>.
839 Attention à la confusion avec le drapeau <strong>-l</strong>
840 en utilisant la variante the <strong>-L</strong> ou
841 <strong>-h</strong>.</li>
846 <li>Vous pouvez effectuer différents tests sur les attributs de
850 <li>'<strong>-d</strong>' (est un répertoire -
851 <strong>d</strong>irectory)<br />
852 Traite <em>chaîne de test</em> comme un chemin et vérifie
853 s'il existe ou pas, et s'il s'agit d'un répertoire.</li>
855 <li>'<strong>-f</strong>' (est un
856 <strong>f</strong>ichier régulier)<br />
857 Traite <em>chaîne de test</em> comme un chemin et vérifie
858 s'il existe ou pas, et s'il s'agit d'un fichier régulier.</li>
860 <li>'<strong>-F</strong>' (test de l'existence d'un fichier
861 via une sous-requête)<br />
862 Vérifie si <em>chaîne de test</em> est un fichier valide,
863 accessible à travers tous les contrôles d'accès du serveur
864 actuellement configurés pour ce chemin. C'est une
865 sous-requête interne qui effectue cette vérification - à
866 utiliser avec précautions car les performances du serveur
867 peuvent s'en trouver affectées !</li>
869 <li>'<strong>-H</strong>' (est un lien symbolique, selon la
870 convention bash)<br />
871 Voir <strong>-l</strong>.</li>
873 <li>'<strong>-l</strong>' (est un lien symbolique)<br />
874 Considère la <em>chaîne de test</em> comme un chemin et
875 vérifie son existence et si elle est un lien symbolique. On
876 peut aussi utiliser la convention bash <strong>-L</strong>
877 ou <strong>-h</strong> lorsqu'il y a risque de confusion
878 avec les tests <strong>-lt</strong> ou <strong>-le</strong>.</li>
880 <li>'<strong>-L</strong>' (est un lien symbolique, selon la
881 convention bash)<br />
882 Voir <strong>-l</strong>.</li>
884 <li>'<strong>-s</strong>' (est un fichier régulier d'une
885 certaine taille)<br />
886 Considère la <em>chaîne de test</em> comme un chemin et
887 vérifie son existence et si elle est un fichier régulier
888 d'une taille supérieure à zéro.</li>
890 <li>'<strong>-U</strong>' (test de l'existence d'une
891 <strong>U</strong>RL via une sous-requête)<br />
892 Vérifie si <em>chaîne de test</em> est une URL valide,
893 accessible à travers tous les contrôles d'accès du serveur
894 actuellement configurés pour ce chemin. C'est une
895 sous-requête interne qui effectue cette vérification - à
896 utiliser avec précautions car les performances du serveur
897 peuvent s'en trouver affectées !</li>
899 <li>'<strong>-x</strong>' (a l'attribut d'exécution positionné)<br />
900 Considère la <em>chaîne de test</em> comme un chemin et
901 vérifie son existence et si elle a son attribut d'exécution
902 positionné. Ce positionnement est déterminé en fonction de
903 l'OS sous-jacent.</li>
907 <note><title>Note :</title>
908 Tous ces tests peuvent aussi être préfixés par un point
909 d'exclamation ('!') pour inverser leur signification.
914 <p>Si la <em>chaîne de test</em> contient la valeur spéciale
915 <code>expr</code>, la <em>chaîne de comparaison</em> sera
916 traitée en tant qu'expression rationnelle de type <a
917 href="../expr.html">ap_expr</a>.</p>
920 Dans l'exemple ci-dessous, on utilise <code>-strmatch</code>
921 pour comparer le <code>REFERER</code> avec le nom d'hôte du
922 site afin de bloquer le hotlinking (référencement direct)
923 non désiré.
926 <highlight language="config">
927 RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"<br />
928 RewriteRule ^/images - [F]
932 <li>Vous pouvez aussi définir certains drapeaux pour
933 l'<em>expression de comparaison</em> en ajoutant ces
934 <strong><code>[</code><em>drapeaux</em><code>]</code></strong>
935 comme troisième argument de la directive
936 <code>RewriteCond</code>, où <em>drapeaux</em> est un
937 sous-ensemble séparé par des virgules des drapeaux suivants :
940 <li>'<strong><code>nocase|NC</code></strong>'
941 (<strong>n</strong>o <strong>c</strong>ase)<br />
942 Rend le test insensible à la casse - il n'est pas fait de
943 distinction entre majuscules et minuscules, à la fois dans le
944 développement de <em>chaîne de test</em> et dans
945 <em>expression de comparaison</em>. Ce drapeau n'est pris en
946 compte que lors d'une comparaison entre <em>chaîne de test</em>
947 et <em>expression de comparaison</em>. Il ne l'est pas pour les
948 vérification par sous-requêtes ou sur le système de
952 '<strong><code>ornext|OR</code></strong>'
953 (<strong>ou</strong> condition suivante)<br />
954 Permet de chaîner les conditions de règles avec un OU au
955 lieu du AND implicite. Exemple typique :
957 <highlight language="config">
958 RewriteCond %{REMOTE_HOST} ^host1 [OR]
959 RewriteCond %{REMOTE_HOST} ^host2 [OR]
960 RewriteCond %{REMOTE_HOST} ^host3
961 RewriteRule ...règles concernant tous ces hôtes...
964 Sans ce drapeau, les paires
965 condition/règle devraient être écrites trois fois.
968 <li>'<strong><code>novary|NV</code></strong>'
969 (<strong>n</strong>o <strong>v</strong>ary)<br />
970 Si la condition contient un en-tête HTTP, ce drapeau empêche
971 ce dernier d'être ajouté à l'en-tête Vary de la réponse. <br />
972 L'utilisation de ce drapeau peut provoquer une mise en cache
973 incorrecte de la réponse, si la représentation de cette réponse
974 varie avec la valeur de l'en-tête considéré. Ce drapeau ne
975 devrait donc être utilisé que si l'on maîtrise parfaitement le
976 fonctionnement de l'en-tête Vary.
982 <p><strong>Exemple :</strong></p>
984 <p>Pour réécrire la page d'accueil d'un site en fonction de
985 l'en-tête ``<code>User-Agent:</code>'' de la requête, vous
986 pouvez utiliser ce qui suit : </p>
988 <highlight language="config">
989 RewriteCond %{HTTP_USER_AGENT} ^Mozilla
990 RewriteRule ^/$ /homepage.max.html [L]
992 RewriteCond %{HTTP_USER_AGENT} ^Lynx
993 RewriteRule ^/$ /homepage.min.html [L]
995 RewriteRule ^/$ /homepage.std.html [L]
998 <p>Explications : si vous utilisez un navigateur
999 (Netscape Navigator, Mozilla etc) qui s'identifie comme
1000 'Mozilla', vous accèderez à la page d'accueil max (qui
1001 peut contenir des frames, ou d'autres ressources
1002 particulières).
1003 Si vous utilisez le navigateur Lynx (qui est un navigateur
1004 en mode texte), vous accèderez à une page d'accueil min
1005 (qui peut être une version conçue pour une navigation simple
1006 basée sur le texte).
1007 Si aucune de ces conditions n'est satisfaite (vous utilisez tout
1008 autre navigateur, ou votre navigateur s'identifie de manière non
1009 standard), vous accèderez à la page d'accueil std
1014 </directivesynopsis>
1017 <name>RewriteRule</name>
1018 <description>Définit les règles pour le moteur de réécriture</description>
1020 <em>Modèle</em> <em>Substitution</em> [<em>drapeaux</em>]</syntax>
1021 <contextlist><context>server config</context><context>virtual host</context>
1022 <context>directory</context><context>.htaccess</context></contextlist>
1023 <override>FileInfo</override>
1026 <p>La directive <directive>RewriteRule</directive> est le
1027 véritable cheval de trait de la réécriture. La directive peut
1028 apparaître plusieurs fois, chaque instance définissant une
1029 règle de réécriture particulière. L'ordre dans lequel ces règles
1030 sont définies est important - il s'agit de l'ordre dans lequel
1031 les règles seront appliquées au cours du processus de
1032 réécriture.</p>
1034 <p><a id="patterns" name="patterns"><em>Modèle</em></a> est une
1035 <a id="regexp" name="regexp">expression rationnelle</a>
1036 compatible perl. Dans la première règle de réécriture,
1037 l'expression est comparée au (%-decoded)
1038 <a href="./directive-dict.html#Syntax">chemin de l'URL</a> (ou au
1039 <a href="./directive-dict.html#Syntax">chemin fichier</a>, en
1040 fonction du contexte) de la
1041 requête. Les expressions suivantes sont comparées à la sortie de
1042 la dernière règle de réécriture qui
1045 <note><title><a id="what_is_matched" name="what_is_matched">Qu'est-ce qui est comparé ?</a></title>
1047 <p>Dans un contexte de serveur virtuel <directive
1048 module="core">VirtualHost</directive>, le <em>modèle</em> est tout
1049 d'abord comparé à la portion de l'URL située entre le nom d'hôte
1050 éventuellement accompagné du port, et la chaîne de paramètres (par
1051 exemple "/app1/index.html").</p>
1053 <p>Dans les contextes de répertoire <directive
1054 module="core">Directory</directive> et htaccess, le
1055 <em>modèle</em> est tout d'abord comparé au chemin du <em>système
1056 de fichiers</em>, après suppression du préfixe ou chemin de base
1057 ayant conduit le serveur vers la règle <directive>RewriteRule</directive> (par
1058 exemple "app1/index.html" ou
1059 "index.html" selon l'endroit où les directives sont définies).</p>
1061 <p>Si vous souhaitez faire une comparaison sur le nom
1062 d'hôte, le port, ou la chaîne de requête, utilisez une
1063 directive <directive module="mod_rewrite">RewriteCond</directive>
1064 comportant respectivement les variables
1065 <code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, ou
1066 <code>%{QUERY_STRING}</code>.</p>
1069 <note><title>Réécritures dans un contexte de répertoire</title>
1071 <li>L'utilisation du moteur de réécriture dans les
1072 fichiers <a href="../howto/htaccess.html">.htaccess</a> et les sections
1074 type="section" module="core">Directory</directive> est un peu plus
1077 <li>Pour activer le moteur de réécriture dans ces contextes, vous devez
1078 définir "<code>RewriteEngine On</code>" <strong>et</strong>
1079 "<code>Options FollowSymLinks</code>". Si l'administrateur a désactivé
1080 la possibilité de modifier l'option <code>FollowSymLinks</code> au
1081 niveau du répertoire d'un utilisateur, vous ne pouvez pas utiliser le
1082 moteur de réécriture. Cette restriction a été instaurée à des fins de
1083 sécurité.</li>
1085 <li>Lorsqu'on utilise le moteur de réécriture dans un fichier
1086 <code>.htaccess</code>, le chemin de base du répertoire courant (qui est
1087 toujours le même pour ce même répertoire) est automatiquement
1088 <em>supprimé</em> au cours de la comparaison avec le modèle de la règle
1089 de réécriture, et automatiquement <em>ajouté</em> lorsqu'une
1090 substitution relative (ne débutant pas par un slash ou un nom de
1091 protocole) arrive à la fin d'un jeu de règles. Voir la directive
1092 <directive module="mod_rewrite">RewriteBase</directive> pour plus de
1093 détails à propos de l'ajout du préfixe après les substitutions
1096 <li>Si vous souhaitez effectuer une comparaison en prenant en compte
1097 l'intégralité du
1098 chemin de l'URL dans un contexte de répertoire (htaccess), vous devez
1099 utiliser la variable <code>%{REQUEST_URI}</code> dans la directive
1100 <directive>RewriteCond</directive>.</li>
1102 <li>Le prefixe supprimé se termine toujours par un slash, ce qui
1103 signifie que la comparaison s'effectue avec une chaîne qui ne comporte
1104 <em>jamais</em> de slash de début. Ainsi, un <em>modèle</em> contenant
1105 <code>^/</code> ne correspondra jamais dans un contexte de répertoire.</li>
1107 <li>Bien que les règles de réécriture soient permises du point de vue de
1108 la syntaxe dans les sections <directive type="section"
1109 module="core">Location</directive> et <directive type="section"
1110 module="core">Files</directive>, elles n'y sont pas prises en compte, et
1111 n'y sont à priori d'aucune utilité.</li>
1115 <p>Pour quelques conseils à propos des <glossary
1116 ref="regex">expressions rationnelles</glossary>, voir le
1118 href="../rewrite/intro.html#regex">Introduction à
1119 mod_rewrite</a>.</p>
1121 <p>Dans mod_rewrite, on peut aussi utiliser le caractère NON
1122 ('<code>!</code>') comme préfixe de modèle. Ceci vous permet
1123 d'inverser la signification d'un modèle, soit pour dire
1124 ``<em>si l'URL considérée ne correspond <strong>PAS</strong> à
1125 ce modèle</em>''. Le caractère NON peut donc être utilisé à
1126 titre exceptionnel, lorsqu'il est plus simple d'effectuer une
1127 comparaison avec le modèle inversé, ou dans la dernière règle
1128 par défaut.</p>
1130 <note><title>Note</title>
1131 Si vous utilisez le caractère NON pour inverser la signification d'un
1132 modèle, vous ne pouvez pas inclure de parties génériques groupées dans
1133 le modèle. Ceci est dû au fait que, lorsque le modèle ne correspond
1134 pas (autrement dit, sa négation correspond), les groupes sont vides.
1135 Ainsi, si vous utilisez des modèles inversés, vous ne pouvez
1136 pas vous référer aux groupes par <code>$N</code> dans la chaîne de
1140 <p>Dans une règle de réécriture,
1141 <a id="rhs" name="rhs"><em>Substitution</em></a> est la chaîne
1142 de caractères qui remplace le chemin de l'URL original qui
1143 correspondait au <em>Modèle</em>. <em>Substitution</em> peut
1148 <dt>un chemin du système de fichiers</dt>
1150 <dd>Il indique alors la localisation dans le système de
1151 fichiers de la ressource qui doit être envoyée au
1152 client. Les substitutions ne sont traitées en tant que chemins du
1153 système de fichiers que si la règle est configurée dans un
1154 contexte de serveur (serveur virtuel), et si le premier
1155 composant du chemin dans la substitution existe dans le système
1158 <dt>chemin d'URL</dt>
1160 <dd>Un chemin relatif à la valeur de <directive
1161 module="core">DocumentRoot</directive> vers la ressource qui
1162 doit être servie. Notez que <module>mod_rewrite</module>
1163 essaie de deviner si vous avez spécifié un chemin du système
1164 de fichiers ou un chemin d'URL en vérifiant si la première
1165 partie du chemin existe à la racine du système de fichiers.
1166 Par exemple, si vous avez spécifié comme chaîne de
1167 <em>Substitution</em> <code>/www/file.html</code>, cette
1168 dernière sera traitée comme un chemin d'URL <em>à moins</em>
1169 qu'un répertoire nommé <code>www</code> n'existe à la racine
1170 de votre système de fichiers (ou dans le cas d'une
1171 réécriture au sein d'un fichier <code>.htaccess</code>,
1172 relativement à la racine des documents), auquel cas la chaîne de
1173 substitution sera traitée comme un chemin du système de
1174 fichiers. Si vous désirez que d'autres directives de
1175 correspondance d'URL (comme la directive <directive
1176 module="mod_alias">Alias</directive>) soient appliquées au
1177 chemin d'URL résultant, utilisez le drapeau <code>[PT]</code>
1178 comme décrit ci-dessous.</dd>
1180 <dt>URL absolue</dt>
1182 <dd>Si une URL absolue est spécifiée,
1183 <module>mod_rewrite</module> vérifie si le nom d'hôte
1184 correspond à celui de l'hôte local. Si c'est le cas, le
1185 protocole et le nom d'hôte sont supprimés, et ce qui reste est
1186 traité comme un chemin d'URL. Dans le cas contraire, une
1187 redirection externe vers l'URL indiquée est effectuée. Pour
1188 forcer une redirection externe vers l'hôte local, voir le
1189 drapeau <code>[R]</code> ci-dessous.</dd>
1191 <dt><code>-</code> (tiret)</dt>
1193 <dd>Un tiret indique qu'aucune substitution ne doit être
1194 effectuée (le chemin considéré est transmis sans changement).
1195 Ceci est utile quand un drapeau doit être appliqué sans
1196 modifier le chemin (voir ci-dessous).</dd>
1200 <p>En plus du texte, la chaîne <em>Substition</em> peut
1204 <li>des références arrières (<code>$N</code>) vers le modèle
1205 d'une directive RewriteRule</li>
1207 <li>des références arrières (<code>%N</code>) vers le dernier
1208 modèle d'une directive RewriteCond qui correspondait</li>
1210 <li>des variables du serveur comme dans les chaînes de test de
1211 condition d'une règle (<code>%{VARNAME}</code>)</li>
1214 <a href="#mapfunc">fonctions de comparaison</a>
1215 (<code>${nom correspondance:clé|défaut}</code>)</li>
1218 <p>Les références arrières sont des identificateurs de la forme
1219 <code>$</code><strong>N</strong> (<strong>N</strong>=0..9), qui
1220 seront remplacés par le contenu du <strong>N</strong>ème groupe
1221 du <em>Modèle</em> qui correspondait. Les variables du serveur
1222 sont les mêmes que dans la <em>Chaîne de test</em> d'une
1223 directive <code>RewriteCond</code>. Les fonctions de comparaison
1224 sont issues de la directive <code>RewriteMap</code> dans la
1225 section de laquelle elles sont décrites. Ces trois types de
1226 variables sont évaluées dans l'ordre ci-dessus.</p>
1228 <p>Chaque règle de réécriture s'applique au résultat de la règle
1229 précédente, selon l'ordre dans lequel elles ont été définies dans
1230 le fichier de configuration. Le chemin de l'URL ou du système de fichier (voir
1231 ci-dessus <a href="#what_is_matched">Qu'est-ce qui est
1232 comparé ?</a>) est <strong>intégralement
1233 remplacée</strong> par la chaîne de <em>Substitution</em> et le
1234 processus de réécriture se poursuit jusqu'à ce que toutes les
1235 règles aient été appliquées, ou qu'il soit explicitement stoppé
1237 href="../rewrite/flags.html#flag_l"><code><strong>L</strong></code></a>,
1238 ou par un autre drapeau qui implique un arrêt immédiat, comme
1239 <code><strong>END</strong></code> ou
1240 <code><strong>F</strong></code>.</p>
1242 <note><title>Modifier la chaîne de requête</title>
1243 <p>Par défaut, la chaîne de requête est transmise sans
1244 modification. Vous pouvez cependant créer dans la chaîne de
1245 substitution des URLs dont une partie constitue une chaîne de
1246 requête. Pour cela, ajoutez simplement un point d'interrogation
1247 dans la chaîne de substitution pour indiquer que le texte qui
1248 suit doit être réinjecté dans la chaîne de requête. Pour
1249 supprimer une chaîne de requête, terminez simplement la chaîne de
1250 substitution par un point d'interrogation. Pour combiner les
1251 nouvelles chaînes de requête avec les anciennes, utilisez le
1252 drapeau <code>[QSA]</code>.</p>
1256 <p>En outre, vous pouvez spécifier des <a name="rewriteflags"
1257 id="rewriteflags">actions</a> spéciales à effectuer en ajoutant
1259 <strong><code>[</code><em>drapeaux</em><code>]</code></strong>
1260 comme troisième argument de la directive
1261 <code>RewriteRule</code>. Séparés par des virgules au sein d'une
1262 liste encadrée par des crochets, les <em>drapeaux</em> peuvent
1263 être choisis dans la table suivante. Vous trouverez plus de
1264 détails, et des exemples pour chaque drapeau dans le <a
1265 href="../rewrite/flags.html">document à propos des drapeaux de
1266 réécriture.</a></p>
1269 <tr><th>Drapeaux et syntaxe</th>
1274 <td>Echappe les caractères non-alphanumériques <em>avant</em>
1275 d'appliquer la transformation. <em><a
1276 href="../rewrite/flags.html#flag_b">détails ...</a></em></td>
1280 <td>La règle est chaînée avec la règle suivante. Si la règle
1281 échoue, la ou les règles avec lesquelles elle est est chaînée
1282 seront sautées. <em><a
1283 href="../rewrite/flags.html#flag_c">détails ...</a></em></td>
1286 <td>cookie|CO=<em>NAME</em>:<em>VAL</em></td>
1287 <td>Définit un cookie au niveau du navigateur client. La syntaxe
1288 complète est :
1289 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>
1290 <em><a href="../rewrite/flags.html#flag_co">détails ...</a></em>
1294 <td>discardpath|DPI</td>
1295 <td>Supprime la partie PATH_INFO de l'URI réécrit. <em><a
1296 href="../rewrite/flags.html#flag_dpi">détails
1300 <td>env|E=[!]<em>VAR</em>[:<em>VAL</em>]</td>
1301 <td>Définit la variable d'environnement <em>VAR</em> (à la valeur
1302 <em>VAL</em> si elle est fournie). La variante !<em>VAR</em>
1303 annule la définition de la variable <em>VAR</em>.<em><a
1304 href="../rewrite/flags.html#flag_e">détails ...</a></em></td>
1307 <td>forbidden|F</td>
1308 <td>Renvoie une réponse 403 FORBIDDEN au navigateur client.
1309 <em><a href="../rewrite/flags.html#flag_f">détails ...</a></em></td>
1313 <td>Renvoie un message d'erreur 410 GONE au navigateur client. <em><a
1314 href="../rewrite/flags.html#flag_g">détails ...</a></em></td>
1317 <td>Handler|H=<em>Gestionnaire de contenu</em></td>
1318 <td>L'URI résultant est envoyé au <em>Gestionnaire de
1319 contenu</em> pour traitement. <em><a
1320 href="../rewrite/flags.html#flag_h">détails ...</a></em></td>
1324 <td>Arrête le processus de réécriture immédiatement et n'applique
1325 plus aucune règle. Prêtez une attention particulière aux mises
1326 en garde concernant les contextes de niveau répertoire et
1327 .htaccess (voir aussi le drapeau END). <em><a
1328 href="../rewrite/flags.html#flag_l">détails ...</a></em></td>
1332 <td>Réexécute le processus de réécriture à partir de la première
1333 règle, en utilisant le résultat du jeu de règles, sous réserve
1334 qu'il y ait un point de départ. <em><a
1335 href="../rewrite/flags.html#flag_n">détails
1340 <td>Rend la comparaison entre modèles insensible à la casse.
1341 <em><a href="../rewrite/flags.html#flag_nc">détails ...</a></em></td>
1344 <td>noescape|NE</td>
1345 <td>Empêche mod_rewrite d'effectuer un échappement hexadécimal
1346 des caractères spéciaux dans le résultat de la réécriture. <em><a
1347 href="../rewrite/flags.html#flag_ne">détails ...</a></em></td>
1350 <td>nosubreq|NS</td>
1351 <td>La règle est sautée si la requête courante est une
1352 sous-requête interne. <em><a
1353 href="../rewrite/flags.html#flag_ns">détails ...</a></em></td>
1357 <td>Force l'envoi en interne de l'URL de substitution en tant
1358 que requête mandataire. <em><a
1359 href="../rewrite/flags.html#flag_p">détails
1363 <td>passthrough|PT</td>
1364 <td>L'URI résultant est repassé au moteur de mise en
1365 correspondance des URLs pour y être traité par d'autres
1366 traducteurs URI-vers-nom de fichier, comme <code>Alias</code> ou
1367 <code>Redirect</code>. <em><a
1368 href="../rewrite/flags.html#flag_pt">détails ...</a></em></td>
1371 <td>qsappend|QSA</td>
1372 <td>Ajoute toute chaîne de paramètres présente dans l'URL de la
1373 requête originale à toute chaîne de paramètres créée dans la
1374 cible de réécriture. <em><a
1375 href="../rewrite/flags.html#flag_qsa">détails ...</a></em></td>
1378 <td>qsdiscard|QSD</td>
1379 <td>Supprime toute chaîne de paramètres de l'URI entrant. <em><a
1380 href="../rewrite/flags.html#flag_qsd">détails
1384 <td>redirect|R[=<em>code</em>]</td>
1385 <td>Force une redirection externe, avec un code de statut HTTP
1387 href="../rewrite/flags.html#flag_r">détails ...</a></em>
1392 <td>Arrête le processus de réécriture immédiatement et
1393 n'applique plus aucune règle. Empêche aussi l'exécution
1394 ultérieure de règles de réécriture dans des contextes de
1395 répertoire et des fichiers .htaccess (disponible depuis la
1396 version 2.3.9) <em><a
1397 href="../rewrite/flags.html#flag_l">détails ...</a></em></td>
1400 <td>skip|S=<em>nombre</em></td>
1401 <td>Si la règle courante s'applique, le moteur de réécriture
1402 doit sauter les <em>nombre</em> règles suivantes. <em><a
1403 href="../rewrite/flags.html#flag_s">détails ...</a></em></td>
1406 <td>type|T=<em>MIME-type</em></td>
1407 <td>Force l'attribution du <glossary>Type-MIME</glossary>
1408 spécifié au fichier cible. <em><a
1409 href="../rewrite/flags.html#flag_t">détails ...</a></em></td>
1413 <note><title>Développement du répertoire home</title>
1414 <p> Quand la chaîne de substitution commence par quelque chose comme
1415 "/~user" (de manière explicite ou par références arrières), mod_rewrite
1416 développe le répertoire home sans tenir compte de la présence ou de la
1417 configuration du module <module>mod_userdir</module>.</p>
1419 <p> Ce développement n'est pas effectué si le drapeau <em>PT</em> est
1420 utilisé dans la directive <directive module="mod_rewrite">RewriteRule</directive></p>
1423 <p>Voici toutes les combinaisons de substitution et leurs
1424 significations :</p>
1426 <p><strong>Dans la configuration au niveau du serveur principal
1427 (<code>httpd.conf</code>)<br />
1428 pour la requête ``<code>GET
1429 /chemin/infochemin</code>'':</strong><br />
1434 <th>Règle</th>
1435 <th>Résultat de la substitution</th>
1439 <td>^/un_chemin(.*) autre_chemin$1</td>
1440 <td>invalide, non supporté</td>
1444 <td>^/un_chemin(.*) autre_chemin$1 [R]</td>
1445 <td>invalide, non supporté</td>
1449 <td>^/un_chemin(.*) autre_chemin$1 [P]</td>
1450 <td>invalide, non supporté</td>
1454 <td>^/un_chemin(.*) /autre_chemin$1</td>
1455 <td>/autre_chemin/info_chemin</td>
1459 <td>^/un_chemin(.*) /autre_chemin$1 [R]</td>
1460 <td>http://cet_hote/autre_chemin/info_chemin via une redirection externe</td>
1464 <td>^/un_chemin(.*) /autre_chemin$1 [P]</td>
1465 <td>sans objet, non supporté</td>
1469 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1</td>
1470 <td>/autre_chemin/info_chemin</td>
1474 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1 [R]</td>
1475 <td>http://cet_hote/autre_chemin/info_chemin via une redirection externe</td>
1479 <td>^/un_chemin(.*) http://cet_hote/autre_chemin$1 [P]</td>
1480 <td>sans objet, non supporté</td>
1484 <td>^/un_chemin(.*) http://autre_hote/autre_chemin$1</td>
1485 <td>http://autre_hote/autre_chemin/info_chemin via une redirection externe</td>
1489 <td>^/un_chemin(.*) http://autre_hote/autre_chemin$1 [R]</td>
1490 <td>http://autre_hote/autre_chemin/info_chemin (le drapeau [R] est
1495 <td>^/somepath(.*) http://otherhost/otherpath$1 [P]</td>
1496 <td>http://otherhost/otherpath/pathinfo via internal proxy</td>
1500 <p><strong>Dans une configuration de niveau répertoire pour
1501 <code>/chemin</code><br />
1502 (<code>/chemin/physique/vers/chemin/.htacccess</code>, avec
1503 <code>RewriteBase /chemin</code>)<br />
1504 pour la requête ``<code>GET
1505 /chemin/chemin-local/infochemin</code>'':</strong><br />
1511 <th>Règle</th>
1512 <th>Résultat de la substitution</th>
1516 <td>^chemin-local(.*) autre-chemin$1</td>
1517 <td>/chemin/autre-chemin/infochemin</td>
1521 <td>^chemin-local(.*) autre-chemin$1 [R]</td>
1522 <td>http://cet-hôte/chemin/autre-chemin/infochemin via redirection
1527 <td>^chemin-local(.*) autre-chemin$1 [P]</td>
1528 <td>n'a pas lieu d'être, non supporté</td>
1532 <td>^chemin-local(.*) /autre-chemin$1</td>
1533 <td>/autre-chemin/infochemin</td>
1537 <td>^chemin-local(.*) /autre-chemin$1 [R]</td>
1538 <td>http://cet-hôte/autre-chemin/infochemin via redirection externe</td>
1542 <td>^chemin-local(.*) /autre-chemin$1 [P]</td>
1543 <td>n'a pas lieu d'être, non supporté</td>
1547 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1</td>
1548 <td>/autre-chemin/infochemin</td>
1552 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1 [R]</td>
1553 <td>http://cet-hôte/autre-chemin/infochemin via redirection externe</td>
1557 <td>^chemin-local(.*) http://cet-hôte/autre-chemin$1 [P]</td>
1558 <td>n'a pas lieu d'être, non supporté</td>
1562 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1</td>
1563 <td>http://autre hôte/autre-chemin/infochemin via redirection externe</td>
1567 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1 [R]</td>
1568 <td>http://autre hôte/autre-chemin/infochemin via redirection externe
1569 (le drapeau [R] est redondant)</td>
1573 <td>^chemin-local(.*) http://autre hôte/autre-chemin$1 [P]</td>
1574 <td>http://autre hôte/autre-chemin/infochemin via un mandataire interne</td>
1580 </directivesynopsis>