You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by gr...@apache.org on 2009/07/18 22:47:53 UTC
svn commit: r795429 [3/4] - in /httpd/httpd/trunk/docs/manual/mod:
mod_rewrite.html mod_rewrite.html.fr mod_rewrite.xml.fr mod_rewrite.xml.meta
Added: httpd/httpd/trunk/docs/manual/mod/mod_rewrite.xml.fr
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_rewrite.xml.fr?rev=795429&view=auto
==============================================================================
--- httpd/httpd/trunk/docs/manual/mod/mod_rewrite.xml.fr (added)
+++ httpd/httpd/trunk/docs/manual/mod/mod_rewrite.xml.fr Sat Jul 18 20:47:52 2009
@@ -0,0 +1,1856 @@
+<?xml version="1.0"?>
+<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
+<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
+<!-- English Revision : 729539 -->
+<!-- French translation : Lucien GENTIS -->
+<!-- Reviewed by : Vincent Deffontaines -->
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<modulesynopsis metafile="mod_rewrite.xml.meta">
+
+<name>mod_rewrite</name>
+
+<description>Ce module fournit un moteur de réécriture à base de
+règles permettant de réécrire les URLs des requêtes
+à la volée</description>
+
+<status>Extension</status>
+<sourcefile>mod_rewrite.c</sourcefile>
+<identifier>rewrite_module</identifier>
+<compatibility>Disponible à partir de la version 1.3
+d'Apache</compatibility>
+
+<summary>
+ <p>Ce module utilise un moteur de réécriture à base de règles
+ (basé sur un interpréteur d'expressions rationnelles) pour
+ réécrire les URLs des requêtes à la volée. Il accepte un nombre
+ illimité de règles, ainsi q'un nombre illimité de conditions
+ attachées à chaque règle, fournissant ainsi un mécanisme de
+ manipulation d'URL vraiment souple et puissant. Les manipulations
+ d'URL peuvent dépendre de nombreux tests, des variables du
+ serveur, des variables d'environnement, des en-têtes HTTP ou de
+ l'horodatage. On peut même lancer des requêtes vers une base de
+ données externe sous divers formats, afin d'obtenir une
+ sélection d'URL très fine.</p>
+
+ <p>Ce module agit sur l'ensemble de l'URL (la partie concernant
+ le chemin incluse) au niveau du serveur
+ (<code>httpd.conf</code>) mais aussi au niveau du répertoire
+ (<code>.htaccess</code>), et peut inclure des arguments de chaîne
+ de requête (query string) comme résultat. Le résultat de la réécriture peut
+ renvoyer vers un sous-traitement interne, une redirection vers
+ une requête externe, ou même vers le flux d'un proxy interne.</p>
+
+ <p>Vous trouverez d'avantage de détails, discussions et exemples
+ dans la
+ <a href="../rewrite/">documentation détaillée
+ sur mod_rewrite</a>.</p>
+</summary>
+
+<seealso><a href="#rewriteflags">Drapeaux des règles de réécriture</a></seealso>
+
+
+<section id="quoting"><title>Marquage des caractères spéciaux</title>
+
+ <p>Depuis Apache 1.3.20, les caractères spéciaux dans les
+ <em>chaînes de test</em> et les chaînes de <em>Substitution</em>
+ peuvent être échappés (c'est à dire traités comme des caractères
+ normaux sans tenir compte de leur signification en tant que
+ caractère spécial), en les faisant précéder d'un caractère
+ anti-slash ('\'). En d'autres termes, vous pouvez inclure un
+ véritable signe "dollar" dans une chaîne de <em>Substitution</em>
+ en utilisant '<code>\$</code>' ; ceci empêche mod_rewrite de le
+ traiter comme une référence arrière.</p>
+</section>
+
+<section id="EnvVar"><title>Variables d'environnement</title>
+
+ <p>Ce module conserve le contenu de deux variables d'environnement
+ CGI/SSI additionnelles (non standards) nommées
+ <code>SCRIPT_URL</code> et <code>SCRIPT_URI</code>. Celles-ci
+ contiennent l'adresse <em>logique</em> vue du Web
+ de la ressource concernée, tandis que les variables CGI/SSI
+ standards <code>SCRIPT_NAME</code> et
+ <code>SCRIPT_FILENAME</code> contiennent l'adresse
+ <em>physique</em> de la ressource vue du système. </p>
+
+ <p>Note : ces variables conservent l'URI/URL <em>telle qu'elle
+ était à l'arrivée de la requête</em>, c'est à dire
+ <em>avant</em> tout processus de réécriture. Il est important de
+ le savoir car le processus de réécriture est principalement
+ utilisé pour réécrire des URLs logiques en chemins physiques.
+ <br />
+ Ces variables sont définies dans un contexte du niveau serveur, ce
+ qui signifie qu'elles ne sont disponibles que dans un contexte de
+ répertoire, si <directive>RewriteEngine</directive> est positionné à
+ <code>on</code> dans un contexte de niveau serveur.</p>
+
+
+<example><title>Exemple</title>
+<pre>
+SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
+SCRIPT_FILENAME=/u/rse/.www/index.html
+SCRIPT_URL=/u/rse/
+SCRIPT_URI=http://en1.engelschall.com/u/rse/
+</pre>
+</example>
+
+</section>
+
+<section id="vhosts"><title>Réécriture et hôtes virtuels</title>
+
+ <p>Par défaut, les hôtes virtuels n'héritent pas de la
+ configuration de <module>mod_rewrite</module> telle qu'elle est
+ définie dans le contexte du serveur principal. Pour que la
+ configuration du serveur principal s'applique aux hôtes virtuels,
+ vous devez insérez les directives suivantes dans chaque section
+ <directive
+ module="core" type="section">VirtualHost</directive> :</p>
+
+ <example>
+ RewriteEngine On<br />
+ RewriteOptions Inherit
+ </example>
+</section>
+
+<section id="Solutions"><title>Solutions pratiques</title>
+
+ <p>Vous trouverez de nombreux exemples d'utilisation courante (et
+ moins courante) de mod_rewrite dans le
+ <a href="../rewrite/rewrite_guide.html">Guide de réécriture</a>,
+ et dans le
+ <a href="../rewrite/rewrite_guide_advanced.html"
+ >Guide de réécriture avancée</a>.</p>
+
+</section>
+
+<directivesynopsis>
+<name>RewriteEngine</name>
+<description>Active ou désactive l'exécution du
+moteur de réécriture</description>
+<syntax>RewriteEngine on|off</syntax>
+<default>RewriteEngine off</default>
+<contextlist><context>server config</context><context>virtual host</context>
+<context>directory</context><context>.htaccess</context></contextlist>
+<override>FileInfo</override>
+
+<usage>
+
+ <p>La directive <directive>RewriteEngine</directive> active ou
+ désactive l'exécution du moteur de réécriture. Si sa valeur est
+ <code>off</code>, ce module n'exécutera aucun traitement et ne
+ mettra pas à jour les variables d'environnement
+ <code>SCRIPT_URx</code>.</p>
+
+ <p>Pour désactiver le module, il vaut mieux utiliser cette
+ directive que commenter toutes les directives <directive
+ module="mod_rewrite">RewriteRule</directive> !</p>
+
+ <p>Notez que les hôtes virtuels n'héritent pas des
+ configurations de réécriture. Ceci implique que vous devez
+ insérer une directive <code>RewriteEngine on</code> dans chaque
+ hôte virtuel pour lequel vous souhaitez utiliser des règles
+ de réécriture.</p>
+
+ <p>Les directives <directive>RewriteMap</directive> du type
+ <code>prg</code> ne sont pas prises en compte au cours de
+ l'initialisation du serveur si elle ont été définies dans un
+ contexte où la directive <directive>RewriteEngine</directive> n'a
+ pas été définie à <code>on</code>.</p>
+
+</usage>
+
+</directivesynopsis>
+
+<directivesynopsis>
+<name>RewriteOptions</name>
+<description>Configure certaines options spéciales
+pour le moteur de réécriture</description>
+<syntax>RewriteOptions <var>Options</var></syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+<context>directory</context><context>.htaccess</context></contextlist>
+<override>FileInfo</override>
+<compatibility><code>MaxRedirects</code> n'est plus disponible depuis
+la version version 2.1</compatibility>
+<usage>
+
+ <p>La directive <directive>RewriteOptions</directive> définit
+ certaines options spéciales pour la configuration au niveau du
+ serveur ou du répertoire. La chaîne de caractères <em>Option</em>
+ ne peut actuellement prendre qu'une des valeurs suivantes :</p>
+
+ <dl>
+ <dt><code>inherit</code></dt>
+ <dd>Ceci force la configuration locale à hériter de la
+ configuration du niveau supérieur. Dans le contexte des hôtes
+ virtuels, cela signifie que les correspondances, conditions et
+ règles du serveur principal sont héritées. Dans le contexte des
+ répertoires, cela signifie que les conditions et règles de la
+ configuration <code>.htaccess</code> ou les sections <directive
+ type="section" module="core">Directory</directive> du répertoire
+ parent sont héritées. Les règles héritées sont virtuellement
+ copiées dans la section où cette directive est utilisée. Si elles
+ sont utilisées avec des règles locales, les règles héritées sont
+ placées après ces dernières. La place de cette directive - avant
+ ou après les règles locales - n'a aucune influance sur ce
+ comportement. Si des règles locales ont forcé l'arrêt de la
+ réécriture, les règles héritées ne seront pas traitées.
+ </dd>
+ </dl>
+</usage>
+
+</directivesynopsis>
+
+<directivesynopsis>
+<name>RewriteLog</name>
+<description>Définit le nom du fichier utilisé pour la journalisation
+des traitements du moteur de réécriture</description>
+<syntax>RewriteLog <em>chemin du fichier journal</em></syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>RewriteLog</directive> définit le nom
+ du fichier dans lequel le serveur journalise tout processus de
+ réécriture qu'il effectue. Si le nom ne commence pas par un
+ slash ('<code>/</code>'), il est considéré comme relatif à la
+ <em>Racine du serveur</em>. Cette directive ne doit apparaître
+ qu'une seule fois dans la configuration du serveur.</p>
+
+<note> Il est déconseillé de positionner
+ <em>chemin du fichier journal</em> à <code>/dev/null</code>
+ pour désactiver la journalisation des processus de réécriture,
+ car même si le moteur de réécriture n'envoie plus sa sortie
+ dans un fichier, il continue à créer un fichier journal en
+ interne, <strong>ce qui va avoir pour effet de ralentir le
+ serveur sans fournir aucun avantage à l'administrateur !
+ </strong> Pour désactiver la journalisation, vous pouvez
+ soit supprimer (ou commenter) la directive
+ <directive>RewriteLog</directive>, soit utiliser
+ <code>RewriteLogLevel 0</code> !
+</note>
+
+<note type="securitywarning"><title>Sécurité</title>
+
+Se référer au document
+<a href="../misc/security_tips.html">Conseils à propos
+de la sécurité dans Apache</a> pour plus de détails sur la manière
+dont votre sécurité pourrait être compromise si le répertoire où se
+trouvent les fichiers journaux est accessible en écriture par quiconque
+autre que l'utilisateur qui démarre le serveur.
+</note>
+
+<example><title>Exemple</title>
+RewriteLog "/usr/local/var/apache/logs/rewrite.log"
+</example>
+
+</usage>
+
+</directivesynopsis>
+
+<directivesynopsis>
+<name>RewriteLogLevel</name>
+<description>Définit la verbosité du fichier journal utilisé
+par le moteur de réécriture</description>
+<syntax>RewriteLogLevel <em>niveau</em></syntax>
+<default>RewriteLogLevel 0</default>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>RewriteLogLevel</directive> définit
+ le niveau de verbosité du fichier journal de réécriture. Le
+ niveau par défaut 0 signifie aucune journalisation, tandis que
+ 9 ou plus signifie que pratiquement toutes les actions sont
+ journalisées.</p>
+
+ <p>Pour désactiver la journalisation des actions de réécriture,
+ positionnez simplement <em>niveau</em> à 0. Ceci désactive
+ toute journalisation des actions de réécriture.</p>
+
+<note> Utiliser une valeur élevée pour <em>niveau</em> va ralentir
+ considérablement votre serveur Apache ! N'utilisez une
+ journalisation de la réécriture à un <em>niveau</em>
+ supérieur à 2 qu'à des fins de débogage !
+</note>
+
+<example><title>Exemple</title>
+RewriteLogLevel 3
+</example>
+
+</usage>
+
+</directivesynopsis>
+
+<directivesynopsis>
+<name>RewriteLock</name>
+<description>Définit le nom du fichier verrou utilisé pour la
+synchronisation de <directive
+module="mod_rewrite">RewriteMap</directive></description>
+<syntax>RewriteLock <em>chemin du fichier verrou</em></syntax>
+<contextlist><context>server config</context></contextlist>
+
+<usage>
+ <p>Cette directive définit le nom du fichier utilisé comme
+ fichier verrou de synchronisation nécessaire à mod_rewrite pour
+ communiquer avec les <em>programmes</em> liés à <directive
+ module="mod_rewrite">RewriteMap</directive>. Définissez ce
+ fichier verrou dans un chemin local (et non sur un montage NFS)
+ si vous voulez utiliser un programme de comparaison pour la
+ réécriture. Il n'est pas nécessaire pour les autres types de
+ comparaison pour la réécriture.</p>
+</usage>
+
+</directivesynopsis>
+
+<directivesynopsis>
+<name>RewriteMap</name>
+<description>Définit une fonction de mise en correspondance pour la
+recherche de mots-clés</description>
+<syntax>RewriteMap <em>nom de la correspondance</em> <em>type de
+correspondance</em>:<em>source de la correspondance</em>
+</syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+<compatibility>Il est possible de choisir entre plusieurs types de
+bases de données depuis la version 2.0.41 d'Apache</compatibility>
+
+<usage>
+ <p>La directive <directive>RewriteMap</directive> définit une
+ <em>Table de correspondance pour la réécriture</em> que les
+ fonctions de mise en correspondance
+ peuvent utiliser dans les chaînes de substitution des règles
+ pour insérer/substituer des champs en recherchant des mots-clés.
+ La source utilisée pour cette recherche peut être de plusieurs
+ types.</p>
+
+ <p><a id="mapfunc" name="mapfunc"><em>nom de la
+ correspondance</em></a> est le nom de la table de correspondance
+ et servira à spécifier une fonction de mise en correspondance
+ pour les chaînes de substitution d'une règle de réécriture selon
+ une des constructions suivantes :</p>
+
+ <p class="indent">
+ <strong><code>${</code> <em>nom de la
+ correspondance</em> <code>:</code>
+ <em>mot-clé</em> <code>}</code><br />
+ <code>${</code> <em>nom de la
+ correspondance</em> <code>:</code>
+ <em>mot-clé</em> <code>|</code> <em>valeur par défaut</em>
+ <code>}</code></strong>
+ </p>
+
+ <p>Lorsqu'une telle construction est rencontrée, la table de
+ correspondance <em>Nom de la correspondance</em> est consultée
+ et la clé <em>mot-clé</em> recherchée. Si la clé est trouvée, la
+ construction est remplacée par
+ la <em>valeur de remplacement</em>. Si la clé n'est pas trouvée,
+ elle est remplacée par la <em>valeur par défaut</em>, ou par une
+ chaîne vide si aucune <em>valeur par défaut</em> n'est
+ spécifiée.</p>
+
+ <p>Par exemple, vous pouvez définir une directive
+ <directive>RewriteMap</directive> comme suit </p>
+
+ <example>
+ RewriteMap map-exemple txt:/chemin/vers/fichier/map.txt
+ </example>
+
+ <p>Vous pourrez ensuite utiliser cette table dans une
+ directive <directive>RewriteRule</directive> comme suit :</p>
+
+ <example>
+ RewriteRule ^/ex/(.*) ${map-exemple:$1}
+ </example>
+
+ <p>Les combinaisons suivantes pour <em>type de correspondance</em>
+ et <em>source de la correspondance</em>
+ peuvent être utilisées :</p>
+
+ <ul>
+ <li>
+ <strong>Format texte standard</strong><br />
+ type de correspondance : <code>txt</code>, source de la
+ correspondance : chemin du système de fichiers Unix vers un
+ fichier régulier valide
+
+ <p>Il s'agit de la mise en oeuvre standard de la table de
+ correspondance pour la réécriture où la
+ <em>source de la correspondance</em> est un fichier ASCII
+ dont les différentes lignes sont soit des lignes vides, soit
+ des lignes de commentaires (commençant par un caractère "#"),
+ soit des paires de valeurs (une seule paire
+ par ligne) comme suit :</p>
+
+ <p class="indent">
+ <strong><em>mot-clé</em>
+ <em>valeur de remplacement</em></strong>
+ </p>
+
+<example><title>Exemple</title>
+<pre>
+##
+## map.txt -- table de correspondance pour la réécriture
+##
+
+Ralf.S.Engelschall rse # Bastard Operator From Hell
+Mr.Joe.Average joe # Mr. Average
+</pre>
+</example>
+
+<example>
+RewriteMap real-to-user txt:/chemin/vers/fichier/map.txt
+</example>
+ </li>
+
+ <li>
+ <strong>Format texte avec valeurs aléatoires</strong><br />
+ type de correspondance: <code>rnd</code>,
+ source de la correspondance : chemin du système de fichiers
+ Unix vers un fichier régulier valide
+
+ <p>Ce format se différencie du format texte standard
+ précédent par l'ajout d'un traitement supplémentaire : en
+ plus de la recherche de clés, le fichier est interprété en
+ tenant compte de la présence éventuelle dans les valeurs de
+ remplacement de caractères ``<code>|</code>'' signifiant
+ ``ou''. En d'autres termes, ces caractères ``<code>|</code>''
+ permettent de spécifier un jeu de valeurs parmi lesquelles
+ la valeur de retour sera choisie aléatoirement. Par exemple,
+ vous pouvez utiliser les fichier de correspondance et
+ directives suivants pour mettre en oeuvre une répartition de
+ charge aléatoire entre plusieurs serveurs en arrière-plan,
+ via un mandataire inverse. Les images sont envoyées à un des
+ serveurs de l'ensemble "statique", tandis que tout le
+ reste est envoyé à un des serveurs de l'ensemble
+ "dynamique".</p>
+ <p>Exemple:</p>
+
+<example><title>Fichier de correspondances pour la réécriture</title>
+<pre>
+##
+## map.txt -- correspondances pour la réécriture
+##
+
+static www1|www2|www3|www4
+dynamic www5|www6
+</pre>
+</example>
+
+<example><title>Directives de configuration</title>
+RewriteMap serveurs rnd:/chemin/vers/fichier/map.txt<br />
+<br />
+RewriteRule ^/(.*\.(png|gif|jpg)) http://${serveurs:static}/$1
+[NC,P,L]<br />
+RewriteRule ^/(.*) http://${serveurs:dynamic}/$1 [P,L]
+</example>
+ </li>
+
+ <li>
+ <strong>Fichier à accès direct (Hash file)</strong><br />
+ type de correspondance :
+ <code>dbm[=<em>type</em>]</code>, source de la
+ correspondance : chemin du système de fichiers Unix vers un
+ fichier régulier valide
+
+ <p>Ici, la source de la correspondance est un fichier binaire
+ au format DBM contenant les mêmes données qu'un fichier au
+ format <em>Plein texte</em>, mais selon une représentation
+ particulière optimisée en vue d'une recherche très rapide.
+ Le <em>type</em> peut être sdbm, gdbm, ndbm, ou db selon la
+ configuration à la <a href="../install.html#dbm">compilation
+ </a>. Si <em>type</em> est omis, la valeur retenue
+ sera la valeur par défaut définie à la compilation.</p>
+
+ <p>La création du fichier dbm à partir d'un fichier texte
+ s'effectue à l'aide de l'utilitaire <a
+ href="../programs/httxt2dbm.html">httxt2dbm</a>.</p>
+
+<example>
+$ httxt2dbm -i fichier-source.txt -o fichier-dbm.map
+</example>
+ </li>
+
+ <li>
+ <strong>Fonction interne</strong><br />
+ type de la correspondance : <code>int</code>,
+ source de la correspondance : fonction interne à Apache
+
+ <p>Ici, la source de la correspondance est une fonction
+ interne à Apache. Actuellement, vous ne pouvez pas créer
+ votre propre fonction, mais les fonctions suivantes
+ existent déjà :</p>
+
+ <ul>
+ <li><strong>toupper</strong>:<br />
+ Convertit tous les caractères de la clé en majuscules.</li>
+
+ <li><strong>tolower</strong>:<br />
+ Convertit tous les caractères de la clé en minuscules.</li>
+
+ <li><strong>escape</strong>:<br />
+ Traduit les caractères spéciaux que contient la clé en
+ séquences hexadécimales.</li>
+
+ <li><strong>unescape</strong>:<br />
+ Reconvertit les séquences hexadécimales que contient la
+ clé en caractères spéciaux.</li>
+ </ul>
+ </li>
+
+ <li>
+ <strong>Programme de réécriture externe</strong><br />
+ type de la correspondance : <code>prg</code>,
+ source de la correspondance :
+ chemin du système de fichiers Unix vers un
+ fichier régulier valide
+
+ <p>Ici, la source n'est pas un fichier de correspondances,
+ mais un programme. Pour le créer, vous pouvez utiliser le
+ langage de votre choix, mais le programme doit être un
+ exécutable (soit du code objet, soit un script
+ contenant le fameux
+ "<code>#!/chemin/vers/interpréteur</code>" au début de sa
+ première ligne).</p>
+
+ <p>Ce programme est lancé une seule fois au démarrage du
+ serveur Apache, puis communique avec le moteur de réécriture
+ via ses entrée et sortie standards (<code>stdin</code>
+ et <code>stdout</code>). A chaque recherche effectuée par la
+ fonction de correspondance, il reçoit sur son entrée standard
+ la clé à rechercher sous la forme d'une chaîne de caractères
+ terminée par le caractère "nouvelle ligne". Il doit ensuite
+ renvoyer sur sa sortie standard la valeur recherchée sous
+ la forme d'une chaîne de caractères terminée par le caractère
+ "nouvelle ligne", ou la chaîne de quatre
+ caractères ``<code>NULL</code>'' en cas d'échec
+ (<em>c'est à dire</em>
+ si aucune valeur ne correspond à la clé fournie).</p>
+
+ <p>Les programmes de réécriture externes ne seront pas lancés
+ s'ils ont été définis dans un contexte où la directive
+ <directive>RewriteEngine</directive> n'a pas été définie à
+ <code>on</code>.</p>
+
+ <p>Voici un
+ exemple de ce pourrait être un programme trivial qui
+ implémenterait une correspondance 1:1 (<em>c'est à dire</em>,
+ clé == valeur) :</p>
+
+<example>
+<pre>
+#!/usr/bin/perl
+$| = 1;
+while (<STDIN>) {
+ # ...insérer ici le code de transformation ou de recherche...
+ print $_;
+}
+</pre>
+</example>
+
+ <p>Mais soyez très prudent :</p>
+
+ <ol>
+ <li>``<em>Ce programme doit être simple, basique</em>''
+ (MERCI).
+ Si ce programme se bloque, il bloquera aussi Apache
+ lorsqu'il tentera d'utiliser la règle de réécriture
+ correspondante.</li>
+
+ <li>L'utilisation d'entrées/sorties avec tampon sur
+ <code>stdout</code> est une erreur courante. Ceci est à
+ proscrire sous peine de créer une boucle infernale ! Pour
+ éviter ceci, on utilise (en langage Perl) ``<code>$|=1</code>'' comme dans
+ l'exemple ci-dessus.</li>
+
+ <li>On peut définir la directive <directive
+ module="mod_rewrite">RewriteLock</directive> pour spécifier
+ un fichier verrou que mod_rewrite pourra utiliser pour
+ synchroniser les communications avec le programme de
+ correspondance. Par défaut, aucune synchronisation de ce
+ type n'est mise en oeuvre.</li>
+ </ol>
+ </li>
+ <li>
+ <p><strong>Requête SQL</strong><br />
+ type de correspondance : <code>dbd</code> ou
+ <code>fastdbd</code>,
+ source de la correspondance : une requête SQL SELECT qui
+ comporte un seul argument et renvoie une seule valeur.</p>
+ <p>Ici, on utilise <module>mod_dbd</module> pour implémenter
+ une correspondance pour la réécriture par recherche dans une
+ base de données SQL. Deux modes sont possibles :
+ <code>fastdbd</code> met en cache les recherches dans la base
+ de données en interne, alors que <code>dbd</code> ne le fait
+ pas. Ainsi, <code>dbd</code> diminue les performances, mais
+ donnera toujours une réponse actualisée, même si le contenu
+ de la base de données est mise à jour, alors que
+ <code>fastdbd</code> est plus performant mais ne relira pas
+ le contenu de la base de données tant que le serveur ne sera
+ pas redémarré.</p>
+ <p>Si une requête renvoie plusieurs réponses, une de ces
+ dernières sera choisie aléatoirement.</p>
+<example>
+<title>Example</title>
+RewriteMap ma-requete "fastdbd:SELECT destination FROM rewrite WHERE source = %s"
+</example>
+ </li>
+ </ul>
+ <p>La directive <directive>RewriteMap</directive> peut
+ apparaître plusieurs fois. Utilisez une directive
+ <directive>RewriteMap</directive> par fonction de correspondance
+ pour déclarer son fichier de correspondance pour la réécriture.
+ Bien que vous ne puissiez pas <strong>déclarer</strong> une
+ table de correspondance dans un contexte de répertoire, vous
+ pouvez bien entendu <strong>utiliser</strong> cette table dans un
+ contexte de répertoire. </p>
+
+<note><title>Note</title> En ce qui concerne les fichiers au format DBM
+et texte plat, les clés de recherches sont mises en cache en interne
+jusqu'à ce que le <code>mtime (date de modification)</code> du fichier
+soit modifié, ou que le serveur soit redémarré. Ainsi, certaines
+fonctions de correspondance dans les règles peuvent être utilisées pour
+<strong>chaque</strong> requête. Cela ne pose pas problème, car la
+recherche externe n'intervient qu'une seule fois !
+</note>
+
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
+<name>RewriteBase</name>
+<description>Définit l'URL de base pour les réécritures au niveau
+répertoire</description>
+<syntax>RewriteBase <em>chemin URL</em></syntax>
+<default>Voir utilisation pour plus d'informations.</default>
+<contextlist><context>directory</context><context>.htaccess</context>
+</contextlist>
+<override>FileInfo</override>
+
+<usage>
+ <p>La directive <directive>RewriteBase</directive> définit
+ explicitement l'URL de base pour les réécritures au niveau du
+ répertoire. Comme vous le verrez plus loin, la directive
+ <directive module="mod_rewrite">RewriteRule</directive> peut
+ être utilisée dans les fichiers de configuration au niveau du
+ répertoire (<code>.htaccess</code>). Elle agit alors localement,
+ en amputant le répertoire local de son préfixe avant traitement,
+ et en n'appliquant les règles de réécriture que sur ce qui reste
+ de l'URL. Lorsque le traitement est terminé, le préfixe est
+ automatiquement rajouté à l'URL. La valeur par défaut est
+ <directive>RewriteBase</directive>
+ <em>chemin répertoire physique</em></p>
+
+ <p>Lorsqu'une substitution intervient pour une nouvelle URL, ce
+ module doit réinjecter l'URL dans le traitement du serveur. Pour
+ y parvenir, il doit connaître le préfixe de l'URL ou l'URL de
+ base correspondants. Par défaut, le préfixe est le chemin du
+ fichier correspondant lui-même. <strong>Cependant, pour la
+ plupart des sites web, les URLs ne correspondent PAS directement
+ aux chemins des fichiers physiques, cette assertion s'avère
+ ainsi souvent fausse !</strong>. C'est pourquoi vous pouvez
+ utiliser la directive <code>RewriteBase</code> pour spécifier
+ le préfixe correct.</p>
+
+<note> Si les URLs de votre serveur web ne correspondent
+<strong>pas</strong> directement aux chemins physiques des fichiers,
+vous devrez utiliser <directive>RewriteBase</directive> dans chaque
+fichier <code>.htaccess</code> où vous voudrez utiliser des
+directives <directive
+module="mod_rewrite">RewriteRule</directive>.
+</note>
+
+ <p> Par exemple, considérons le fichier de configuration de
+ répertoire suivant :</p>
+
+<example>
+<pre>
+#
+# /abc/def/.htaccess -- fichier de configuration pour le répertoire
+/abc/def
+# Rappel : /abc/def est le chemin physique de /xyz,
+# <em>ce qui veut dire</em> que la configuration du serveur comporte
+# une directive du style 'Alias /xyz /abc/def'.
+#
+
+RewriteEngine On
+
+# faisons savoir au serveur qu'on nous a atteint via /xyz et non par
+# le chemin physique /abc/def
+RewriteBase /xyz
+
+# maintenant les règles de réécriture
+RewriteRule ^avant\.html$ après.html
+</pre>
+</example>
+
+ <p>Dans l'exemple précédent, une requête pour
+ <code>/xyz/avant.html</code> sera correctement réécrite sous
+ sous sa forme chemin physique
+ <code>/abc/def/après.html</code>.</p>
+
+<note><title>Pour les hackers d'Apache</title>
+<p>La liste suivante fournit des informations détaillées à propos des
+étapes du traitement interne :</p>
+<pre>
+Requête :
+ /xyz/avant.html
+
+Traitement interne :
+ /xyz/avant.html -> /abc/def/avant.html (Alias au niveau serveur)
+ /abc/def/avant.html -> /abc/def/après.html (RewriteRule au niveau répertoire)
+ /abc/def/après.html -> /xyz/après.html (RewriteBase au niveau répertoire)
+ /xyz/après.html -> /abc/def/après.html (Alias au niveau serveur)
+
+Résultat :
+ /abc/def/après.html
+
+</pre>
+ <p>Tout ceci paraît très compliqué, mais correspond
+ réellement au traitement interne d'Apache. Comme la
+ réécriture au niveau du répertoire intervient plus tard
+ au cours du traitement, la requête de réécriture doit être
+ réinjectée dans le noyau d'Apache, comme s'il s'agissait
+ d'une nouvelle requête (Voir les <a
+ href="../rewrite/rewrite_tech.html">détails techniques à
+ propos de mod_rewrite</a>). La surcharge
+ correspondante n'est pas aussi importante qu'il n'y
+ paraît, car la réinjection est entièrement prise en charge
+ en interne par Apache (comme c'est d'ailleurs le cas pour
+ de nombreuses autres opérations effectuées à l'intérieur
+ d'Apache).</p>
+</note>
+
+</usage>
+
+</directivesynopsis>
+
+<directivesynopsis>
+<name>RewriteCond</name>
+<description>Définit une condition qui devra être satisfaite pour que
+la réécriture soit effectuée
+</description>
+<syntax> RewriteCond
+ <em>chaîne de test</em> <em>expression de comparaison</em></syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+<context>directory</context><context>.htaccess</context></contextlist>
+<override>FileInfo</override>
+
+<usage>
+ <p>La directive <directive>RewriteCond</directive> définit une
+ condition d'application d'une certaine règle. Une ou plusieurs
+ directives <directive>RewriteCond</directive> peuvent précéder
+ une directive
+ <directive module="mod_rewrite">RewriteRule</directive>. La règle
+ qui suit n'est appliquée que si l'état actuel de l'URI
+ correspond à son modèle, <strong
+ >et</strong> si les conditions sont satisfaites.</p>
+
+ <p><em>chaîne de test</em> est une chaîne de caractères qui peut
+ contenir, en plus du texte plat, les constructions étendues
+ suivantes :</p>
+
+ <ul>
+ <li>
+ <strong>références arrières de règle de réécriture</strong> :
+ ce sont des références arrières de la forme
+ <strong><code>$N</code></strong> (0 <= N <= 9), qui
+ donnent accès aux parties groupées (entre parenthèses) du
+ modèle tiré de la <code>RewriteRule</code> assujettie au
+ jeu de conditions concerné.
+ </li>
+ <li>
+ <strong>Références arrières de condition de réécriture
+ </strong> : ce sont des références arrières de la forme
+ <strong><code>%N</code></strong> (1 <= N <= 9), qui
+ donnent accès aux parties groupées (là aussi entre
+ parenthèses) du modèle de la dernière condition satisfaite
+ du jeu de conditions concerné.
+ </li>
+ <li>
+ <strong>extensions de table de réécriture</strong> :
+ ce sont des extensions de la forme <strong><code
+ >${nomTable:clé|défaut}</code></strong>. Voir
+ <a href="#mapfunc">la documentation de
+ RewriteMap</a> pour plus de détails.
+ </li>
+ <li>
+ <strong>Variables du serveur</strong> :
+ ce sont des variables de la forme
+ <strong><code>%{</code> <em>NOM_DE_VARIABLE</em>
+ <code>}</code></strong>
+ <strong><code>%{</code> <em>NOM_DE_VARIABLE</em>
+ <code>}</code></strong> où <em>NOM_DE_VARIABLE</em>
+ peut être une chaîne de caractères faisant partie de la
+ liste suivante :
+
+ <table>
+ <columnspec><column width=".3"/><column width=".3"/>
+ <column width=".3"/></columnspec>
+ <tr>
+ <th>En-têtes HTTP :</th> <th>connexion & requête:</th> <th></th>
+ </tr>
+
+ <tr>
+ <td>
+ HTTP_USER_AGENT<br />
+ HTTP_REFERER<br />
+ HTTP_COOKIE<br />
+ HTTP_FORWARDED<br />
+ HTTP_HOST<br />
+ HTTP_PROXY_CONNECTION<br />
+ HTTP_ACCEPT<br />
+ </td>
+
+ <td>
+ REMOTE_ADDR<br />
+ REMOTE_HOST<br />
+ REMOTE_PORT<br />
+ REMOTE_USER<br />
+ REMOTE_IDENT<br />
+ REQUEST_METHOD<br />
+ SCRIPT_FILENAME<br />
+ PATH_INFO<br />
+ QUERY_STRING<br />
+ AUTH_TYPE<br />
+ </td>
+
+ <td></td>
+ </tr>
+
+ <tr>
+ <th>variables internes au serveur :</th> <th>date et heure :</th> <th>spéciaux :</th>
+ </tr>
+
+ <tr>
+ <td>
+ DOCUMENT_ROOT<br />
+ SERVER_ADMIN<br />
+ SERVER_NAME<br />
+ SERVER_ADDR<br />
+ SERVER_PORT<br />
+ SERVER_PROTOCOL<br />
+ SERVER_SOFTWARE<br />
+ </td>
+
+ <td>
+ TIME_YEAR<br />
+ TIME_MON<br />
+ TIME_DAY<br />
+ TIME_HOUR<br />
+ TIME_MIN<br />
+ TIME_SEC<br />
+ TIME_WDAY<br />
+ TIME<br />
+ </td>
+
+ <td>
+ API_VERSION<br />
+ THE_REQUEST<br />
+ REQUEST_URI<br />
+ REQUEST_FILENAME<br />
+ IS_SUBREQ<br />
+ HTTPS<br />
+ </td>
+ </tr>
+ </table>
+
+ <p>Toutes ces variables correspondent nom pour nom aux
+ en-têtes MIME HTTP, aux variables C du serveur Apache
+ ou aux champs <code>struct tm</code> du système Unix.
+ La plupart sont documentées dans une autre partie du
+ manuel ou dans la spécification CGI. Vous trouverez
+ dans ce qui suit quelques variables spécifiques
+ à mod_rewrite.</p>
+ <note>
+ <dl>
+ <dt><code>IS_SUBREQ</code></dt>
+
+ <dd>Contiendra le texte "true" si la requête en cours
+ de traitement est une sous-requête, "false" dans le
+ cas contraire. Une sous-requête est générée quand un
+ module a besoin de se référer à des fichiers ou URIs
+ addidionnels pour pouvoir mener à bien sa tâche.</dd>
+
+ <dt><code>API_VERSION</code></dt>
+
+ <dd>Il s'agit de la version de l'API des modules
+ Apache (l'interface interne entre le serveur et les
+ modules) dans la construction actuelle de httpd,
+ telle qu'elle est définie dans include/ap_mmn.h. La
+ version de l'API des modules correspond à la version
+ d'Apache utilisée (pour Apache 1.3.14, par exemple,
+ la version de l'API sera 19990320:10), mais cette
+ information intéresse principalement les
+ développeurs de modules.</dd>
+
+ <dt><code>THE_REQUEST</code></dt>
+
+ <dd>La ligne de requête HTTP complète envoyée par le
+ navigateur au serveur (par exemple, "<code>GET
+ /index.html HTTP/1.1</code>"), à l'exclusion de tout
+ en-tête ajouté par le navigateur.</dd>
+
+ <dt><code>REQUEST_URI</code></dt>
+
+ <dd>La ressource demandée dans la ligne de requête
+ HTTP (correspondrait, dans l'exemple précédent, à
+ "/index.html").</dd>
+
+ <dt><code>REQUEST_FILENAME</code></dt>
+
+ <dd>Le chemin complet local au système de fichiers
+ du fichier ou du script correspondant
+ à la requête.</dd>
+
+ <dt><code>HTTPS</code></dt>
+
+ <dd>Contiendra le texte "on" si la connexion
+ utilise SSL/TLS, "off" dans le cas contraire
+ (L'utilisation de cette variable est pertinente,
+ indépendamment du fait que <module>mod_ssl</module>
+ soit chargé ou non).</dd>
+
+ </dl>
+</note>
+ </li>
+ </ul>
+
+ <p>Autres points à connaître :</p>
+
+ <ol>
+ <li>
+ <p>Les variables SCRIPT_FILENAME et REQUEST_FILENAME ont la
+ même valeur - celle du champ <code>filename</code> de la
+ structure interne du serveur Apache <code>request_rec</code>.
+ Le premier nom est bien connu en tant que variable CGI,
+ alors que le second est équivalent à REQUEST_URI (qui contient
+ la valeur du champ <code>uri</code> de la structure
+ <code>request_rec</code>).</p>
+ <p>Si une substitution intervient et si la réécriture continue,
+ les valeurs des deux variables seront mises à jour en
+ conséquence.</p>
+ <p>Dans un contexte de niveau serveur (<em>c'est à dire</em>
+ avant que la requête soit mise en correspondance avec le système
+ de fichiers), SCRIPT_FILENAME et REQUEST_FILENAME ne peuvent pas
+ contenir le chemin complet dans le système de fichier local car
+ ce dernier n'est pas encore connu à ce niveau du traitement.
+ Dans ce cas, les deux variables contiendront initialement la
+ valeur de REQUEST_URI. Pour avoir accès au chemin complet de la
+ requête dans le système de fichiers local dans un contexte de
+ niveau serveur, utilisez une référence avant à base d'URL
+ <code>%{LA-U:REQUEST_FILENAME}</code> pour déterminer la valeur
+ finale de REQUEST_FILENAME.</p></li>
+
+ <li>On peut également utiliser <code>%{ENV:variable}</code>, où
+ <em>variable</em> peut être remplacé par toute variable
+ d'environnement. Ces variables sont recherchées dans les
+ structures internes d'Apache, et (si elles n'y figurent pas)
+ via <code>getenv()</code> depuis le processus du serveur
+ Apache.</li>
+
+ <li>Que <module>mod_ssl</module> soit chargé ou non, on peut
+ utiliser <code>%{SSL:variable}</code>, où <em>variable</em>
+ peut être remplacé par le nom d'une
+ <a href="mod_ssl.html#envvars">variable
+ d'environnement SSL</a>, mais la valeur produite sera toujours
+ une chaîne de caractères vide si <module>mod_ssl</module> n'est
+ pas chargé. Exemple :
+ <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> peut correspondre
+ à <code>128</code>.</li>
+
+ <li>Pour obtenir la valeur d'un en-tête contenu dans une requête
+ HTTP, on peut toujours utiliser <code>%{HTTP:header}</code>,
+ où <em>header</em> peut être remplacé par tout nom d'en-tête
+ MIME HTTP. Exemple : <code>%{HTTP:Proxy-Connection}</code> est
+ la valeur de l'en-tête HTTP ``<code>Proxy-Connection:</code>''.
+ <p>Si une condition contient un en-tête HTTP, il est ajouté à
+ l'en-tête Vary de la réponse dans le cas où la condition est
+ évaluée à true pour la requête. Dans le cas contraire, il n'est
+ <strong>pas</strong> ajouté. L'ajout de l'en-tête HTTP à
+ l'en-tête Vary de la réponse s'avère nécessaire pour une mise
+ en cache correcte.</p>
+ <p>Il faut garder à l'esprit que les conditions suivent une
+ logique de court-circuit en cas de présence du drapeau
+ '<strong><code>ornext|OR</code></strong>', si bien que
+ certaines d'entre elles sont susceptibles de ne pas être
+ évaluées du tout.</p></li>
+
+ <li>On peut utiliser <code>%{LA-U:variable}</code> pour les
+ recherches en avant qui effectuent une sous-requête interne
+ (basée sur l'URL), pour déterminer la valeur finale de
+ <em>variable</em>. Cela peut servir à accéder à une variable
+ (nécessaire pour une réécriture) qui n'est pas disponible dans
+ la situation présente, mais le sera dans une phase ultérieure.
+ <p>Par exemple, pour effectuer une réécriture qui tient compte
+ de la variable <code>REMOTE_USER</code> dans un contexte
+ niveau serveur (fichier <code>httpd.conf</code>), vous devez
+ utiliser <code>%{LA-U:REMOTE_USER}</code> ; cette variable est
+ définie au cours des phases d'autorisation, qui interviennent
+ <em>après</em> la phase de traduction de l'URL (pendant
+ laquelle agit mod_rewrite).</p>
+ <p>Par contre, comme mod_rewrite implémente son contexte
+ niveau répertoire (fichier <code>.htaccess</code>) via la
+ phase Fixup de l'API, et comme les phases d'autorisation
+ interviennent <em>avant</em> cette phase, vous pouvez vous contenter
+ d'utiliser <code>%{REMOTE_USER}</code>
+ dans le contexte niveau serveur.</p></li>
+
+ <li>On peut utiliser <code>%{LA-F:variable}</code> pour
+ effectuer une sous-requête interne (basée sur un nom de
+ fichier), pour déterminer la valeur finale de
+ <em>variable</em>. La plupart du temps, elle est identique à
+ LA-U vue précédemment.</li>
+ </ol>
+
+ <p><em>expression de comparaison</em> est une expression
+ rationnelle qui est appliquée à l'instance actuelle de
+ <em>chaîne de test</em>. <em>chaîne de test</em> est d'abord
+ évaluée, puis comparée à
+ l'<em>expression de comparaison</em>.</p>
+
+ <p><strong>A savoir :</strong>
+ <em>expression de comparaison</em> est une
+ <em>expression rationnelle compatible perl</em> avec
+ quelques extensions :</p>
+
+ <ol>
+ <li>Vous pouvez préfixer l'expression avec un caractère
+ '<code>!</code>' (point d'exclamation) pour indiquer une
+ expression de <strong>non</strong>-correspondance.</li>
+
+ <li>Il existe certaines variantes spéciales
+ d'<em>expressions de comparaison</em>. A la place d'une
+ expression rationnelle, vous pouvez utiliser :
+
+ <ul>
+ <li>'<strong><expression</strong>' (inférieur au sens
+ lexicographique)<br />
+ Traite l'<em>expression</em> comme une chaîne de
+ caractères et la compare lexicographiquement à
+ <em>chaîne de test</em>. La condition est satisfaite si
+ <em>chaîne de test</em> est inférieure au sens
+ lexicographique à l'<em>expression</em>.</li>
+
+ <li>'<strong>>expression</strong>' (supérieur au sens
+ lexicographique)<br />
+ Traite l'<em>expression</em> comme une chaîne de
+ caractères et la compare lexicographiquement à
+ <em>chaîne de test</em>. La condition est satisfaite si
+ <em>chaîne de test</em> est supérieure au sens
+ lexicographique à l'<em>expression</em>.</li>
+
+ <li>'<strong>=expression</strong>' (égal au sens
+ lexicographique)<br />
+ Traite l'<em>expression</em> comme une chaîne de
+ caractères et la compare lexicographiquement à
+ <em>chaîne de test</em>. La condition est satisfaite si
+ <em>chaîne de test</em> est égale au sens
+ lexicographique à l'<em>expression</em> (les deux chaînes
+ sont exactement identiques, caractère pour caractère). Si
+ <em>expression</em> est <code>""</code> (deux guillemets),
+ <em>chaîne de test</em> est comparée à la chaîne vide.</li>
+
+ <li>'<strong>-d</strong>' (est un répertoire -
+ <strong>d</strong>irectory)<br />
+ Traite <em>chaîne de test</em> comme un chemin et vérifie
+ s'il existe ou pas, et s'il s'agit d'un répertoire.</li>
+
+ <li>'<strong>-f</strong>' (est un
+ <strong>f</strong>ichier régulier)<br />
+ Traite <em>chaîne de test</em> comme un chemin et vérifie
+ s'il existe ou pas, et s'il s'agit d'un fichier régulier.</li>
+
+ <li>'<strong>-s</strong>' (est un fichier régulier d'une
+ certaine taille - <strong>s</strong>ize)<br />
+ Traite <em>chaîne de test</em> comme un chemin et vérifie
+ s'il existe ou pas, et s'il s'agit d'un fichier régulier
+ dont la taille est supérieure à zéro.</li>
+
+ <li>'<strong>-l</strong>' (est un
+ <strong>l</strong>ien symbolique)<br />
+ Traite <em>chaîne de test</em> comme un chemin et vérifie
+ s'il existe ou pas, et s'il s'agit d'un lien
+ symbolique.</li>
+
+ <li>'<strong>-x</strong>' (a le droit
+ d'e<strong>x</strong>écution)<br />
+ Traite <em>chaîne de test</em> comme un chemin et vérifie
+ s'il existe ou pas, et a le droit d'exécution. Ce droit est
+ déterminé en accord avec le système d'exploitation
+ sous-jacent.</li>
+
+ <li>'<strong>-F</strong>' (test de l'existence d'un fichier
+ via une sous-requête)<br />
+ Vérifie si <em>chaîne de test</em> est un fichier valide,
+ accessible à travers tous les contrôles d'accès du serveur
+ actuellement configurés pour ce chemin. C'est une
+ sous-requête interne qui effectue cette vérification - à
+ utiliser avec précautions car les performances du serveur
+ peuvent s'en trouver affectées !</li>
+
+ <li>'<strong>-U</strong>' (test de l'existence d'une
+ <strong>U</strong>RL via une sous-requête)<br />
+ Vérifie si <em>chaîne de test</em> est une URL valide,
+ accessible à travers tous les contrôles d'accès du serveur
+ actuellement configurés pour ce chemin. C'est une
+ sous-requête interne qui effectue cette vérification - à
+ utiliser avec précautions car les performances du serveur
+ peuvent s'en trouver affectées !</li>
+ </ul>
+
+<note><title>Note :</title>
+ Tous ces tests peuvent aussi être préfixés par un point
+ d'exclamation ('!') pour inverser leur signification.
+</note>
+ </li>
+
+ <li>Vous pouvez aussi définir certains drapeaux pour
+ l'<em>expression de comparaison</em> en ajoutant ces
+ <strong><code>[</code><em>drapeaux</em><code>]</code></strong>
+ comme troisième argument de la directive
+ <code>RewriteCond</code>, où <em>drapeaux</em> est un
+ sous-ensemble séparé par des virgules des drapeaux suivants :
+
+ <ul>
+ <li>'<strong><code>nocase|NC</code></strong>'
+ (<strong>n</strong>o <strong>c</strong>ase)<br />
+ Rend le test insensible à la casse - il n'est pas fait de
+ distinction entre majuscules et minuscules, à la fois dans le
+ développement de <em>chaîne de test</em> et dans
+ <em>expression de comparaison</em>. Ce drapeau n'est pris en
+ compte que lors d'une comparaison entre <em>chaîne de test</em>
+ et <em>expression de comparaison</em>. Il ne l'est pas pour les
+ vérification par sous-requêtes ou sur le système de
+ fichiers.</li>
+
+ <li>
+ '<strong><code>ornext|OR</code></strong>'
+ (<strong>ou</strong> condition suivante)<br />
+ Permet de chaîner les conditions de règles avec un OU au
+ lieu du AND implicite. Exemple typique :
+
+<example>
+<pre>
+RewriteCond %{REMOTE_HOST} ^hote1.* [OR]
+RewriteCond %{REMOTE_HOST} ^hote2.* [OR]
+RewriteCond %{REMOTE_HOST} ^hote3.*
+RewriteRule ...règles concernant tous ces hôtes...
+</pre>
+</example>
+
+ Sans ce drapeau, les paires
+ condition/règle devraient être écrites trois fois.
+ </li>
+
+ <li>'<strong><code>novary|NV</code></strong>'
+ (<strong>n</strong>o <strong>v</strong>ary)<br />
+ Si la condition contient un en-tête HTTP, ce drapeau empêche
+ ce dernier d'être ajouté à l'en-tête Vary de la réponse. <br />
+ L'utilisation de ce drapeau peut provoquer une mise en cache
+ incorrecte de la réponse, si la représentation de cette réponse
+ varie avec la valeur de l'en-tête considéré. Ce drapeau ne
+ devrait donc être utilisé que si l'on maîtrise parfaitement le
+ fonctionnement de l'en-tête Vary.
+ </li>
+ </ul>
+ </li>
+ </ol>
+
+ <p><strong>Exemple :</strong></p>
+
+ <p>Pour réécrire la page d'accueil d'un site en fonction de
+ l'en-tête ``<code>User-Agent:</code>'' de la requête, vous
+ pouvez utiliser ce qui suit : </p>
+
+<example>
+<pre>
+RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
+RewriteRule ^/$ /homepage.max.html [L]
+
+RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
+RewriteRule ^/$ /homepage.min.html [L]
+
+RewriteRule ^/$ /homepage.std.html [L]
+</pre>
+</example>
+
+ <p>Explications : si vous utilisez un navigateur
+ (Netscape Navigator, Mozilla etc) qui s'identifie comme
+ 'Mozilla', vous accèderez à la page d'accueil max (qui
+ peut contenir des frames, ou d'autres ressources
+ particulières).
+ Si vous utilisez le navigateur Lynx (qui est un navigateur
+ en mode texte), vous accèderez à une page d'accueil min
+ (qui peut être une version conçue pour une navigation simple
+ basée sur le texte).
+ Si aucune de ces conditions n'est satisfaite (vous utilisez tout
+ autre navigateur, ou votre navigateur s'identifie de manière non
+ standard), vous accèderez à la page d'accueil std
+ (standard).</p>
+
+</usage>
+
+</directivesynopsis>
+
+<directivesynopsis>
+<name>RewriteRule</name>
+<description>Définit les règles pour le moteur de réécriture</description>
+<syntax>RewriteRule
+ <em>Modèle</em> <em>Substitution</em> [<em>drapeaux</em>]</syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+<context>directory</context><context>.htaccess</context></contextlist>
+<override>FileInfo</override>
+
+<usage>
+ <p>La directive <directive>RewriteRule</directive> est le
+ véritable cheval de trait de la réécriture. La directive peut
+ apparaître plusieurs fois, chaque instance définissant une
+ règle de réécriture particulière. L'ordre dans lequel ces règles
+ sont définies est important - il s'agit de l'ordre dans lequel
+ les règles seront appliquées au cours du processus de
+ réécriture.</p>
+
+ <p><a id="patterns" name="patterns"><em>Modèle</em></a> est une
+ <a id="regexp" name="regexp">expression rationnelle</a>
+ compatible perl. Dans la première règle de réécriture,
+ l'expression est comparée au (%-encoded)
+ <a href="./directive-dict.html#Syntax">chemin de l'URL</a> de la
+ requête ; les expressions suivantes sont comparées à la sortie de
+ la dernière règle de réécriture qui a été appliquée.</p>
+
+<note><title>Qu'est-ce qui est comparé ?</title>
+ <p>Le <em>Modèle</em> est d'abord comparé à la partie
+ de l'URL après le nom d'hôte et le port, et avant la chaîne de
+ requête. Si vous souhaitez faire une comparaison sur le nom
+ d'hôte, le port, ou la chaîne de requête, utilisez une
+ directive <directive module="mod_rewrite">RewriteCond</directive>
+ comportant les variables
+ <code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, ou
+ <code>%{QUERY_STRING}</code>.</p>
+</note>
+
+ <p>Pour quelques conseils à propos des <glossary
+ ref="regex">expressions rationnelles</glossary>, voir le
+ document <a
+ href="../rewrite/rewrite_intro.html#regex">Introduction à
+ mod_rewrite</a>.</p>
+
+ <p>Dans mod_rewrite, on peut aussi utiliser le caractère NON
+ ('<code>!</code>') comme préfixe de modèle. Ceci vous permet
+ d'inverser la signification d'un modèle, soit pour dire
+ ``<em>si l'URL considérée ne correspond <strong>PAS</strong> à
+ ce modèle</em>''. Le caractère NON peut donc être utilisé à
+ titre exceptionnel, lorsqu'il est plus simple d'effectuer une
+ comparaison avec le modèle inversé, ou dans la dernière règle
+ par défaut.</p>
+
+<note><title>Note</title>
+Si vous utilisez le caractère NON pour inverser la signification d'un
+modèle, vous ne pouvez pas inclure de parties génériques groupées dans
+le modèle. Ceci est dû au fait que, lorsque le modèle ne correspond
+pas (autrement dit, sa négation correspond), les groupes sont vides.
+Ainsi, si vous utilisez des modèles inversés, vous ne pouvez
+pas vous référer aux groupes par <code>$N</code> dans la chaîne de
+substitution !
+</note>
+
+ <p>Dans une règle de réécriture,
+ <a id="rhs" name="rhs"><em>Substitution</em></a> est la chaîne
+ de caractères qui remplace le chemin de l'URL original qui
+ correspondait au <em>Modèle</em>. <em>Substitution</em> peut
+ être :</p>
+
+ <dl>
+
+ <dt>un chemin du système de fichiers</dt>
+
+ <dd>Il indique alors la localisation dans le système de
+ fichiers de la ressource qui doit être envoyée au client.</dd>
+
+ <dt>chemin d'URL</dt>
+
+ <dd>Un chemin relatif à la valeur de <directive
+ module="core">DocumentRoot</directive> vers la ressource qui
+ doit être servie. Notez que <module>mod_rewrite</module>
+ essaie de deviner si vous avez spécifié un chemin du système
+ de fichiers ou un chemin d'URL en vérifiant si la première
+ partie du chemin existe à la racine du système de fichiers.
+ Par exemple, si vous avez spécifié comme chaîne de
+ <em>Substitution</em> <code>/www/file.html</code>, cette
+ dernière sera traitée comme un chemin d'URL <em>à moins</em>
+ qu'un répertoire nommé <code>www</code> n'existe à la racine
+ de votre système de fichiers, auquel cas la chaîne de
+ substitution sera traitée comme un chemin du système de
+ fichiers. Si vous désirez que d'autres directives de
+ correspondance d'URL (comme la directive <directive
+ module="mod_alias">Alias</directive>) soient appliquées au
+ chemin d'URL résultant, utilisez le drapeau <code>[PT]</code>
+ comme décrit ci-dessous.</dd>
+
+ <dt>URL absolue</dt>
+
+ <dd>Si une URL absolue est spécifiée,
+ <module>mod_rewrite</module> vérifie si le nom d'hôte
+ correspond à celui de l'hôte local. Si c'est le cas, le
+ protocole et le nom d'hôte sont supprimés, et ce qui reste est
+ traité comme un chemin d'URL. Dans le cas contraire, une
+ redirection externe vers l'URL indiquée est effectuée. Pour
+ forcer une redirection externe vers l'hôte local, voir le
+ drapeau <code>[R]</code> ci-dessous.</dd>
+
+ <dt><code>-</code> (tiret)</dt>
+
+ <dd>Un tiret indique qu'aucune substitution ne doit être
+ effectuée (le chemin considéré est transmis sans changement).
+ Ceci est utile quand un drapeau doit être appliqué sans
+ modifier le chemin (voir ci-dessous).</dd>
+
+ </dl>
+
+ <p>En plus du texte, la chaîne <em>Substition</em> peut
+ comporter :</p>
+
+ <ol>
+ <li>des références arrières (<code>$N</code>) vers le modèle
+ d'une directive RewriteRule</li>
+
+ <li>des références arrières (<code>%N</code>) vers le dernier
+ modèle d'une directive RewriteCond qui correspondait</li>
+
+ <li>des variables du serveur comme dans les chaînes de test de
+ condition d'une règle (<code>%{VARNAME}</code>)</li>
+
+ <li>des appels de
+ <a href="#mapfunc">fonctions de comparaison</a>
+ (<code>${nom correspondance:clé|défaut}</code>)</li>
+ </ol>
+
+ <p>Les références arrières sont des identificateurs de la forme
+ <code>$</code><strong>N</strong> (<strong>N</strong>=0..9), qui
+ seront remplacés par le contenu du <strong>N</strong>ème groupe
+ du <em>Modèle</em> qui correspondait. Les variables du serveur
+ sont les mêmes que dans la <em>Chaîne de test</em> d'une
+ directive <code>RewriteCond</code>. Les fonctions de comparaison
+ sont issues de la directive <code>RewriteMap</code> dans la
+ section de laquelle elles sont décrites. Ces trois types de
+ variables sont évaluées dans l'ordre ci-dessus.</p>
+
+ <p>Comme mentionné précédemment, toutes les règles de
+ réécriture sont appliquées à la chaîne de <em>Substitution</em>
+ (selon l'ordre dans lequel elles sont définies dans le fichier
+ de configuration). L'URL est <strong>intégralement
+ remplacée</strong> par la chaîne de <em>Substitution</em> et le
+ processus de réécriture se poursuit jusqu'à ce que toutes les
+ règles aient été appliquées, ou qu'il soit explicitement stoppé
+ par un drapeau <code><strong>L</strong></code>.</p>
+
+ <note><title>Modifier la chaîne de requête</title>
+ <p>Par défaut, la chaîne de requête est transmise sans
+ modification. Vous pouvez cependant créer dans la chaîne de
+ substitution des URLs dont une partie constitue une chaîne de
+ requête. Pour cela, ajoutez simplement un point d'interrogation
+ dans la chaîne de substitution pour indiquer que le texte qui
+ suit doit être réinjecté dans la chaîne de requête. Pour
+ supprimer une chaîne de requête, terminez simplement la chaîne de
+ substitution par un point d'interrogation. Pour combiner les
+ nouvelles chaînes de requête avec les anciennes, utilisez le
+ drapeau <code>[QSA]</code>.</p>
+ </note>
+
+
+ <p>En outre, vous pouvez spécifier des <a name="rewriteflags"
+ id="rewriteflags">actions</a> spéciales à effectuer en ajoutant
+ des
+ <strong><code>[</code><em>drapeaux</em><code>]</code></strong>
+ comme troisième argument de la directive
+ <code>RewriteRule</code>. Séparés par des virgules au sein d'une
+ liste encadrée par des crochets, les <em>drapeaux</em> peuvent
+ être choisis parmi les suivants : </p>
+
+ <dl>
+ <dt>'<code>B</code>' (références arrière échappées)</dt>
+ <dd><p>Les URLs ne doivent pas être échappées pour pouvoir être
+ comparées par Apache, si bien que les références arrières
+ renverront une valeur non échappée au moment où elles seront
+ appliquées. En utilisant le drapeau B, les caractères non
+ alphanumériques des références arrières seront echappés. Par
+ exemple, considérons la règle :</p>
+ <example>
+ RewriteRule ^(/.*)$ /index.php?show=$1
+ </example>
+ <p>Elle va faire correspondre <code>/C++</code> à
+ <code>index.php?show=/C++</code>. Mais elle va aussi faire
+ correspondre <code>/C%2b%2b</code> à
+ <code>/index.php?show=/C++</code>, car le caractère
+ <code>%2b</code> n'a pas été échappé. Par contre, avec le
+ drapeau B, la substitution s'effectuera vers
+ <code>/index.php?show=/C%2b%2b</code>.</p>
+ <p>Ce processus d'échappement est particulièrement nécessaire
+ dans le contexte du mandataire, où l'adresse d'arrière-plan ne
+ fonctionnera pas si elle se présente sous une forme
+ non échappée.</p>
+ </dd>
+
+ <dt>'<code>chain|C</code>'
+ (chaînage avec la règle suivante)</dt><dd>
+ Ce drapeau effectue un chaînage entre la règle courante et la
+ suivante (qui peut elle-même être chaînée avec la suivante, et
+ ainsi de suite). Ceci provoque l'effet suivant : si une règle
+ correspond, le processus continue normalement - le drapeau n'a
+ aucun effet. Si la règle ne correspond <strong>pas</strong>,
+ toutes les règles chaînées suivantes sont ignorées. Par
+ exemple, ce drapeau peut être utilisé pour supprimer la
+ partie ``<code>.www</code>'', dans un jeu de règles au niveau
+ du répertoire, lorsque vous faites intervenir une redirection
+ externe (où la partie ``<code>.www</code>'' ne doit pas
+ figurer !).</dd>
+
+ <dt>'<code>cookie|CO=</code><em>NOM</em>:<em>VAL</em>:<em>domaine</em>[:<em>durée
+ de vie</em>[:<em>chemin</em>[:<em>sécurité</em>[:<em>http
+ seulement</em>]]]]'
+ (définit un cookie)</dt><dd>
+ Ce drapeau définit un cookie au niveau du navigateur du client.
+ Le nom du cookie est spécifié par <em>NOM</em>, et sa valeur
+ par <em>VAL</em>. Le champ <em>domaine</em> est le domaine du
+ cookie, comme '.apache.org', le champ optionnel
+ <em>durée de vie</em> est la durée de vie du cookie en minutes
+ (0 signifie que le cookie expire à la fin de la session),
+ et le champ optionnel <em>chemin</em> le chemin du cookie. Si
+ <em>sécurité</em> est défini à 'secure, 'true' ou '1', le cookie ne peut
+ être transmis que par une connexion sécurisée. Si <em>http
+ seulement</em> est défini à ''HttpOnly', 'true' ou '1', le
+ drapeau <code>HttpOnly</code> est utilisé, ce qui rend le cookie
+ inaccessible au code JavaScript sur les navigateurs qui
+ supportent ce dernier.</dd>
+
+ <dt>'<code>discardpathinfo|DPI'
+ (ne pas tenir compte de PATH_INFO)</code></dt><dd>
+ <p>Dans un contexte de répertoire, l'URI par rapport auquel
+ chaque règle <directive>RewriteRule</directive> effectue ses
+ comparaisons est la concaténation de la valeur courante de l'URI
+ et de PATH_INFO.</p>
+
+ <p>L'URI courant est soit l'URI initial tel qu'envoyé par le
+ client, soit le résultat d'un passage à travers le processus de
+ réécriture, soit le résultat de la règle précédente du processus
+ de réécriture courant.</p>
+
+ <p>Par contre, PATH_INFO qui est ajouté à l'URI avant chaque
+ règle reflète la valeur qu'avait PATH_INFO avant le processus de
+ réécriture. En conséquence, si de larges parties de l'URI sont
+ retenues et copiées dans une chaîne de substitution au cours de
+ multiples directives <directive>RewriteRule</directive>, et ceci
+ sans tenir compte de la part qui revient à PATH_INFO dans l'URI,
+ il se peut que l'URI final se voit ajouter plusieurs copies de
+ PATH_INFO.</p>
+
+ <p>Utilisez ce drapeau dans toute substitution où le PATH_INFO
+ résultant de la mise en correspondance précédente de cette
+ requête avec le système de fichiers ne présente pas d'intérêt.
+ Ce drapeau indique qu'il ne faut pas tenir compte du PATH_INFO
+ construit avant que le processus de réécriture courant ait
+ commencé. PATH_INFO ne sera pas recalculé avant que le processus
+ de réécriture courant se termine. Les règles suivantes
+ rencontrées au cours du processus ne verront que le résultat
+ direct des substitutions, sans ajout du PATH_INFO.</p></dd>
+
+ <dt>
+ '<code>env|E=</code><em>VAR</em>:<em>VAL</em>'
+ (définit une variable d'environnement)</dt><dd>
+ Ce drapeau force une variable d'environnement nommée
+ <em>VAR</em> à prendre la valeur <em>VAL</em>, où
+ <em>VAL</em> peut contenir des références arrières vers des
+ expressions rationnelles (<code>$N</code> et <code>%N</code>)
+ qui seront évaluées. Vous pouvez utiliser ce drapeau plusieurs
+ fois pour définir plusieurs variables. Les variables peuvent
+ ensuite être déréférencées dans de nombreux cas, et le plus
+ souvent depuis XSSI (via <code><!--#echo
+ var="VAR"--></code>) ou CGI (<code>$ENV{'VAR'}</code>).
+ Vous pouvez déréférencer la variable dans un modèle de
+ directive RewriteCond ultérieure, en utilisant
+ <code>%{ENV:VAR}</code>. Ce drapeau permet de supprimer
+ des informations d'une URL, tout en conservant la trace de
+ ces informations.</dd>
+
+ <dt>'<code>forbidden|F</code>' (force l'interdiction d'une
+ URL)</dt><dd>
+ Ce drapeau force l'interdiction de l'URL courante - il renvoie
+ immédiatement une réponse HTTP 403 (FORBIDDEN). Ce drapeau,
+ associé à des directives RewriteCond appropriées, permet de
+ bloquer de manière conditionnelle certaines URLs.</dd>
+
+ <dt>'<code>gone|G</code>' (signale la non-existence d'une
+ URL)</dt><dd>
+ Ce drapeau signale la non-existence d'une URL - il renvoie
+ immédiatement une réponse HTTP 410 (GONE). Il permet de marquer
+ les pages qui n'existent plus comme "gone".</dd>
+
+ <dt>
+ '<code>handler|H</code>=<em>Gestionnaire de contenu</em>'
+ (impose un gestionnaire de contenu)</dt><dd>
+ Impose <em>Gestionnaire de contenu</em> comme gestionnaire de
+ contenu pour le fichier cible. Ce drapeau permet par exemple
+ de simuler la directive
+ <directive module="mod_alias">ScriptAlias</directive> du
+ module <module>mod_alias</module>, qui impose en interne le
+ gestionnaire ``<code>cgi-script</code>'' à tous les fichiers
+ du répertoire correspondant.<br />
+ Dans un contexte de niveau répertoire, aucune substitution ne
+ doit modifier le chemin. N'utilisez ce drapeau dans un contexte
+ de répertoire qu'avec <code>-</code> (tiret) comme
+ substitution, faute de quoi la requête echouera.</dd>
+
+ <dt>'<code>last|L</code>'
+ (dernière règle)</dt><dd>
+ Termine le processus de réécriture ici et n'applique plus
+ aucune règle de réécriture. Ce drapeau est équivalent à la
+ commande Perl <code>last</code> ou la commande C
+ <code>break</code>. Il permet d'éviter la réécriture par les
+ règles suivantes d'une URL déjà réécrite. Rappelez-vous
+ cependant que si une directive
+ <directive>RewriteRule</directive> génère une redirection
+ interne (ce qui arrive fréquemment lors d'une réécriture dans
+ un contexte de répertoire), la requête sera réinjectée et le
+ processus de réécriture sera réitéré à partir de la
+ première directive <directive>RewriteRule</directive>.</dd>
+
+ <dt>'<code>next|N</code>'
+ (prochain round)</dt><dd>
+ Relance le processus de réécriture (toujours à partir de la
+ première règle). Cette fois, l'URL à comparer n'est plus l'URL
+ originale, mais plutôt l'URL renvoyée par la dernière règle de
+ réécriture. Ce drapeau est équivalent à la commande Perl
+ <code>next</code> ou la commande C <code>continue</code>. Il
+ permet de redémarrer le processus de réécriture - en se
+ positionnant immédiatement au niveau de la première règle.
+ <strong>Prenez garde à ne pas créer de bouclage
+ infini !</strong></dd>
+
+ <dt>'<code>nocase|NC</code>'
+ (insensible à la casse)</dt><dd>
+ Ce drapeau rend le <em>Modèle</em> insensible à la casse,
+ c'est à dire ne tenant pas compte des majuscules/minuscules
+ lorsque le <em>Modèle</em> est comparé avec l'URL
+ courante.</dd>
+
+ <dt>
+ '<code>noescape|NE</code>'
+ (pas d'échappement de l'URI en sortie)</dt><dd>
+ Ce drapeau empêche mod_rewrite d'appliquer les règles
+ d'échappement d'URI usuelles au résultat d'une réécriture.
+ Normalement, les caractère spéciaux (comme '%', '$', ';',
+ etc...) sont échappés en leurs équivalents hexadécimaux
+ (respectivement '%25', '%24', et '%3B') ; ce drapeau empêche
+ cela de se produire. Il permet au symbole '%' d'apparaître
+ en sortie, comme dans
+<example>
+ RewriteRule ^/foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
+</example>
+ qui remplacerait '<code>/foo/zed</code>' par la requête plus
+ sure '<code>/bar?arg=P1=zed</code>'.
+ </dd>
+
+ <dt>
+ '<code>nosubreq|NS</code>'
+ (sous-requêtes non concernées)</dt><dd>
+ <p>Si ce drapeau est présent, le moteur de réécriture
+ n'applique pas la règle si la requête courante est une
+ sous-requête interne. Par exemples, des sous-requêtes sont
+ générées en interne par Apache lorsque
+ <module>mod_dir</module> essaie de trouver des
+ informations à propos d'éventuels fichiers de répertoire par
+ défaut (fichiers <code>index.xxx</code>). Dans le cas d'une
+ sous-requête, ce n'est pas toujours utile, et peut même
+ provoquer des erreurs si l'ensemble du jeu de règles est
+ appliqué. Ce drapeau permet d'exclure certaines règles.</p>
+ <p>Pour déterminer si l'on doit appliquer une règle ou pas,
+ si une URL est préfixée par un script CGI, pour forcer son
+ traitement par le script CGI, vous allez probablement
+ rencontrer des problèmes (ou tout du moins une surcharge
+ significative) avec les sous-requêtes. Dans ce cas,
+ utilisez ce drapeau</p>
+ </dd>
+
+ <dt>
+ '<code>proxy|P</code>' (impose le mandataire)</dt><dd>
+ Ce drapeau force l'envoi de la partie substitution en
+ interne en tant que requête mandataire, et (le processus de
+ réécriture s'arrête ici) son envoi immédiat vers le <a
+ href="mod_proxy.html">module proxy</a>. Vous devez vous
+ assurer que la chaîne de substitution est un URI valide
+ (débutant typiquement par
+ <code>http://</code><em>nom d'hôte</em>) pouvant être traitée
+ par le module proxy d'Apache. Si ce n'est pas le cas, le
+ module proxy vous renverra une erreur. Utilisez ce drapeau
+ pour implémenter de manière plus puissante la directive <a
+ href="mod_proxy.html#proxypass">ProxyPass</a>, pour mettre
+ en correspondance un contenu distant dans l'espace de
+ nommage du serveur local.
+
+ <p>Note: <module>mod_proxy</module> doit être activé pour
+ pouvoir utiliser ce drapeau..</p>
+ </dd>
+
+ <dt>
+ '<code>passthrough|PT</code>'
+ (passage au gestionnaire suivant)</dt><dd>
+ Ce drapeau force le moteur de réécriture à affecter
+ la valeur du champ <code>filename</code> au
+ champ <code>uri</code> de la structure interne
+ <code>request_rec</code>. Ce drapeau n'est qu'une astuce
+ permettant un traitement supplémentaire de la sortie des
+ directives <code>RewriteRule</code>, en utilisant
+ <code>Alias</code>, <code>ScriptAlias</code>,
+ <code>Redirect</code>, ou d'autres directives en provenance
+ de divers traducteurs URI/nom de fichier. Par exemple, pour
+ réécrire <code>/abc</code> vers <code>/def</code> avec
+ <module>mod_rewrite</module>, puis <code>/def</code> vers
+ <code>/ghi</code> avec <module>mod_alias</module> :
+<example>
+ RewriteRule ^/abc(.*) /def$1 [PT]<br />
+ Alias /def /ghi
+</example>
+ Si le drapeau <code>PT</code> est omis,
+ <code>mod_rewrite</code> va réécrire
+ <code>uri=/abc/...</code> vers <code>filename=/def/...</code>
+ comme tout traducteur URI/nom de fichier compatible avec
+ l'API doit le faire. Puis, <code>mod_alias</code> va tenter
+ une transition URI vers nom de fichier, et va échouer.
+
+ <p>Note: <strong>Vous devez utiliser ce drapeau si vous
+ voulez mélanger des directives en provenance de différents
+ modules qui effectuent une traduction
+ URL/nom de fichier</strong>. Un exemple typique est
+ l'utilisation conjointe de <module>mod_alias</module> et de
+ <module>mod_rewrite</module>.</p>
+
+ <p>Le drapeau <code>PT</code> rend implicite la présence du
+ drapeau <code>L</code> flag : la réécriture sera stoppée afin
+ de transmettre la requête à la phase suivante du
+ traitement.</p>
+ </dd>
+
+ <dt>'<code>qsappend|QSA</code>'
+ (ajout d'une chaîne de requête - query string)</dt><dd>
+ Ce drapeau force le moteur de réécriture à ajouter la chaîne
+ de substitution à la chaîne de requête au lieu de remplacer
+ cette dernière par la chaîne de substitution.
+ Vous pouvez ainsi ajouter des données à la chaîne de requête
+ via une règle de réécriture.</dd>
+
+ <dt>'<code>redirect|R</code>
+ [=<em>code</em>]' (force une <a id="redirect"
+ name="redirect">redirection</a>)</dt><dd>
+ <p>Préfixe la <em>chaîne de substitution</em> par
+ <code>http://hôte[:port]/</code> (ce qui fait de la nouvelle
+ URL un URI) pour forcer une redirection externe. Si aucun
+ <em>code</em> n'est défini, une réponse HTTP 302 (MOVED
+ TEMPORARILY) sera renvoyée. Si vous voulez renvoyer un autre
+ code de réponse, spécifiez simplement le nombre approprié ou
+ utilisez un des noms symboliques suivants : <code>temp</code>
+ (défaut), <code>permanent</code> ou <code>seeother</code>.
+ Vous pouvez utiliser ce drapeau pour que les règles mettent
+ l'URL sous forme canonique et la renvoient au client, pour
+ traduire ``<code>/~</code>'' en ``<code>/u/</code>'', ou pour
+ ajouter systématiquement un slash à
+ <code>/u/</code><em>utilisateur</em>, etc...<br />
+ <strong>Note:</strong> Si vous utilisez ce drapeau,
+ assurez-vous que le champ de substitution est une URL
+ valide ! Si ce n'est pas le cas, vous serez redirigé vers
+ une URL invalide. Souvenez-vous que, s'il est seul, ce
+ drapeau va seulement préfixer l'URL par
+ <code>http://hôte[:port]/</code>, et que le processus de
+ réécriture va se poursuivre. En général, vous voudrez plutôt
+ stopper la réécriture à ce point, et rediriger immédiatement.
+ Pour stopper la réécriture, vous pouvez ajouter le drapeau
+ 'L'.</p>
+ <p>Bien qu'on utilise en général ce drapeau pour les
+ redirections, on peut spécifier tout code de statut valide.
+ Si le code de statut est en dehors de la gamme des codes de
+ redirection (300-399), la chaîne de <em>Substitution</em> est
+ supprimée et le processus de réécriture stoppé comme si le
+ drapeau <code>L</code> était présent.</p>
+ </dd>
+
+ <dt>'<code>skip|S</code>=<em>num</em>'
+ (saute la/les règle(s) suivantes)</dt><dd>
+ Ce drapeau force le moteur de réécriture à sauter les
+ <em>num</em> règles consécutives suivantes, si la règle courante
+ s'applique. Il permet de simuler une structure if-then-else : la
+ dernière règle du bloc "then" devient <code>skip=N</code>, où N
+ est le nombre de règles contenues dans le bloc "else" (ce qui est
+ un comportement différent de celui du drapeau 'chain|C' !).</dd>
+
+ <dt>
+ '<code>type|T</code>=<em>type MIME</em>'
+ (force le type MIME)</dt><dd>
+ Force le <glossary>type MIME</glossary> du fichier cible à
+ <em>type MIME</em>. Ceci permet de définir le type de contenu
+ en fonction de certaines conditions.
+ Dans un contexte de répertoire, utilisez exclusivement
+ <code>-</code> (tiret) comme substitution, faute de quoi le
+ type MIME défini à l'aide de ce drapeau sera perdu à cause d'un
+ rejeu du traitement en interne.</dd>
+ </dl>
+
+
+<note><title>Développement du répertoire home</title>
+<p> Quand la chaîne de substitution commence par quelque chose comme
+"/~user" (de manière explicite ou par références arrières), mod_rewrite
+développe le répertoire home sans tenir compte de la présence ou de la
+configuration du module <module>mod_userdir</module>.</p>
+
+<p> Ce développement n'est pas effectué si le drapeau <em>PT</em> est
+utilisé dans la directive <directive module="mod_rewrite">RewriteRule</directive></p>
+</note>
+
+<note><title>Réécritures dans le contexte de répertoire</title>
+
+<p>Le moteur de réécriture peut être utilisé dans les fichiers <a
+href="../howto/htaccess.html">.htaccess</a>. Pour activer le moteur de
+réécriture pour ces fichiers, vous devez préciser "<code>RewriteEngine
+On</code>" <strong>et</strong> "<code>Options FollowSymLinks</code>"
+doit être activé. Si votre administrateur a interdit la surcharge de
+<code>FollowSymLinks</code> pour un répertoire utilisateur, vous ne
+pouvez pas utiliser le moteur de réécriture. Cette restriction est
+nécessaire pour des raisons de sécurité.</p>
+
+<p>Lorsqu'on utilise le moteur de réécriture dans les fichiers
+<code>.htaccess</code>, le préfixe du répertoire (qui est
+toujours le même pour un répertoire donné) est automatiquement
+<em>supprimé</em> pour la comparaison du modèle et automatiquement
+<em>ajouté</em> une fois la substitution effectuée. Cette fonctionnalité
+est nécessaire pour de nombreux cas de réécriture ; sans elle, vous
+seriez obligé de tenir compte du répertoire parent pour la comparaison,
+ce qui n'est pas toujours
+possible. Il y a une exception : si une chaîne de substitution commence
+par <code>http://</code>, le préfixe du répertoire ne sera
+<strong>pas</strong> ajouté, et une redirection externe (ou le passage
+par un mandataire, si le drapeau <strong>P</strong> est utilisé) sera
+initiée. Voir la directive <directive
+module="mod_rewrite">RewriteBase</directive> pour plus de détails.</p>
+
+<p>Le moteur de réécriture peut aussi être utilisé dans les sections
+<directive type="section" module="core">Directory</directive> avec les
+mêmes règles de comparaison des préfixes que celles qui s'appliquent
+pour les fichiers <code>.htaccess</code>. Cependant, il est en général
+plus simple, pour éviter la complication des substitutions de préfixes,
+de définir les règles de réécriture dans le contexte du serveur
+principal ou des hôtes virtuels, plutôt que dans une section
+<directive type="section" module="core">Directory</directive>.</p>
+
+<p>Bien que du point de vue syntaxique, il soit permis de définir des
+règles de réécriture dans les sections <directive type="section"
+module="core">Location</directive> et <directive
+type="section" module="core">Files</directive>, ce n'est à priori
+d'aucune utilité et n'est pas supporté.</p>
+
+</note>
+
+ <p>Voici toutes les combinaisons de substitution et leurs
+ significations :</p>
+
+ <p><strong>Dans la configuration au niveau du serveur principal
+ (<code>httpd.conf</code>)<br />
+ pour la requête ``<code>GET
+ /chemin/infochemin</code>'':</strong><br />
+ </p>
+
+<note><pre>
+<strong>Règle</strong> <strong>Résultat de la substitution</strong>
+---------------------------------------------- ----------------------------------
+^/chemin(.*) autre-chemin$1 non valide, non supporté
+
+^/chemin(.*) autre-chemin$1 [R] non valide, non supporté
+
+^/chemin(.*) autre-chemin$1 [P] non valide, non supporté
+---------------------------------------------- ----------------------------------
+^/chemin(.*) /autre-chemin$1 /autre-chemin/infochemin
+
+^/chemin(.*) /autre-chemin$1 [R] http://cet-hôte/autre-chemin/infochemin
+ via redirection externe
+
+^/chemin(.*) /autre-chemin$1 [P] n'a pas lieu d'être, non supporté
+---------------------------------------------- ----------------------------------
+^/chemin(.*) http://cet-hôte/autre-chemin$1 /autre-chemin/infochemin
+
+^/chemin(.*) http://cet-hôte/autre-chemin$1 [R] http://cet-hôte/autre-chemin/infochemin
+ via redirection externe
+
+^/chemin(.*) http://cet-hôte/autre-chemin$1 [P] n'a pas lieu d'être, non supporté
+---------------------------------------------- ----------------------------------
+^/chemin(.*) http://autre hôte/autre-chemin$1 http://autre hôte/autre-chemin/infochemin
+ via redirection externe
+
+^/chemin(.*) http://autre hôte/autre-chemin$1 [R] http://autre hôte/autre-chemin/infochemin
+ via redirection externe
[... 54 lines stripped ...]