<p><span>Langues Disponibles: </span><a href="../en/mod/mod_dbd.html" hreflang="en" rel="alternate" title="English"> en </a> |
<a href="../fr/mod/mod_dbd.html" title="Français"> fr </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Gestion des connexions à une base de données SQL</td></tr>
<tr><th><a href="module-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Identificateur de Module:</a></th><td>dbd_module</td></tr>
<variants>
<variant>en</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
</variants>
</metafile>
<p><span>Langues Disponibles: </span><a href="../en/mod/mod_heartmonitor.html" hreflang="en" rel="alternate" title="English"> en </a> |
<a href="../fr/mod/mod_heartmonitor.html" title="Français"> fr </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Moniteur centralisé pour les serveurs d'origine mod_heartbeat</td></tr>
<tr><th><a href="module-dict.html#Status">Statut:</a></th><td>Expérimental</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Identificateur de Module:</a></th><td>heartmonitor_module</td></tr>
contrôler la quantité de mémoire partagée allouée pour le stockage
des données heartbeat lorsqu'on utilise
<code class="module"><a href="../mod/mod_slotmem_shm.html">mod_slotmem_shm</a></code>.</p>
- <p>Pour utiliser un stockage de type fichier bidimensionnel (flat-file)
- lorque le module <code class="module"><a href="../mod/mod_slotmem_shm.html">mod_slotmem_shm</a></code> n'est pas chargé, cette
- directive doit être définie à 0. La valeur doit être soit égale à 0, soit
- supérieure ou égale à 10.</p>
+
+ <p>Définissez cette directive à <code>0</code> pour utiliser un stockage de
+ type fichier bidimensionnel (flat-file) au lieu de la mémoire partagée
+ (c’est-à-dire sans charger <code class="module"><a href="../mod/mod_slotmem_shm.html">mod_slotmem_shm</a></code>). Lorsqu’on
+ utilise la mémoire partagée, la valeur doit être supérieure ou égale à 10.</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<variants>
<variant>en</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
</variants>
</metafile>
<a href="../fr/mod/mod_proxy.html" title="Français"> fr </a> |
<a href="../ja/mod/mod_proxy.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Serveur mandataire/passerelle multi-protocole</td></tr>
<tr><th><a href="module-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Identificateur de Module:</a></th><td>proxy_module</td></tr>
<variants>
<variant>en</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
</variants>
</metafile>
<p><span>Langues Disponibles: </span><a href="../en/mod/mod_rewrite.html" hreflang="en" rel="alternate" title="English"> en </a> |
<a href="../fr/mod/mod_rewrite.html" title="Français"> fr </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Ce module fournit un moteur de réécriture à base de
règles permettant de réécrire les URLs des requêtes
à la volée</td></tr>
<p><code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> fournit une méthode souple et puissante
pour manipuler les URLs en utilisant un nombre illimité de règles. Chaque
règle peut être associée à un nombre illimité de conditions, afin de vous
- permettre de réécrire les URLs en fonction de variables du serveur, de
- variables d'environnement, de cookies, d'en-têtes HTTP, ou de repères
- temporels.</p>
- <p><code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> agit sur la totalité de l'URL, ou de toute
- partie de cette dernière, y compris PATH_INFO ou QUERY_STRING.</p>
-
+ permettre de réécrire les URLs en fonction de <a href="#rewritecond">variables du serveur</a> (y compris les en-têtes
+ HTTP, les détails de la connexion et les horodatages), de
+ variables d'environnement ou d’autres propriétés de la requête. Les règles
+ peuvent agir sur le <a href="directive-dict.html#Syntax">chemin d’URL</a>
+ (y compris toute <a href="core.html#acceptpathinfo">information en fin de
+ nom de chemin</a>) et peut aussi modifier la <a href="../expr.html#vars">chaîne de paramètres</a>.
+ </p>
+
<p>Une règle de réécriture peut être invoquée dans les fichiers de
- configuration globale du serveur ou dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>. Le chemin généré par
- une règle de réécriture peut inclure une chaîne de paramètres, ou peut
- renvoyer vers un traitement secondaire interne, une redirection vers une
- requête externe ou vers le mandataire interne.</p>
+ configuration globale du serveur ou dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>. La chaîne de
+ substitution d’une règle de réécriture peut comporter une chaîne de
+ paramètres et une règle peut renvoyer vers un traitement secondaire
+ interne, une redirection vers une requête externe ou vers le mandataire
+ interne.</p>
<p>Vous trouverez plus de détails, discussions et exemples dans le <a href="../rewrite/">Guide détaillé sur mod_rewrite</a>.</p>
</div>
<li><img alt="" src="../images/down.gif"> <a href="#rewriteoptions">RewriteOptions</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#rewriterule">RewriteRule</a></li>
</ul>
-<h3>Traitement des bugs</h3><ul class="seealso"><li><a href="https://www.apache.org/dist/httpd/CHANGES_2.4">Journal des modifications de httpd</a></li><li><a href="https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__open__&list_id=144532&product=Apache%20httpd-2&query_format=specific&order=changeddate%20DESC%2Cpriority%2Cbug_severity&component=mod_rewrite">Problèmes connus</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&component=mod_rewrite">Signaler un bug</a></li></ul></div>
+<h3>Traitement des bugs</h3><ul class="seealso"><li><a href="https://www.apache.org/dist/httpd/CHANGES_2.4">Journal des modifications de httpd</a></li><li><a href="https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__open__&list_id=144532&product=Apache%20httpd-2&query_format=specific&order=changeddate%20DESC%2Cpriority%2Cbug_severity&component=mod_rewrite">Problèmes connus</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&component=mod_rewrite">Signaler un bug</a></li></ul><h3>Voir aussi</h3>
+<ul class="seealso">
+<li><a href="rewrite/index.html">Guide de mod_rewrite</a></li>
+</ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="logging">Journalisation <a title="Lien permanent" href="#logging" class="permalink">¶</a></h2>
<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> vont probablement rechercher en vain les
directives <code>RewriteLog</code> et <code>RewriteLogLevel</code>. Depuis
la sortie de httpd 2.4, ces directives ont en effet été remplacées par une
- configuration de la journalisation par module à l'aide de la directive
+ configuration de la journalisation par module à l’aide de la directive
<code class="directive"><a href="../mod/core.html#loglevel">LogLevel</a></code>. </p>
<p>Pour extraire les traces spécifiques à
<code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> (c'est à
dire que pour y accéder, il n'est pas nécessaire d'utiliser
une directive telle qu'<code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code>).</li>
- <li>Le chemin de répertoire auquel la <code class="directive"><a href="#rewriterule">RewriteRule</a></code> s'applique, suffixé par
+ <li>Le chemin de répertoire auquel la <code class="directive"><a href="#rewriterule">RewriteRule</a></code> s’applique, suffixé par
la substitution relative est aussi valable en tant que chemin d'URL
sur le serveur (ce qui est rare).</li>
<li>A partir de la version 2.4.16 du serveur HTTP Apache,
la réécriture soit effectuée
</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code> RewriteCond
- <em>chaîne_de_test</em> <em>expression_de_comparaison</em> [<em>drapeaux</em>]</code></td></tr>
+ <em>TestString</em> [!]<em>CondPattern</em> [<em>flags</em>]</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>configuration globale, serveur virtuel, répertoire, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Surcharges autorisées:</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<strong>et</strong> si l'URI correspond au modèle spécifié dans la
règle.</p>
+ <p>Si <em>CondPattern</em> est préfixé par un <code>!</code>, la condition
+ ne sera évaluée à vrai que si <em>CondPattern</em> ne correspond pas.</p>
+
+
+
+
+
+ <p><a id="rewritecond-teststring" name="rewritecond-teststring"></a><strong>TestString</strong></p>
+
<p><em>TestString</em> est une chaîne qui peut contenir les
extensions suivantes en plus du texte simple :</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). $1 à $9
- permettent d'accéder aux parties regroupées (entre
- parenthèses) du modèle, issues de la <code>RewriteRule</code>
- concernée par le jeu de conditions <code>RewriteCond</code>
- courant. $0 donne accès à l'ensemble de la chaîne
- correspondant au modèle.</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> (0 <= N <= 9). %1 à %9
- permettent d'accéder aux parties regroupées (entre
- parenthèses) du modèle, issues de la dernière
- condition <code>RewriteCond</code> satisfaite du jeu de conditions <code>RewriteCond</code>
- courant. %0 donne accès à l'ensemble de la chaîne
- correspondant au modèle.</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 la <a>href="#mapfunc">documentation sur 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>NAME_OF_VARIABLE</em> <code>}</code></strong>,
- où <em>NOM_DE_VARIABLE</em> peut contenir une chaîne issue
- de la liste suivante :
+
+
+ <p><a id="rewritecond-backreferences" name="rewritecond-backreferences"></a><strong>Références arrières</strong></p>
+
+ <dl>
+ <dt><strong><code>$N</code></strong> — Références arrières des
+ règles RewriteRule</dt>
+ <dd>Les références arrières de la forme <code>$N</code> (0 <= N <=
+ 9). $1 à $9 permettent d'accéder aux parties regroupées (entre
+ parenthèses) du modèle, issues de la <code>RewriteRule</code> concernée
+ par le jeu de conditions <code>RewriteCond</code> courant. $0 donne
+ accès à l'ensemble de la chaîne correspondant au modèle.</dd>
+
+ <dt><strong><code>%N</code></strong> — Références arrières des
+ conditions RewriteCond</dt>
+ <dd>Les références arrières de la forme <code>%N</code> (0 <= N <=
+ 9). %1 à %9 permettent d'accéder aux parties regroupées (entre
+ parenthèses) du modèle, issues de la dernière condition
+ <code>RewriteCond</code> satisfaite du jeu de conditions
+ <code>RewriteCond</code> courant. %0 donne accès à l'ensemble de la
+ chaîne correspondant au modèle.</dd>
+
+ </dl>
+
+ <div class="note">Les références arrières ne sont définies que si le motif correspond.
+ Si le motif est préfixé de <code>!</code>, aucune référence arrière
+ ne sera donc définie. Voir le document <a href="../rewrite/tech.html#InternalRuleset">La manière dont le jeu de
+ règles est appliqué</a> pour plus de détails à propos de l’ordre dans
+ lequel les motifs sont mis en correspondance et les références arrières
+ définies.</div>
+
+
+
+ <p><a id="rewritecond-mapexpansions" name="rewritecond-mapexpansions"></a><strong>Développement des mappages RewriteMap</strong></p>
+
+ <p>Ce sont des développements de la forme
+ <strong><code>${mapname:key|default}</code></strong>. Voir la <a href="#mapfunc">documentation de RewriteMap</a> pour plus de détails.</p>
+
+
+
+ <p><a id="rewritecond-servervars" name="rewritecond-servervars"></a><strong>Le serveur et les variables CGI</strong></p>
+
+ <p>Ce sont des variables de la forme <strong><code>%{</code>
+ <em>NAME_OF_VARIABLE</em> <code>}</code></strong> où
+ <em>NAME_OF_VARIABLE</em> peut être une des chaînes de la liste suivante :</p>
<table>
CONTEXT_PREFIX<br>
CONTEXT_DOCUMENT_ROOT<br>
IPV6<br>
- PATH_INFO<br>
+ <a class="glossarylink" href="../glossary.html#pathinfo" title="voir glossaire">PATH_INFO</a><br>
QUERY_STRING<br>
REMOTE_ADDR<br>
REMOTE_HOST<br>
<code>struct tm</code> du système Unix. La plupart d'entre elles
sont documentées dans la <a href="../expr.html#vars">documentation des expressions</a>, dans
la <a href="../env.html">documentation des variables
- d'environnement</a> ou dans la spécification de
+ d’environnement</a> ou dans la spécification de
CGI (<a href="https://www.rfc-editor.org/rfc/rfc3875">RFC 3875</a>).</p>
<p>SERVER_NAME et SERVER_PORT dépendent respectivement
des valeurs des directives <code class="directive"><a href="../mod/core.html#usecanonicalname">UseCanonicalName</a></code> et <code class="directive"><a href="../mod/core.html#usecanonicalphysicalport">UseCanonicalPhysicalPort</a></code>.</p>
+ <p>Les variables SCRIPT_FILENAME et REQUEST_FILENAME contiennent
+ la même valeur — la valeur du champ <code>filename</code> de la
+ structure interne <code>request_rec</code> du serveur HTTP
+ Apache. Le premier nom est plus connu en tant que nom de
+ variable CGI alors que le second est la contrepartie appropriée
+ de REQUEST_URI (qui contient la valeur du champ <code>uri</code>
+ de la structure <code>request_rec</code>).</p>
+
+ <p>Si une substitution se produit et que la réécriture continue,
+ la valeur des deux variables sera mise à jour en conséquence.</p>
+
+ <p>Si elles sont utilisées dans un contexte global au serveur
+ (c’est-à-dire avant que la requête ne soit mise en parallèle
+ avec le système de fichiers), SCRIPT_FILENAME et
+ REQUEST_FILENAME ne peuvent pas contenir le chemin complet du
+ système de fichiers local, car le chemin est inconnu à ce
+ stade du traitement. Dans ce cas, les deux variables
+ contiendront initialement la valeur de REQUEST_URI. Pour obtenir
+ le chemin complet du système de fichiers local correspondant à
+ la requête, Utilisez une projection vers l’avant à base d’URL
+ <code>%{LA-U:REQUEST_FILENAME}</code> pour déterminer la valeur
+ finale de REQUEST_FILENAME.</p>
+
<p>Parmi les variables
spécifiques à <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>, ou trouve les suivantes :</p>
recoder, passez-la à la <a href="#mapfunc">fonction de
mappage</a> "escape".
Notez que cette variable de serveur est distincte de la
- variable d'environnement CGI de même nom : dans un contexte
- CGI, <code>REQUEST_URI</code> contient l'URI original complet
+ variable d’environnement CGI de même nom : dans un contexte
+ CGI, <code>REQUEST_URI</code> contient l’URI original complet
de la requête, y compris la chaîne de paramètres. Voir la
directive <code class="directive"><a href="../mod/core.html#cgivar">CGIVar</a></code> pour les
détails.
différence de la plupart des variables suivantes.</dd>
</dl>
- </li>
- </ul>
+
- <p>Si la <em>chaîne_de_test</em> contient la valeur spéciale
- <code>expr</code>, <em>expression_de_comparaison</em> sera traité
- en tant qu'expression rationnelle de type <a href="../expr.html">ap_expr</a>. Si des en-têtes HTTP sont
- référencés dans l'expression rationnelle, et si le drapeau
- <code>novary</code> n'est pas activé, ils seront ajoutés à
- l'en-tête Vary.</p>
+ <p><a id="rewritecond-prefixed" name="rewritecond-prefixed"></a><strong>Consultation de variables préfixées</strong></p>
+
+ <p>En plus des variables de serveur ci-avant, la syntaxe
+ <code>%{<em>PREFIX</em>:<em>name</em>}</code> permet d’accéder à des
+ ressources supplémentaires :</p>
- <p>Autres points à connaître ::</p>
- <ol>
- <li>
- <p>Les variables <code>SCRIPT_FILENAME</code> et
- <code>REQUEST_FILENAME</code> contiennent toutes deux la valeur
- du champ <code>filename</code> de la
- structure interne <code>request_rec</code>du serveur HTTP Apache.
- Le premier nom correspond au nom de variable bien connu CGI,
- alors que le second est l'équivalent de REQUEST_URI (qui
- contient la valeur du champ <code>uri</code> de
- <code>request_rec</code>).</p>
- <p>Si une substitution intervient et si la réécriture se
- poursuit, la valeur des deux variables sera mise à jour en
- conséquence.</p>
- <p>Dans le contexte du serveur principal (c'est à dire avant que
- la requête ne soit mise en correspondance avec le système de
- fichiers), SCRIPT_FILENAME et REQUEST_FILENAME ne peuvent pas
- contenir le chemin entier dans le système de fichiers local car
- ce chemin b'est pas connu à ce stade du traitement. Dans ce cas,
- les deux variables contiendront la valeur de REQUEST_URI. Pour
- obtenir le chemin complet de la requête dans le système de
- fichiers local dans le contexte du serveur principal, 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>
- <code>%{ENV:<em>variable</em>}</code>, où <em>variable</em> peut
- correspondre à une variable d'environnement quelconque.</li>
- <li>
- <code>%{ENV:variable}</code> est aussi disponible, où
- <em>variable</em> peut correspondre à toute variable
- d'environnement. Peut être consulté via des structures internes
+ <dl>
+ <dt><strong><code>%{ENV:variable}</code></strong></dt>
+ <dd>Où <em>variable</em> peut correspondre à n’importe quelle variable
+ d’environnement. Peut être consulté via des structures internes
d'Apache httpd et (si on ne les trouve pas ici) via la fonction
<code>getenv()</code> à partir du processus du serveur Apache
- httpd.</li>
-
- <li>Que <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code> 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> . Si <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code> n'est pas
- chargé, cette variable contiendra toujours une chaîne vide.
+ httpd.</dd>
+
+ <dt><strong><code>%{SSL:variable}</code></strong></dt>
+ <dd>Où <em>variable</em> est le nom d’une <a href="mod_ssl.html#envvars">variable d’environnement SSL</a>. Cette
+ variable peut être utilisée que <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code> soit chargé ou
+ non, mais elle sera toujours développée en une chaîne vide si
+ <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code> n’est pas chargé.
Exemple : <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> pourra
contenir la valeur <code>128</code>. Ces variables sont
disponibles même si l'option <code>StdEnvVars</code> de la
directive <code class="directive"><a href="../mod/mod_ssl.html#ssloptions">SSLOptions</a></code> n'a
- pas été définie.</li>
+ pas été définie.</dd>
- <li>
- On peut utiliser <code>%{HTTP:en-tête}</code>, où
- <em>en-tête</em> peut correspondre à tout nom d'en-tête MIME
- HTTP, pour extraire la valeur d'un en-tête envoyé dans la
+ <dt><strong><code>%{HTTP:header}</code></strong></dt>
+ <dd>Où <em>header</em> peut correspondre à n’importe quel nom d’en-tête
+ MIME HTTP. Cette variable peut toujours être utilisée pour obtenir la valeur d'un en-tête envoyé dans la
requête HTTP. Par exemple, <code>%{HTTP:Proxy-Connection}</code>
contiendra la valeur de l'en-tête HTTP
"<code>Proxy-Connection:</code>".
logique de cout-circuit si le drapeau
'<strong><code>ornext|OR</code></strong>' est utilisé, et que de
ce fait, certaines d'entre elles ne seront pas évaluées.</p>
- </li>
-
- <li>A des fins de référence avant, on peut utiliser,
- <a id="LA-U" name="LA-U"><code>%{LA-U:variable}</code></a>, qui
- permet d'effectuer une sous-requête interne à base d'URL, afin
- de déterminer la valeur finale de <em>variable</em>. Ceci permet
- d'accéder à la valeur d'une variable pour la réécriture inconnue
- à ce stade du traitement, mais qui sera définie au
- cours d'une phase ultérieure.
- <p>Par exemple, pour effectuer une réécriture dépendant de la
- variable <code>REMOTE_USER</code> dans le contexte du serveur
- principal (fichier <code>httpd.conf</code>), vous devez utiliser
- <code>%{LA-U:REMOTE_USER}</code> - cette variable est définie
- par la phase d'autorisation qui intervient <em>après</em> la
- phase de traduction d'URL (pendant laquelle <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>
- opère).</p>
- <p>Par contre, comme <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> implémente son
- <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a> (fichier
- <code>.htaccess</code>) via la phase Fixup de l'API, et comme la phase
- d'autorisation intervient <em>avant</em> cette dernière, vous pouvez
- vous contenter d'utiliser <code>%{REMOTE_USER}</code> dans ce
- contexte.</p></li>
-
- <li>
- <code>%{LA-F:variable}</code> peut être utilisée pour effectuer
- une sous-requête interne (basée sur le nom de fichier), afin de
- déterminer la valeur finale de <em>variable</em>. La plupart du
- temps, elle est identique à LA-U (voir ci-dessus).</li>
- </ol>
+ </dd>
+ </dl>
+
+
+
+ <p><a id="rewritecond-lookahead" name="rewritecond-lookahead"></a><strong>Sous-requêtes de projection vers l’avant</strong></p>
+ <p>Ces formes génèrent une sous-requête interne pour déterminer la valeur
+ finale d’une variable qui n’est pas encore disponible à ce stade du
+ traitement :</p>
- <p><em>expression_de_comparaison</em> est une expression
+ <dl>
+ <dt><a id="LA-U" name="LA-U"><strong><code>%{LA-U:variable}</code></strong></a></dt>
+ <dd>Génère une sous-requête interne (à base d’URL) pour déterminer la
+ valeur finale de <em>variable</em>. Ceci permet d'accéder à la valeur
+ d'une variable pour la réécriture inconnue à ce stade du traitement,
+ mais qui sera définie au cours d'une phase ultérieure.
+ <p>Par exemple, pour effectuer une réécriture dépendant de la variable
+ <code>REMOTE_USER</code> dans le contexte du serveur principal (fichier
+ <code>httpd.conf</code>), vous devez utiliser
+ <code>%{LA-U:REMOTE_USER}</code> - cette variable est définie par la
+ phase d'autorisation qui intervient <em>après</em> la phase de
+ traduction d'URL (pendant laquelle <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>
+ opère).</p>
+ <p>Par contre, comme <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> implémente
+ son <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>
+ (fichier <code>.htaccess</code>) via la phase Fixup de l'API, et comme
+ la phase d'autorisation intervient <em>avant</em> cette dernière, vous
+ pouvez vous contenter d'utiliser <code>%{REMOTE_USER}</code> dans ce
+ contexte.</p></dd>
+
+ <dt><strong><code>%{LA-F:variable}</code></strong></dt>
+ <dd>Génère une sous-requête interne (à base de nom de fichier) pour
+ déterminer la valeur finale de la <em>variable</em>. Identique la
+ plupart du temps à LA-U ci-dessus.</dd>
+ </dl>
+
+
+
+ <p><a id="rewritecond-expr" name="rewritecond-expr"></a><strong>Syntaxe des expressions</strong></p>
+
+ <p>Si la chaîne <em>TestString</em> contient la valeur spéciale
+ <code>expr</code>, le motif <em>CondPattern</em> sera traité comme une
+ expression <a href="../expr.html">ap_expr</a>. Les en-têtes HTTP
+ référencés dans l’expression seront ajoutés à l’en-tête Vary si le drapeau
+ <code>novary</code> n’a pas été spécifié.</p>
+
+
+
+
+
+ <p><a id="rewritecond-condpattern" name="rewritecond-condpattern"></a><strong>CondPattern</strong></p>
+
+
+ <p><em>CondPattern</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
+ <em>TestString</em>. <em>TestString</em> est d'abord
évaluée, puis comparée à
- l'<em>expression_de_comparaison</em>.</p>
+ l'<em>CondPattern</em>.</p>
- <p><em>expression_de_comparaison</em> est en général une
+ <p><em>CondPattern</em> est en général une
<a class="glossarylink" href="../glossary.html#regex" title="voir glossaire">expression rationnelle</a>, mais vous
disposez des syntaxes supplémentaires suivantes pour effectuer
- d'autres tests utiles sur <em>chaîne_de_test</em> :
+ d'autres tests utiles sur <em>TestString</em> :
</p>
- <ol>
- <li>Vous pouvez préfixer l'expression avec un caractère
+
+
+ <p>Vous pouvez préfixer l'expression avec un caractère
'<code>!</code>' (point d'exclamation) pour inverser le résultat
de la condition, quelle que soit l'<em>expression de
- comparaison</em> utilisée.</li>
+ comparaison</em> utilisée.</p>
- <li>Vous pouvez effectuer des comparaisons lexicographiques de
- chaînes :
+
- <dl>
+ <p><a id="rewritecond-stringcomp" name="rewritecond-stringcomp"></a><strong>Comparaisons de chaînes</strong></p>
+
+ <dl>
<dt><strong><expression</strong></dt>
<dd>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
+ <em>TestString</em>. La condition est satisfaite si
+ <em>TestString</em> est inférieure au sens
lexicographique à l'<em>expression</em>.</dd>
<dt><strong>>expression</strong></dt>
<dd>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
+ <em>TestString</em>. La condition est satisfaite si
+ <em>TestString</em> est supérieure au sens
lexicographique à l'<em>expression</em>.</dd>
<dt><strong>=expression</strong></dt>
<dd>é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
+ <em>TestString</em>. La condition est satisfaite si
+ <em>TestString</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
+ <em>TestString</em> est comparée à la
chaîne vide.</dd>
<dt><strong><=expression de comparaison</strong></dt>
<dd>inférieur ou égal à au sens lexicographique<br>
- Considère l'<em>expression_de_comparaison</em> comme une
+ Considère la <em>CondPattern</em> comme une
chaîne de caractères et la compare au sens lexicographique à
- la <em>chaîne_de_test</em>. Vrai si <em>chaîne_de_test</em>
- précède lexicographiquement <em>expression_de_comparaison</em>, ou est
- égale à <em>expression_de_comparaison</em> (les deux chaînes
+ la <em>TestString</em>. Vrai si <em>TestString</em>
+ précède lexicographiquement <em>CondPattern</em>, ou est
+ égale à <em>CondPattern</em> (les deux chaînes
sont identiques, caractère pour caractère).</dd>
<dt><strong>>=expression de comparaison</strong></dt>
<dd>supérieur ou égal à au sens lexicographique<br>
- Considère l'<em>expression_de_comparaison</em> comme une
+ Considère la <em>CondPattern</em> comme une
chaîne de caractères et la compare au sens lexicographique à
- la <em>chaîne_de_test</em>. Vrai si <em>chaîne_de_test</em>
- suit lexicographiquement <em>expression_de_comparaison</em>, ou est
- égale à <em>expression_de_comparaison</em> (les deux chaînes
+ la <em>TestString</em>. Vrai si <em>TestString</em>
+ suit lexicographiquement <em>CondPattern</em>, ou est
+ égale à <em>CondPattern</em> (les deux chaînes
sont identiques, caractère pour caractère).</dd>
- </dl>
+ </dl>
<div class="note"><h3>Note</h3>
L'opérateur de comparaison de chaînes fait partie des arguments de la
<em>CondPattern</em> et doit par conséquent se trouver entre les
</div>
- </li>
- <li>
- Vous pouvez effectuer des comparaisons d'entiers :
- <dl>
+
+ <p><a id="rewritecond-intcomp" name="rewritecond-intcomp"></a><strong>Comparaisons d’entiers</strong></p>
+
+ <dl>
<dt><strong>-eq</strong></dt>
<dd>est numériquement égal à<br>
- La <em>chaîne_de_test</em> est considérée comme un entier,
+ <em>TestString</em> est considérée comme un entier,
et est comparée numériquement à l'<em>expression de
comparaison</em>. Vrai si les deux expressions sont
numériquement égales.</dd>
<dt><strong>-ge</strong></dt>
<dd>est numériquement supérieur ou égal à<br>
- La <em>chaîne_de_test</em> est considérée comme un entier,
+ <em>TestString</em> est considérée comme un entier,
et est comparée numériquement à l'<em>expression de
- comparaison</em>. Vrai si <em>chaîne_de_test</em> est
+ comparaison</em>. Vrai si <em>TestString</em> est
numériquement supérieure ou égale à
- <em>expression_de_comparaison</em>.</dd>
+ <em>CondPattern</em>.</dd>
<dt><strong>-gt</strong></dt>
<dd>est numériquement supérieur à<br>
- La <em>chaîne_de_test</em> est considérée comme un entier,
+ <em>TestString</em> est considérée comme un entier,
et est comparée numériquement à l'<em>expression de
- comparaison</em>. Vrai si <em>chaîne_de_test</em> est
+ comparaison</em>. Vrai si <em>TestString</em> est
numériquement
- supérieure à <em>expression_de_comparaison</em>.</dd>
+ supérieure à <em>CondPattern</em>.</dd>
<dt><strong>-le</strong></dt>
<dd>est numériquement inférieur ou égal à<br>
- La <em>chaîne_de_test</em> est considérée comme un entier,
+ <em>TestString</em> est considérée comme un entier,
et est comparée numériquement à l'<em>expression de
- comparaison</em>. Vrai si <em>chaîne_de_test</em> est
+ comparaison</em>. Vrai si <em>TestString</em> est
numériquement
- inférieure ou égale à <em>expression_de_comparaison</em>.
+ inférieure ou égale à <em>CondPattern</em>.
Attention à la confusion avec le drapeau <strong>-l</strong>
en utilisant la variante the <strong>-L</strong> ou
<strong>-h</strong>.</dd>
<dt><strong>-lt</strong></dt>
<dd>est numériquement inférieur à<br>
- La <em>chaîne_de_test</em> est considérée comme un entier,
+ <em>TestString</em> est considérée comme un entier,
et est comparée numériquement à l'<em>expression de
- comparaison</em>. Vrai si <em>chaîne_de_test</em> est
+ comparaison</em>. Vrai si <em>TestString</em> est
numériquement
- inférieure à <em>expression_de_comparaison</em>.
+ inférieure à <em>CondPattern</em>.
Attention à la confusion avec le drapeau <strong>-l</strong>
en utilisant la variante the <strong>-L</strong> ou
<strong>-h</strong>.</dd>
si les deux éléments comparés sont numériquement différents.
Equivalent à <code>!-eq</code>.</dd>
- </dl>
- </li>
-
- <li>Vous pouvez effectuer différents tests sur les attributs de
- fichier :
- <dl>
+ </dl>
+
+
+ <p><a id="rewritecond-fileattr" name="rewritecond-fileattr"></a><strong>Tests des attributs de fichier</strong></p>
+
+ <dl>
<dt><strong>-d</strong></dt>
<dd>est un <strong>r</strong>épertoire<br>
- Traite <em>chaîne_de_test</em> comme un chemin et vérifie
+ Traite <em>TestString</em> comme un chemin et vérifie
s'il existe ou pas, et s'il s'agit d'un répertoire.</dd>
<dt><strong>-f</strong></dt>
<dd>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.</dd>
+ Traite <em>TestString</em> comme un chemin et vérifie
+ s'il existe ou pas, et s'il s'agit d'un fichier régulier.
+ </dd>
<dt><strong>-F</strong></dt>
<dd>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,
+ Vérifie si <em>TestString</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 !</dd>
+ peuvent s'en trouver affectées !
+ </dd>
<dt><strong>-h</strong></dt>
<dd>est un lien symbolique, selon la convention bash<br>
- Voir <strong>-l</strong>.</dd>
+ Voir <strong>-l</strong>.
+ </dd>
<dt><strong>-l</strong></dt>
<dd>est un <strong>l</strong>ien symbolique<br>
- Considère la <em>chaîne_de_test</em> comme un chemin et
+ Considère la <em>TestString</em> comme un chemin et
vérifie son existence et si elle est un lien symbolique. On
peut aussi utiliser la convention bash <strong>-L</strong>
ou <strong>-h</strong> lorsqu'il y a risque de confusion
<dt><strong>-s</strong></dt>
<dd>est un fichier régulier d'une certaine taille<br>
- Considère la <em>chaîne_de_test</em> comme un chemin et
+ Considère la <em>TestString</em> comme un chemin et
vérifie son existence et si elle est un fichier régulier
d'une taille supérieure à zéro.</dd>
<dt><strong>-U</strong></dt>
<dd><p>test de l'existence d'une
URL via une sous-requête<br>
- Vérifie si <em>chaîne_de_test</em> est une URL valide,
+ Vérifie si <em>TestString</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 - à
<dt><strong>-x</strong></dt>
<dd>a l'attribut d'exécution positionné<br>
- Considère la <em>chaîne_de_test</em> comme un chemin et
+ Considère la <em>TestString</em> comme un chemin et
vérifie son existence et si elle a son attribut d'exécution
positionné. Ce positionnement est déterminé en fonction de
l'OS sous-jacent.</dd>
- </dl>
+ </dl>
- Par exemple:
+ <p>Par exemple :</p>
<pre class="prettyprint lang-config">RewriteCond /var/www/%{REQUEST_URI} !-f
RewriteRule ^(.+) /other/archive/$1 [R]</pre>
- </li>
+
+
+ <p><a id="rewritecond-expr-pattern" name="rewritecond-expr-pattern"></a><strong>Évaluation des expressions</strong></p>
- <li>
- <p>Si la <em>chaîne_de_test</em> contient la valeur spéciale
+ <p>Si <em>TestString</em> contient la valeur spéciale
<code>expr</code>, la <em>chaîne de comparaison</em> sera
traitée en tant qu'expression rationnelle de type <a href="../expr.html">ap_expr</a>.</p>
<pre class="prettyprint lang-config"> RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
RewriteRule "^/images" "-" [F]</pre>
- </li>
- </ol>
+
+
+
+
+ <p><a id="rewritecond-flags" name="rewritecond-flags"></a><strong>Drapeaux</strong></p>
<p>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>
+ la <em>CondPattern</em> en ajoutant ces
+ <strong><code>[</code><em>flags</em><code>]</code></strong>
comme troisième argument de la directive
- <code class="directive">RewriteCond</code>, où <em>drapeaux</em> est un
+ <code class="directive">RewriteCond</code>, où <em>flags</em> est un
sous-ensemble séparé par des virgules des drapeaux suivants :</p>
- <ul>
- <li>'<strong><code>nocase|NC</code></strong>'
- (<strong>n</strong>o <strong>c</strong>ase)<br>
+ <dl>
+ <dt>'<strong><code>nocase|NC</code></strong>'</dt>
+ <dd>(<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
+ développement de <em>TestString</em> et dans
+ <em>CondPattern</em>. Ce drapeau n'est pris en
+ compte que lors d'une comparaison entre <em>TestString</em>
+ et <em>CondPattern</em>. Il ne l'est pas pour les
vérification par sous-requêtes ou sur le système de
- fichiers.</li>
+ fichiers.
+ </dd>
- <li>
- '<strong><code>ornext|OR</code></strong>'
- (<strong>ou</strong> condition suivante)<br>
+ <dt>'<strong><code>ornext|OR</code></strong>'</dt>
+ <dd>(<strong>or</strong> condition suivante)<br>
Permet de chaîner les conditions de règles avec un OU au
lieu du AND implicite. Exemple typique :
Sans ce drapeau, les paires
condition/règle devraient être écrites trois fois.
- </li>
+ </dd>
- <li>'<strong><code>novary|NV</code></strong>'
- (<strong>n</strong>o <strong>v</strong>ary)<br>
+ <dt>'<strong><code>novary|NV</code></strong>'</dt>
+ <dd>(<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
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>
+ </dd>
+ </dl>
+
+
+
- <p><strong>Exemple :</strong></p>
+ <p><a id="rewritecond-examples" name="rewritecond-examples"></a><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
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Définit les règles pour le moteur de réécriture</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>RewriteRule
- <em>Modèle</em> <em>Substitution</em> [<em>drapeaux</em>]</code></td></tr>
+ [!]<em>Pattern</em> <em>Substitution</em> [<em>flags</em>]</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>configuration globale, serveur virtuel, répertoire, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Surcharges autorisées:</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
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"><a class="glossarylink" href="../glossary.html#regex" title="voir glossaire">expression
+ <p><a id="patterns" name="patterns"><em>Pattern</em></a> est une <a id="regexp" name="regexp"><a class="glossarylink" href="../glossary.html#regex" title="voir glossaire">expression
rationnelle</a></a>. Ce avec quoi ce modèle est comparé dépend de
l'endroit où la directive <code class="directive">RewriteRule</code> est
définie.</p>
+ <p>Si le motif est précédé d’un <code>!</code>, la substitution ne sera
+ effectuée que si le <em>pattern</em> ne correspond pas.</p>
+
<div class="note"><h3><a id="what_is_matched" name="what_is_matched">Qu'est-ce qui est comparé ?</a></h3>
<ul>
<li><p>Dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de
répertoire</a> (sections <code class="directive"><a href="../mod/core.html#directory">Directory</a></code> et fichiers .htaccess), le
- <em>Modèle</em> est comparé avec une partie de chemin ; par exemple une
+ <em>Pattern</em> est comparé avec une partie de chemin ; par exemple une
requête pour "/app1/index.html" entraînera une comparaison avec
"app1/index.html" ou "index.html" selon le chemin de répertoire où la
directive <code class="directive">RewriteRule</code> est définie.</p>
- <p>Le chemin de répertoire auquel la règle s'applique est supprimé du
+ <p>Le chemin de répertoire auquel la règle s’applique est supprimé du
chemin correspondant du système de fichiers avant comparaison (jusqu'au
slash final compris). En conséquence de cette suppression, les règles
définies dans ce contexte n'effectuent des comparaisons qu'avec la portion
du chemin du système de fichiers "en dessous" du chemin de répertoire
- auquel la règle s'applique.</p>
+ auquel la règle s’applique.</p>
<p>Le chemin correspondant actuel du système de fichiers est déterminé par
des directives telles que <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> et
</div>
</div>
- <p>Pour quelques conseils à propos des <a class="glossarylink" href="../glossary.html#regex" title="voir glossaire">expressions rationnelles</a>, voir le
- document <a href="../rewrite/intro.html#regex">Introduction à
- mod_rewrite</a>.</p>
-
- <p>Dans <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>, on peut aussi utiliser le caractère
- NOT ('<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>
-
-<div class="note"><h3>Note</h3>
-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 !
-</div>
+ <p>Pour des informations à propos des <a class="glossarylink" href="../glossary.html#regex" title="voir glossaire">expressions
+ rationnelles</a>, y compris l’utilisation du préfixe <code>!</code>
+ pour inverser un motif, voir la section <a href="../rewrite/intro.html#regex">Expressions rationnelles</a> de
+ l’introduction à mod_rewrite.</p>
- <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>
+ <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 (voir <a href="#what_is_matched">"Qu’est-ce
+ qui est comparé ?"</a> ci-avant) lorsque les conditions de la règle sont
+ satisfaites. <em>Substitution</em> peut être :</p>
<dl>
<dd>Il indique alors la localisation dans le système de fichiers de la
ressource qui doit être envoyée au client. Une substitution commençant
- par <code>/</code> n'est traitée comme un chemin du système de fichiers
+ par <code>/</code> n’est traitée comme un chemin du système de fichiers
que dans un contexte de serveur virtuel ou de serveur global, et
seulement si le premier composant du chemin existe dans le système de
fichiers. Dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de
doit être servie. Dans un contexte de serveur virtuel ou de serveur
global, si le premier composant du chemin existe à la racine du système
de fichiers, la substitution est traitée comme un chemin du système de
- fichiers. Par exemple, <code>/www/file.html</code> est un chemin d'URL,
+ fichiers. Par exemple, <code>/www/file.html</code> est un chemin d’URL,
sauf si un répertoire nommé <code>www</code> existe à la racine du
système de fichiers. Si vous désirez que d'autres directives de
correspondance d'URL (comme la directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code>) soient appliquées au
<div class="note"><h3>Comment sont interprétées les substitutions de chemin</h3>
<p>En fonction du contexte et si elle commence ou non par un slash, une
substitution sera traitée comme un chemin du système de fichiers ou comme
- un chemin d'URL :</p>
+ un chemin d’URL :</p>
<ul>
<li><strong>Commence par un <code>/</code>, contexte de serveur virtuel
ou de serveur global :</strong>
Traitée comme un chemin du système de fichiers si le premier composant du
- chemin existe sur disque ; sinon, traitée comme un chemin d'URL.</li>
+ chemin existe sur disque ; sinon, traitée comme un chemin d’URL.</li>
<li><strong>Commence par un <code>/</code>, <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a> :</strong>
- Toujours traitée comme un chemin d'URL. Pas de vérification sur le
+ Toujours traitée comme un chemin d’URL. Pas de vérification sur le
système de fichiers.</li>
<li><strong>Ne commence pas par un <code>/</code> (chemin relatif), contexte de serveur virtuel
- ou de serveur global :</strong> Traitée comme un chemin d'URL relatif à
- l'URI de la requête actuelle.</li>
+ ou de serveur global :</strong> Traitée comme un chemin d’URL relatif à
+ l’URI de la requête actuelle.</li>
<li><strong>Ne commence pas par un <code>/</code> (chemin relatif),
<a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de
- répertoire</a> :</strong> Traitée comme un chemin d'URL relatif
+ répertoire</a> :</strong> Traitée comme un chemin d’URL relatif
au chemin de répertoire auquel la directive <code class="directive"><a href="../mod/core.html#directory">Directory</a></code> ou le fichier <code>.htaccess</code>
- s'appliquent. Voir <code class="directive">RewriteBase</code> pour le contrôle
+ s’appliquent. Voir <code class="directive">RewriteBase</code> pour le contrôle
du préfixe ajouté aux substitutions relatives.</li>
</ul>
</div>
condition d'une règle (<code>%{VARNAME}</code>)</li>
<li>des appels de
- <a href="#mapfunc">fonctions de comparaison</a>
+ <a href="#mapfunc">fonctions de mappage</a>
(<code>${nom correspondance:clé|défaut}</code>)</li>
</ol>
<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>
+ <strong><code>[</code><em>flags</em><code>]</code></strong>
comme troisième argument de la directive
<code class="directive">RewriteRule</code>. Séparés par des virgules au sein d'une
- liste encadrée par des crochets, les <em>drapeaux</em> peuvent
+ liste encadrée par des crochets, les <em>flags</em> peuvent
être choisis dans la table suivante. Vous trouverez plus de
détails, et des exemples pour chaque drapeau dans le <a href="../rewrite/flags.html">document à propos des drapeaux de
réécriture.</a></p>
</tr>
<tr class="odd">
<td>UnsafeAllow3F</td>
- <td>Autorise les substitutions à partir d'URL potentiellement non
+ <td>Autorise les substitutions à partir d’URL potentiellement non
fiables.
<em><a href="../rewrite/flags.html#flag_unsafe_allow_3f">détails ...</a></em>
</td>
<tr>
<td>UnsafePrefixStat</td>
<td>Autorise les substitutions potentiellement non fiables à partir
- d'une variable de tête ou d'une référence arrière vers un chemin du
+ d’une variable de tête ou d’une référence arrière vers un chemin du
système de fichiers.
<em><a href="../rewrite/flags.html#flag_unsafe_prefix_stat">détails ...</a></em><br>
Disponible à partir de la version 2.5.1 du serveur HTTP Apache.
<variants>
<variant>en</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
</variants>
</metafile>
<a href="../ja/mod/mod_unique_id.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a> |
<a href="../ko/mod/mod_unique_id.html" hreflang="ko" rel="alternate" title="Korean"> ko </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Fournit une variable d'environnement contenant un
identifiant unique pour chaque requête</td></tr>
<tr><th><a href="module-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<li>Les temps des machines sont synchronisés via NTP ou tout autre
protocole de synchronisation du temps en réseau.</li>
- <li>Les nom d'hôtes des machines sont tous différents, de façon à
- ce que le module puisse recevoir une adresse IP différente pour
- chaque machine du cluster en effectuant une recherche sur le nom
- d'hôte.</li>
</ul>
+ <div class="note"><h3>Changements à partir de la version 2.4.29</h3>
+ <p>Dans les versions précédentes, l’unicité nécessitait aussi que chaque
+ machine ait une adresse IP distincte. Depuis la version 2.4.29, le module
+ utilise un générateur de nombres pseudo-aléatoires cryptographique (PRNG)
+ ensemencé au démarrage, tout en supprimant l’adresse IP et le PID de
+ l’identifiant et en ne nécessitant plus de noms d’hôte distincts ou de
+ délai au démarrage.</p></div>
+
<p>Au vu des caractéristiques actuelles du système d'exploitation,
nous supposerons que les pids (identifiants processus) sont codés
sur 32 bits. Si le système d'exploitation utilise plus de 32 bits
pour un pid, la correction est triviale mais doit être effectuée
dans le code.</p>
- <p>Ces hypothèses posées, à un instant donné, nous pouvons
- distinguer tout processus httpd sur toute machine du cluster de tous
- les autres processus httpd. Pour ce faire, il suffit d'utiliser
- l'adresse IP de la machine et le pid du processus httpd. Un
- processus httpd peut traiter plusieurs requêtes simultanément si
- vous utilisez un module MPM multi-threadé. Pour identifier les
- threads, Apache httpd utilise en interne un index de threads. Ainsi,
- afin de générer des identifiants uniques pour chaque requête, il
- suffit d'effectuer une distinction en fonction du temps.</p>
+ <p>Ces hypothèses posées, à un instant donné, nous pouvons distinguer tout
+ processus httpd sur toute machine du cluster de tous les autres processus
+ httpd. La valeur racine générée par PRNG et l’index des threads permettent
+ d’accomplir cette tâche. Un processus httpd peut traiter plusieurs requêtes
+ simultanément si vous utilisez un module MPM multi-threadé. Pour identifier
+ les threads, Apache httpd utilise en interne un index de threads. Ainsi,
+ afin de générer des identifiants uniques pour chaque requête, il suffit
+ d'effectuer une distinction en fonction du temps.</p>
<p>Pour déterminer le temps, nous utiliserons un repère de temps
Unix (les secondes écoulées depuis le 1er janvier 1970 UTC), et un
redémarrage.</p>
- <p>La variable d'environnement <code>UNIQUE_ID</code> est construite
- par codage du quadruplet de 144 bits (adresse IP sur 32 bits, pid
- sur 32 bits, repère de temps sur 32 bits, compteur 16 bits et index
- de threads sur 32 bits) en
+ <p>Depuis la version 2.4.29, la variable d'environnement <code>UNIQUE_ID</code> est construite
+ par codage d’une valeur de 160 bits (32 bits pour l’horodatage, 80 bits pour
+ la racine PRNG, 16 bits pour le compteur et 32 bits pour l’index des
+ threads)) en
utilisant l'alphabet <code>[A-Za-z0-9_-]</code> d'une manière
similaire à celle du codage MIME base64, et sa valeur se présente
- sous la forme d'une chaîne de 24 caractères. L'alphabet MIME base64
+ sous la forme d'une chaîne de 27 caractères. L'alphabet MIME base64
est en fait <code>[A-Za-z0-9+/]</code> ; cependant, les caractères
<code>+</code> et <code>/</code> nécessitent un codage particulier
dans les URLs, ce qui rend leur utilisation peu commode. Toutes les
valeurs sont codées dans l'ordre des octets d'une adresse réseau de
façon à ce
que le codage soit comparable entre des architectures où l'ordre des
- octets est différent. L'ordre réel de codage est : repère de temps,
- adresse IP, pid, compteur. Cet ordre de codage possède un but
+ octets est différent. L'ordre réel de codage est : horodatage, racine,
+ compteur, index des threads. Cet ordre de codage possède un but
précis, mais il faut souligner que les applications n'ont aucun
intérêt à entrer dans les détails de ce codage. Les applications
doivent se contenter de traiter la variable <code>UNIQUE_ID</code>
machines du cluster (seule la synchronisation NTP est requise, ce
qui représente une charge très faible), et aucune communication
entre les processus httpd n'est nécessaire (la communication est
- implicite et incluse dans le pid assigné par le noyau). Dans des
- situations très spécifiques, l'identifiant peut être raccourci, mais
- dans ce cas, d'avantage d'informations doivent être admises (par
- exemple, les 32 bits de l'adresse IP sont excessifs pour la plupart
- des sites, mais il n'existe pas de valeur de remplacement portable
- plus courte).</p>
+ implicite dans la graine PRNG assignée au démarrage)..</p>
</div>
</div>
<div class="bottomlang">
<variants>
<variant>en</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
</variants>
<tr><td><a href="mod_rewrite.html#rewritebase">RewriteBase <em>chemin_URL</em></a></td><td></td><td>dh</td><td>E</td></tr><tr><td class="descr" colspan="4">Définit l'URL de base pour les réécritures au niveau
répertoire</td></tr>
<tr class="odd"><td><a href="mod_rewrite.html#rewritecond"> RewriteCond
- <em>chaîne_de_test</em> <em>expression_de_comparaison</em> [<em>drapeaux</em>]</a></td><td></td><td>svdh</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Définit une condition qui devra être satisfaite pour que
+ <em>TestString</em> [!]<em>CondPattern</em> [<em>flags</em>]</a></td><td></td><td>svdh</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Définit une condition qui devra être satisfaite pour que
la réécriture soit effectuée
</td></tr>
<tr><td><a href="mod_rewrite.html#rewriteengine">RewriteEngine on|off</a></td><td> off </td><td>svdh</td><td>E</td></tr><tr><td class="descr" colspan="4">Active ou désactive l'exécution du
<tr><td><a href="mod_rewrite.html#rewriteoptions">RewriteOptions <var>Options</var></a></td><td></td><td>svdh</td><td>E</td></tr><tr><td class="descr" colspan="4">Configure certaines options spéciales
pour le moteur de réécriture</td></tr>
<tr class="odd"><td><a href="mod_rewrite.html#rewriterule">RewriteRule
- <em>Modèle</em> <em>Substitution</em> [<em>drapeaux</em>]</a></td><td></td><td>svdh</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Définit les règles pour le moteur de réécriture</td></tr>
+ [!]<em>Pattern</em> <em>Substitution</em> [<em>flags</em>]</a></td><td></td><td>svdh</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Définit les règles pour le moteur de réécriture</td></tr>
<tr><td><a href="core.html#rlimitcpu">RLimitCPU <var>secondes</var>|max [<var>secondes</var>|max]</a></td><td></td><td>svdh</td><td>C</td></tr><tr><td class="descr" colspan="4">Limite le temps CPU alloué aux processus initiés par les
processus enfants d'Apache httpd</td></tr>
<tr class="odd"><td><a href="core.html#rlimitmem">RLimitMEM <var>octets</var>|max [<var>octets</var>|max]</a></td><td></td><td>svdh</td><td>C</td></tr><tr class="odd"><td class="descr" colspan="4">Limite la mémoire allouée aux processus initiés par les
<a href="../tr/rewrite/avoid.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a> |
<a href="../zh-cn/rewrite/avoid.html" hreflang="zh-cn" rel="alternate" title="Simplified Chinese"> zh-cn </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<p>Ce document est un complément à la <a href="../mod/mod_rewrite.html">Documentation de référence</a> de
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#redirect">Redirection simple</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#alias">Alias d'URL</a></li>
-<li><img alt="" src="../images/down.gif"> <a href="#vhosts">Hébergement virtuel</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#proxy">Mandat simple</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#setenv">Test de variables d'environnement</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#fallback-resource">Contrôleur frontal / Routage des
+ressources</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#ifexpr">Configuration conditionnelle avec des
+expressions rationnelles</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#blocked-inline-images">Blocage du référencement à chaud (Hotlinking) d'images</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#blocking-of-robots">Blocage des robots</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#host-deny">Interdire des hôtes dans une liste de rejets</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#vhosts">Serveurs virtuels</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#load-balancing">Répartition de charge</a></li>
</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en
-correspondance</a></li><li><a href="access.html">Contrôle d'accès</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="proxy.html">Serveurs mandataires</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="advanced.html">Techniques avancées</a></li></ul></div>
+correspondance</a></li><li><a href="htaccess.html">Réécritures par répertoire</a></li><li><a href="flags.html">Drapeaux de RewriteRule</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="tech.html">Détails techniques</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="redirect">Redirection simple <a title="Lien permanent" href="#redirect" class="permalink">¶</a></h2>
<code>example.com</code> vers <code>www.example.com</code>, voir la
méthode <a href="remapping.html#canonicalhost">Noms d'hôtes canoniques</a>.</p>
-<p>Pour rediriger les URLs <code>http</code> vers <code>https</code>,
-utilisez cette définition :</p>
-
-<pre class="prettyprint lang-config"><VirtualHost *:80>
- ServerName www.example.com
- Redirect "/" "https://www.example.com/"
-</VirtualHost>
-
-<VirtualHost *:443>
- ServerName www.example.com
- # ... insérer ici la configuration SSL
-</VirtualHost></pre>
-
-
-<p>L'utilisation de la directive <code>RewriteRule</code> pour accomplir
-cette tâche peut se justifier s'il existe d'autres directives
-<code>RewriteRule</code> dans la même portée. En effet, lorsque des
-directives <code>Redirect</code> et <code>RewriteRule</code> se trouvent
-dans la même portée, les directives <code>RewriteRule</code> sont
-exécutées en premier, sans tenir compte de leur ordre d'apparition dans
-le fichier de configuration.</p>
-
-<p>Dans le cas de la redirection <em>http-vers-https</em>, l'utilisation
-de règles <code>RewriteRule</code> se justifie si vous n'avez pas accès
-au fichier de configuration principal, et devez donc accomplir cette
-tâche au sein d'un fichier <code>.htaccess</code>.</p>
+<p>Pour rediriger les URLs <code>http</code> vers <code>https</code>, une
+directive <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code> dans un serveur
+virtuel HTTP dédié est l’approche la plus propre. Voir la recette <a href="remapping.html#https-redirect">Forcer HTTPS</a> pour la configuration
+recommandée et l’alternative de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> pour l’utilisation
+des fichiers <code>.htaccess</code>.</p>
+
+ <div class="note"><h3>Ordre de traitement</h3>
+ <p>Si vous mélangez des directives <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code> et <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> dans le même contexte, sachez
+ que leur ordre d’exécution dépend de l’emplacement où elles apparaissent.
+ Dans un contexte de serveur virtuel ou global, c’est
+ <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> qui agit en premier, alors que dans un contexte
+ de répertoire (fichiers <code>.htaccess</code>), c’est
+ <code class="module"><a href="../mod/mod_alias.html">mod_alias</a></code>. Voir <a href="tech.html#order">Ordre de
+ traitement des modules</a> pour les détails.</p>
+ </div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="alias">Alias d'URL <a title="Lien permanent" href="#alias" class="permalink">¶</a></h2>
-<p>La directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> permet
-de mettre en correspondance un URI avec un répertoire, ce dernier étant
-en général situé en dehors de l'arborescence définie par la directive
-<code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>. Bien qu'il soit
-possible d'effectuer cette mise en correspondance avec
-<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>, il est préférable d'utiliser la directive
-<code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> pour des raisons de simplicité
-et de performances.</p>
+<p>La directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> permet de mettre
+en correspondance un chemin d’URL avec un répertoire, ce dernier étant en
+général situé en dehors de l'arborescence définie par la directive <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>. Bien qu'il soit possible d'effectuer
+cette mise en correspondance avec <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>, il est
+préférable d'utiliser la directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> pour des raisons de simplicité et de
+performances.</p>
<div class="example"><h3>Utilisation de la directive Alias</h3><pre class="prettyprint lang-config">Alias "/cats" "/var/www/virtualhosts/felines/htdocs"</pre>
</div>
<p>En outre, vous pouvez arriver au même résultat avec les liens
symboliques, pourvu que <code>Options FollowSymLinks</code> soit activé
sur votre serveur.</p>
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
-<div class="section">
-<h2 id="vhosts">Hébergement virtuel <a title="Lien permanent" href="#vhosts" class="permalink">¶</a></h2>
-<p>Bien qu'il soit possible de gérer les <a href="vhosts.html">serveurs
-virtuels avec mod_rewrite</a>, il s'agit rarement de la bonne méthode.
-Il est pratiquement toujours préférable de créer des blocs
-<code class="directive"><a href="../mod/core.html#virtualhost"><VirtualHost></a></code> individuels.
-Dans l'éventualité où vous devez gérer
-un grand nombre de serveurs virtuels, vous devez vous tourner vers
-<code class="module"><a href="../mod/mod_vhost_alias.html">mod_vhost_alias</a></code> pour créer ces serveurs
-automatiquement.</p>
-
-<p>Il est aussi possible d'utiliser des modules comme <code class="module"><a href="../mod/mod_macro.html">mod_macro</a></code> pour
-créer un grand nombre de serveurs virtuels dynamiquement.</p>
-
-<p>L'utilisation de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> pour la création de
-serveurs virtuels peut se révéler appropriée si votre service
-d'hébergement ne vous permet pas d'accéder aux fichiers de configuration
-du serveur, et que vous soyez par conséquent obligé de passer par les
-fichiers <code>.htaccess</code>.</p>
-
-<p>Voir le document <a href="vhosts.html">création de serveurs virtuels
-avec mod_rewrite</a> pour plus de détails sur la manière d'y parvenir si
-cela semble être tout de même la meilleure approche.</p>
-
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="proxy">Mandat simple <a title="Lien permanent" href="#proxy" class="permalink">¶</a></h2>
car elles agissent en général avant les directives
<code>ProxyPass</code>, et peuvent ainsi les court-circuiter.</p>
+<p><code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> s’avère vraiment
+utile pour ne mandater les requêtes que si le contenu n’existe pas localement
+— par exemple, lors de la migration d’un serveur vers un autre :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{REQUEST_FILENAME}" !-f
+RewriteCond "%{REQUEST_FILENAME}" !-d
+RewriteRule "^/(.*)" "http://old.example.com/$1" [P]
+ProxyPassReverse "/" "http://old.example.com/"</pre>
+
+
+<p>Dans cet exemple, les requêtes pour des ressources qui n’ont pas encore été
+migrées sont mandatées silencieusement vers l’ancien serveur. Lors de la
+migration du contenu, les fichiers locaux ont la priorité. N’oubliez pas de
+toujours inclure une directive <code class="directive"><a href="../mod/mod_proxy.html#proxypassreverse">ProxyPassReverse</a></code> pour être sûr que toute
+redirection effectuée par le serveur dorsal est correctement transmise au
+client.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="setenv">Test de variables d'environnement <a title="Lien permanent" href="#setenv" class="permalink">¶</a></h2>
d'expressions que vous pouvez utiliser dans les sections <code class="directive"><a href="../mod/core.html#if"><If></a></code>,
ainsi que dans certaines directives.</p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="fallback-resource">Contrôleur frontal / Routage des
+ressources <a title="Lien permanent" href="#fallback-resource" class="permalink">¶</a></h2>
+
+<p>Une utilisation très courante de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> consiste à
+router toutes les requêtes pour des ressources non existantes vers un seul
+script de contrôle frontal (par exemple <code>index.php</code>). Il s’agit de la
+base du routage dans le cadre de la plus grande partie du web moderne.</p>
+
+<p>L’approche typique avec <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> est :</p>
+
+<pre class="prettyprint lang-config">RewriteEngine On
+RewriteCond "%{REQUEST_FILENAME}" !-f
+RewriteCond "%{REQUEST_FILENAME}" !-d
+RewriteRule "^(.*)$" "/index.php" [L]</pre>
+
+
+<p>Cette opération peut être effectuée beaucoup plus simplement avec la
+directive <code class="directive"><a href="../mod/mod_dir.html#fallbackresource">FallbackResource</a></code> :</p>
+
+<pre class="prettyprint lang-config">FallbackResource /index.php</pre>
+
+
+<p>La directive <code class="directive"><a href="../mod/mod_dir.html#fallbackresource">FallbackResource</a></code> fait la
+même chose — les requêtes pour des fichiers et répertoires existants sont
+traitées normalement, toutes les autres étant routées vers la ressource
+spécifiée — mais sans la surcharge de travail et la complexité du moteur de
+réécriture. Elle fonctionne dans les deux contextes de configuration globale du
+serveur et des fichiers <code>.htaccess</code>.</p>
+
+<p>Pour désactiver une <code>FallbackResource</code> définie dans un répertoire
+parent :</p>
+
+<pre class="prettyprint lang-config">FallbackResource disabled</pre>
+
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="ifexpr">Configuration conditionnelle avec des
+expressions rationnelles <a title="Lien permanent" href="#ifexpr" class="permalink">¶</a></h2>
+
+<p>Dans de nombreux cas, l’utilisation de <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> peut être remplacée par la
+directive <code class="directive"><a href="../mod/core.html#if"><If></a></code> qui prend en
+charge une <a href="../expr.html">syntaxe des expressions</a> riche et s’intègre
+parfaitement avec les autres directives de httpd.</p>
+
+<p>Redirection basée sur un élément de la chaîne de paramètres :</p>
+
+<pre class="prettyprint lang-config"><If "%{QUERY_STRING} =~ /lang=fr/">
+ Redirect "/welcome" "/bienvenue"
+</If></pre>
+
+
+<p>Restriction d’accès en fonction de la méthode de la requête :</p>
+
+<pre class="prettyprint lang-config"><If "%{REQUEST_METHOD} IN {'DELETE', 'PUT', 'PATCH'}">
+ Require ip 10.0.0.0/8
+</If></pre>
+
+
+<p>Blocage des requêtes qui ne comportent pas d’en-tête Host (clients
+HTTP/1.0) :</p>
+
+<pre class="prettyprint lang-config"><If "-z req('Host')">
+ Require all denied
+</If></pre>
+
+
+<p>Voir la <a href="../expr.html">documentation sur l’évaluation des
+expressions</a> pour une description complète de la syntaxe disponible dans les
+blocs <code class="directive"><a href="../mod/core.html#if"><If></a></code>.</p>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="blocked-inline-images">Blocage du référencement à chaud (Hotlinking) d'images <a title="Lien permanent" href="#blocked-inline-images" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Le référencement à chaud consiste pour les autres sites à inclure
+ directement vos images dans leurs pages en utilisant votre bande
+ passante pour servir des contenus pour le site de quelqu'un d'autre.
+ Vous pouvez empêcher cela sans utiliser
+ <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Utilisez la directive <code class="directive"><a href="../mod/mod_setenvif.html#setenvif">SetEnvIf</a></code> avec la directive <code class="directive"><a href="../mod/mod_authz_core.html#require">Require</a></code> :</p>
+
+ <pre class="prettyprint lang-config">SetEnvIf Referer example\.com localreferer
+<FilesMatch "\.(jpg|png|gif)$">
+ Require env localreferer
+</FilesMatch></pre>
+
+ </dd>
+
+ <dt>Discussion :</dt>
+
+ <dd>
+ <p>Si vous avez besoin d’une logique plus complexe — comme servir une
+ autre image aux référenceurs à chaud au lieu de rejeter la requête — vous
+ aurez peut-être besoin de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>. Les exemples
+ suivants s’appuient sur l’en-tête <code>HTTP_REFERER</code> qui est
+ facultatif et peut être usurpé. La condition <code>!^$</code> autorise les
+ requêtes qui ne comportent aucun en-tête Referer, de sorte que les
+ utilisateurs qui saisissent l’URL directement, ou dont les navigateurs
+ suppriment cet en-tête ne soient pas bloqués.</p>
+
+ <p>Rejeter purement et simplement la requête :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{HTTP_REFERER}" "!^$"
+RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
+RewriteRule "\.(gif|jpg|png)$" "-" [F,NC]</pre>
+
+
+ <p>Servir une image alternative :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{HTTP_REFERER}" "!^$"
+RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
+RewriteRule "\.(gif|jpg|png)$" "/images/go-away.png" [R,NC]</pre>
+
+
+ </dd>
+ </dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="blocking-of-robots">Blocage des robots <a title="Lien permanent" href="#blocking-of-robots" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Vous voulez bloquer les requêtes persistantes d’un robot particulier ou
+ d’un agent utilisateur qui ignore votre <code>/robots.txt</code>.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Utilisez la directive <code class="directive"><a href="../mod/mod_setenvif.html#setenvifnocase">SetEnvIfNoCase</a></code> avec la directive
+ <code class="directive"><a href="../mod/mod_authz_core.html#require">Require</a></code> :</p>
+
+ <pre class="prettyprint lang-config">SetEnvIfNoCase User-Agent ^NameOfBadRobot goaway
+<Location "/secret/files">
+ <RequireAll>
+ Require all granted
+ Require not env goaway
+ </RequireAll>
+</Location></pre>
+
+ </dd>
+
+ <dt>Discussion :</dt>
+
+ <dd>
+ <p>Toute technique qui s’appuie sur la chaîne <code>USER_AGENT</code> peut
+ être facilement contournée, car cette chaîne peut être modifiée par le
+ client. Si vous subissez une attaque soutenue, vous devez la traiter à un
+ niveau supérieur, par exemple au niveau de votre pare-feu.</p>
+
+ <p>Si vous devez combiner la recherche de correspondance par agent
+ utilisateur et par adresse IP, <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> peut être
+ utilisé en remplacement :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{HTTP_USER_AGENT}" "^NameOfBadRobot"
+RewriteCond "%{REMOTE_ADDR}" "=123\.45\.67\.[8-9]"
+RewriteRule "^/secret/files/" "-" [F]</pre>
+
+
+ </dd>
+ </dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="host-deny">Interdire des hôtes dans une liste de rejets <a title="Lien permanent" href="#host-deny" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Nous souhaitons établir une liste des hôtes auxquels nous voulons
+ interdire l’accès à notre serveur.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Pour un simple blocage basé sur l’adresse IP, utilisez la directive
+ <code class="directive"><a href="../mod/mod_authz_host.html#require">Require</a></code> directement :</p>
+
+ <pre class="prettyprint lang-config"><Location "/">
+ Require all granted
+ Require not ip 193.102.180.41
+ Require not ip 192.76.162.40
+</Location></pre>
+
+ </dd>
+
+ <dt>Discussion :</dt>
+
+ <dd>
+ <p>Si vous avez besoin d’une liste d’interdiction dynamique basée sur un
+ fichier (plutôt que d’énumérer des adresses IP dans la configuration),
+ vous pouvez utiliser <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> et sa directive
+ <code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> :</p>
+
+<pre class="prettyprint lang-config">RewriteEngine on
+RewriteMap hosts-deny "txt:/path/to/hosts.deny"
+RewriteCond "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [OR]
+RewriteCond "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND"
+RewriteRule "^" "-" [F]</pre>
+
+
+ <p>Le fichier de mappage contient une entrée par ligne, avec une adresse
+ IP ou un nom d’hôte comme clé et une valeur factice (parce que la
+ directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> requiert
+ des paires clé/valeur) :</p>
+
+<div class="example"><p><code>
+## hosts.deny<br>
+193.102.180.41 -<br>
+192.76.162.40 -<br>
+</code></p></div>
+
+ <p>La seconde directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> présuppose que
+ <code>HostnameLookups</code> est activé. Dans le cas contraire,
+ supprimer-la, ainsi que le drapeau <code>[OR]</code> de la première
+ condition.</p>
+ </dd>
+ </dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="vhosts">Serveurs virtuels <a title="Lien permanent" href="#vhosts" class="permalink">¶</a></h2>
+<p>Bien qu’il soit possible de gérer les <a href="vhosts.html">serveurs virtuels
+avec mod_rewrite</a>, il s’agit rarement de la bonne méthode. Le bon choix
+consiste pratiquement toujours à créer des blocs <code class="directive"><a href="../mod/core.html#virtualhost"><VirtualHost></a></code> individuels. Si vous devez gérer un très
+grand nombre de serveurs virtuels, choisissez plutôt d’utiliser
+<code class="module"><a href="../mod/mod_vhost_alias.html">mod_vhost_alias</a></code> pour créer ces hôtes automatiquement.</p>
+
+<p>Des modules tels que <code class="module"><a href="../mod/mod_macro.html">mod_macro</a></code> permettent aussi de créer un
+grand nombre de serveurs virtuels dynamiquement.</p>
+
+<p>Utiliser <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> pour la création de serveurs virtuels
+peut convenir si vous utilisez un service d’hébergement qui ne vous permet pas
+d’accéder aux fichiers de configuration du serveur, et que vous soyez par
+conséquent contraint d’utiliser des fichiers <code>.htaccess</code>.</p>
+
+<p>Voir le document <a href="vhosts.html">les serveurs virtuels avec
+mod_rewrite</a> pour plus de détails sur la manière de procéder si cette
+approche vous semble encore être la bonne.</p>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="load-balancing">Répartition de charge <a title="Lien permanent" href="#load-balancing" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Nous souhaitons répartir la charge entre plusieurs serveurs dorsaux.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Utilisez le module <code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> qui fournit une
+ solution de répartition de charge flexible et totalement fonctionnelle. Il
+ prend en charge plusieurs algorithmes de répartition, la persistance de
+ session, les contrôles de bon fonctionnement et une configuration
+ dynamique avec le gestionnaire de répartition de charge (Balancer Manager)
+ — toutes choses impossibles avec l’approche de
+ <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>.</p>
+
+<pre class="prettyprint lang-config"><Proxy "balancer://mycluster">
+ BalancerMember "http://one.example.com"
+ BalancerMember "http://two.example.com"
+ BalancerMember "http://three.example.com"
+</Proxy>
+ProxyPass "/" "balancer://mycluster/"
+ProxyPassReverse "/" "balancer://mycluster/"</pre>
+
+
+ </dd>
+
+ <dt>Discussion :</dt>
+ <dd>
+
+<p>Il est possible de mettre en Å“uvre une répartition de charge aléatoire
+rudimentaire en utilisant <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> et une directive
+<code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> de type
+<code>rnd</code> :</p>
+
+<pre class="prettyprint lang-config">RewriteEngine on
+RewriteMap lb "rnd:/path/to/serverlist.txt"
+RewriteRule "^/(.*)" "http://${lb:servers}/$1" [P,L]</pre>
+
+
+<p><code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> est cependant beaucoup plus flexible et
+fonctionnel que tout ce que vous pourrez « bricoler » en utilisant
+<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>, et correspond à l’approche recommandée.</p>
+
+ </dd>
+ </dl>
+
</div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../de/rewrite/avoid.html" hreflang="de" rel="alternate" title="Deutsch"> de </a> |
<variant outdated="yes">de</variant>
<variant>en</variant>
<variant outdated="yes">es</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
<variant outdated="yes">tr</variant>
<a href="../tr/rewrite/flags.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a> |
<a href="../zh-cn/rewrite/flags.html" hreflang="zh-cn" rel="alternate" title="Simplified Chinese"> zh-cn </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<p>Ce document décrit les drapeaux disponibles dans la directive
<code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>, en fournissant
des explications détaillées et des exemples.</p>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#introduction">Introduction</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#flag_quickref">Référence rapide des drapeaux</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#flag_b">B (échappement dans les références arrières)</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#flag_bnp">BNP|backrefnoplus (ne pas échapper
l'espace en +)</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#flag_unsafe_prefix_stat">UnsafePrefixStat</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#flag_unc">UNC</a></li>
</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection and remise en
-correspondance</a></li><li><a href="access.html">Contrôle d'accès</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="proxy.html">Mise en cache</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="advanced.html">Techniques avancées</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li></ul></div>
+correspondance</a></li><li><a href="htaccess.html">Réécritures par répertoire</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li><li><a href="tech.html">Détails techniques</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="introduction">Introduction <a title="Lien permanent" href="#introduction" class="permalink">¶</a></h2>
Certains drapeaux acceptent un ou plusieurs arguments. Les drapeaux ne
sont pas sensibles à la casse.</p>
-<p>Les drapeaux qui modifient les métadonnées associées à la requête
-(T=, H=, E=) n'ont aucun effet dans un contexte de répertoire ou de
-fichier htaccess, lorsqu'une substitution (autre que '-') est effectuée
-au cours de la même passe du processus de réécriture.
-</p>
+<p>Les drapeaux qui modifient les métadonnées associées à la requête (T=, H=,
+E=) n'ont aucun effet dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de
+répertoire</a> ou de fichier htaccess, lorsqu'une substitution (autre que
+'-') est effectuée au cours de la même passe du processus de réécriture. </p>
<p>Chaque drapeau disponible est présenté ici, avec un exemple
d'utilisation.</p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="flag_quickref">Référence rapide des drapeaux <a title="Lien permanent" href="#flag_quickref" class="permalink">¶</a></h2>
+
+<p>Les drapeaux peuvent être combinés : <code>[R=301,L]</code>, <code>[P,QSA]</code>,
+<code>[E=VAR:val,L]</code>. Cette table les groupe par fonction et les trie
+selon la fréquence de leur utilisation.</p>
+
+<table class="bordered"><tr class="header">
+ <th>Drapeau</th>
+ <th>Fonction</th>
+ <th>Effet</th>
+ <th>Combinaisons courantes</th>
+</tr>
+<tr><td colspan="4"><em><strong>Contrôle de flux</strong></em></td></tr>
+<tr class="odd">
+ <td><a href="#flag_l">[L]</a></td>
+ <td>Dernière règle</td>
+ <td>Arrête le traitement des règles (pour cette passe)</td>
+ <td>[R=301,L] [F] [G]</td>
+</tr>
+<tr>
+ <td><a href="#flag_end">[END]</a></td>
+ <td>Arrêt complet</td>
+ <td>Arrête tout le processus de réécriture (pas de réentrance dans .htaccess)</td>
+ <td>[R=301,END]</td>
+</tr>
+<tr class="odd">
+ <td><a href="#flag_s">[S=N]</a></td>
+ <td>Saut</td>
+ <td>Sauter les N prochaines règles (logique if/else)</td>
+ <td></td>
+</tr>
+<tr>
+ <td><a href="#flag_n">[N]</a></td>
+ <td>Instance suivante de la boucle</td>
+ <td>Redémarrer le traitement du jeu de règles à partir de la première
+ (attention : risque de boucle infinie)</td>
+ <td></td>
+</tr>
+<tr class="odd">
+ <td><a href="#flag_c">[C]</a></td>
+ <td>Chaînage</td>
+ <td>Chaîner la règle actuelle à la prochaine ; si la règle actuelle échoue,
+ sauter les règles chaînées</td>
+ <td></td>
+</tr>
+<tr><td colspan="4"><em><strong>Redirection et mandatement</strong></em></td></tr>
+<tr class="odd">
+ <td><a href="#flag_r">[R=code]</a></td>
+ <td>Redirection</td>
+ <td>Redirection externe (par défaut 302). Utilisez Redirect/RedirectMatch pour
+ les cas simple</td>
+ <td>[R=301,L] [R=302,L]</td>
+</tr>
+<tr>
+ <td><a href="#flag_p">[P]</a></td>
+ <td>Mandatement</td>
+ <td>Mandatement inverse vers une cible (nécessite <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>)</td>
+ <td>[P,QSA]</td>
+</tr>
+<tr class="odd"><td colspan="4"><em><strong>Contrôle d’accès</strong></em></td></tr>
+<tr>
+ <td><a href="#flag_f">[F]</a></td>
+ <td>Interdiction</td>
+ <td>Renvoie 403 (implique [L])</td>
+ <td></td>
+</tr>
+<tr class="odd">
+ <td><a href="#flag_g">[G]</a></td>
+ <td>Parti</td>
+ <td>Renvoie 410 (implique [L])</td>
+ <td></td>
+</tr>
+<tr><td colspan="4"><em><strong>URL / chaîne de paramètres</strong></em></td></tr>
+<tr class="odd">
+ <td><a href="#flag_qsa">[QSA]</a></td>
+ <td>Ajout de la chaîne de paramètres</td>
+ <td>Ajout de la chaîne de paramètres originelle à la substitution</td>
+ <td>[QSA,L] [P,QSA]</td>
+</tr>
+<tr>
+ <td><a href="#flag_qsd">[QSD]</a></td>
+ <td>Suppression de la chaîne de paramètres</td>
+ <td>Supprime entièrement la chaîne de paramètres</td>
+ <td>[R=301,QSD,L]</td>
+</tr>
+<tr class="odd">
+ <td><a href="#flag_b">[B]</a></td>
+ <td>Échappement des références arrières</td>
+ <td>Réencode les caractères spéciaux dans les références arrières</td>
+ <td>[B,PT]</td>
+</tr>
+<tr>
+ <td><a href="#flag_ne">[NE]</a></td>
+ <td>Pas d’échappement</td>
+ <td>Pas d’échappement des caractères spéciaux dans la sortie (pass #, ? through)</td>
+ <td>[R=301,NE,L]</td>
+</tr>
+<tr class="odd"><td colspan="4"><em><strong>Metadonnées et gestionnaires</strong></em></td></tr>
+<tr>
+ <td><a href="#flag_e">[E]</a></td>
+ <td>Définition d’une variable d’environnement</td>
+ <td>Définit une variable d’environnement</td>
+ <td>[E=VAR:val,L]</td>
+</tr>
+<tr class="odd">
+ <td><a href="#flag_t">[T]</a></td>
+ <td>Type MIME</td>
+ <td>Forçage du type de contenu</td>
+ <td></td>
+</tr>
+<tr>
+ <td><a href="#flag_h">[H]</a></td>
+ <td>Gestionnaire</td>
+ <td>Forçage d’un gestionnaire de contenu</td>
+ <td></td>
+</tr>
+<tr class="odd">
+ <td><a href="#flag_pt">[PT]</a></td>
+ <td>Transmission résultat</td>
+ <td>Transmission du résultat au gestionnaire suivant (requis pour Alias/ScriptAlias)</td>
+ <td>[PT,L]</td>
+</tr>
+<tr><td colspan="4"><em><strong>Cookie</strong></em></td></tr>
+<tr class="odd">
+ <td><a href="#flag_co">[CO]</a></td>
+ <td>Définir un cookie</td>
+ <td>Définir un cookie HTTP pour la réponse</td>
+ <td>[CO=name:val:.domain,R=302,L]</td>
+</tr>
+</table>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_b">B (échappement dans les références arrières) <a title="Lien permanent" href="#flag_b" class="permalink">¶</a></h2>
<p>Pour définir la liste des caractères à échapper de cette manière, voir <a href="#flag_bne">#flag_bne</a> et <a href="#flag_bctls">#flag_bctls</a></p>
+<p>Voir <a href="tech.html#encoding">Encodage et décodage des URLs</a> pour une
+explication détaillée de la manière dont httpd décode les URIs avant la mise en
+correspondance des motifs.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_bnp">BNP|backrefnoplus (ne pas échapper
<p>Ce drapeau est disponible à partir de la version 2.4.26 du serveur HTTP
Apache.</p>
+<p>Voir <a href="tech.html#encoding">Encodage et décodage des URLs</a> pour
+découvrir la manière dont l’encodage est géré dans le tube (pipeline) de
+réécriture.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_bctls">BCTLS <a title="Lien permanent" href="#flag_bctls" class="permalink">¶</a></h2>
RewriteRule "^search/(.*)$" "/search.php/$1" "[BCTLS]"</pre>
-<p>Ce drapeau est disponible à partir de la version 2.5.1 du serveur HTTP
+<p>Ce drapeau est disponible à partir de la version 2.4.57 du serveur HTTP
Apache.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
RewriteRule "^search/(.*)$" "/search.php?term=$1" "[B,BNE=/]"</pre>
-<p>Ce drapeau est disponible à partir de la version 2.5.1 du serveur HTTP
+<p>Ce drapeau est disponible à partir de la version 2.4.57 du serveur HTTP
Apache.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
elle ne s'applique pas, la règle suivante, ainsi que toutes les règles
chaînées qui suivent, seront sautées.</p>
+<pre class="prettyprint lang-config"># Réécrire les URLs des anciens produits vers la nouvelle application du
+# catalogue, et ajouter un paramètre de traçage — mais seulement pour ceux qui
+# sont réécrits.
+RewriteRule "^/products/([0-9]+)$" "/catalog/item/$1" [C]
+RewriteRule "^/catalog/(.*)$" "/catalog/$1?via=legacy" [QSA]</pre>
+
+
+<p>Sans le drapeau [C], la seconde règle s’appliquerait aux requêtes qui
+arrivent directement à <code>/catalog/</code>. Le chaînage des deux règles
+permet de s’assurer que la seconde règle ne s’appliquera que si la première
+s’applique.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_co">CO|cookie <a title="Lien permanent" href="#flag_co" class="permalink">¶</a></h2>
<dl>
<dt>Lifetime</dt>
<dd>La durée de vie du cookie, en minutes.</dd>
-<dd>Une valeur de 0 indique une durée de vie correspondant à la session
+<dd>Une valeur de 0 indique une durée de vie correspondant à lasession
courante du navigateur. Il s'agit de la valeur par défaut.</dd>
<dd>Une valeur négative indique que la définition du cookie doit être annulée
dans le navigateur.</dd>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_dpi">DPI|discardpath <a title="Lien permanent" href="#flag_dpi" class="permalink">¶</a></h2>
-<p>Avec le drapeau DPI, la partie PATH_INFO de l'URI
-réécrit est supprimée.</p>
-<p>Ce drapeau est disponible dans les versions 2.2.12 et supérieures.</p>
-<p>Dans un contexte de répertoire, l'URI mis en comparaison par chaque
-règle <code class="directive">RewriteRule</code> est la concaténation des
-valeurs courantes de l'URI et de PATH_INFO.</p>
-
-<p>L'URI courant peut être l'URI initial tel qu'il a été fourni par le
+<p>Avec le drapeau DPI, la partie <a class="glossarylink" href="../glossary.html#pathinfo" title="voir glossaire">PATH_INFO</a>
+qui a été ajoutée au <a class="glossarylink" href="../glossary.html#urlpath" title="voir glossaire">chemin d’URL</a> réécrit est
+supprimée.</p>
+
+<p>Dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>, le
+<a class="glossarylink" href="../glossary.html#urlpath" title="voir glossaire">chemin d’URL</a> que compare chaque
+<code class="directive">RewriteRule</code> est la concaténation des valeurs courantes du
+chemin d’URL et de PATH_INFO.</p>
+
+<p>Le chemin d’URL actuel peut être le chemin initial tel qu'il a été fourni par le
client, le résultat d'une passe précédente du processus de réécriture,
-ou le résultat de la règle précédente dans le processus courant de
+ou le résultat de la règle précédente de la passe actuelle du processus de
réécriture.</p>
-<p>Par contre, la partie PATH_INFO ajoutée à l'URI avant chaque règle ne
-reflète que la valeur de PATH_INFO avant la passe courante du processus
-de réécriture. En conséquence, si de larges portions de l'URI
-correspondent et sont traduites via plusieurs directives
+<p>Par contre, la partie PATH_INFO ajoutée au chemin d’URL avant chaque règle ne
+reflète que la valeur de PATH_INFO avant la passe actuelle du processus
+de réécriture. En conséquence, si de larges portions du chemin d’URL
+correspondent et sont copiées dans une substitution via plusieurs directives
<code class="directive">RewriteRule</code>, sans prendre en compte
-quelles parties de l'URI provenaient du PATH_INFO courant, l'URI final
+quelles parties du chemin d’URL provenaient du PATH_INFO actuel, le chemin d’URL final
pourra se voir ajouter plusieurs copies de PATH_INFO.</p>
<p>Utilisez ce drapeau pour toute substitution où la présence du PATH_INFO qui
courante du processus de réécriture ne sera pas achevée. Les règles
suivantes de cette passe ne verront que le résultat direct des
substitutions, sans aucun PATH_INFO ajouté.</p>
+
+<pre class="prettyprint lang-config"># Requête : /app/script.php/extra/path (PATH_INFO contient /extra/path)
+# Sans le drapeau DPI, la substitution serait "script.php/extra/path" et
+# pourrait par accident copier PATH_INFO dans le résultat.
+RewriteRule "^script\.php(.*)$" "/new-app/handler$1" [DPI]</pre>
+
+
+<p>Le drapeau DPI supprime <code>/extra/path</code>, de sorte que seul le
+résultat de la substitution est transmis aux règles suivantes ou à la requête
+finale.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_e">E|env <a title="Lien permanent" href="#flag_e" class="permalink">¶</a></h2>
directives CustomLog.</p>
<p>L'exemple suivant définit une variable d'environnement nommée 'image'
-avec une valeur de '1' si l'URI de la requête correspond à un fichier
+avec une valeur de '1' si le chemin d’URL de la requête correspond à un fichier
image. Cette variable d'environnement est ensuite utilisée pour exclure
une telle requête du journal des accès.</p>
<p>Notez que le même effet peut être obtenu à l'aide de la directive
<code class="directive"><a href="../mod/mod_setenvif.html#setenvif">SetEnvIf</a></code>. Cette technique
est présentée à titre d'exemple et non de recommandation.</p>
+
+
+<p><strong>Définir des variables d’environnement pour tracer les réécritures</strong></p>
+
+<p>Parfois, nous souhaitons être au courant de l’état de la situation lorsque
+nous effectuons une réécriture. Par exemple, vous voudriez prendre note
+que vous avez effectué cette réécriture, de sorte que vous pourriez
+ultérieurement voir si une requête est arrivée par l’intermédaire de cette
+réécriture. Une solution pour y parvenir est la définition d’une variable
+d’environnement.</p>
+
+<pre class="prettyprint lang-config">RewriteEngine on
+RewriteRule "^/horse/(.*)" "/pony/$1" [E=<strong>rewritten:1</strong>]</pre>
+
+
+<p>Dans la suite de votre jeu de règles, vous pouvez consulter cette variable
+d’environnement en utilisant une RewriteCond :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{ENV:rewritten}" =1</pre>
+
+
+<p>Notez que les variables d’environnements ne survivent pas à une redirection
+externe. Vous devez alors utiliser le drapeau [CO] pour définir un cookie.</p>
+
+ <div class="note"><h3>Préfixe REDIRECT_ après une redirection interne</h3>
+ <p>Dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>,
+ une substitution réussie déclenche une redirection interne. Lorsque cela se
+ produit, toutes les variables d’environnement définies au cours de la passe
+ précédente — y compris celles créées avec <code>[E=VAR:VAL]</code> — sont
+ renommées par l’ajout du préfixe <code>REDIRECT_</code>. Une variable que
+ vous avez nommée <code>rewritten</code> devient ainsi
+ <code>REDIRECT_rewritten</code> dans la requête redirigée.</p>
+
+ <p>Pour tester la variable renommée, référencez-la avec le préfixe :</p>
+ </div>
+
+<pre class="prettyprint lang-config">RewriteRule "^/horses/(.*)" "/ponies/$1" [E=rewritten:1]
+
+# À la passe suivante, la variable a été renommée :
+RewriteCond "%{ENV:REDIRECT_rewritten}" =1
+RewriteRule "^/ponies/(.*)" "-" [E=seen_redirect:1,L]</pre>
+
+
+ <p>Si la requête est redirigée plusieurs fois, le préfixe est empilé :
+ <code>REDIRECT_REDIRECT_rewritten</code>, et ainsi de suite. Voir <a href="../env.html#redirect-vars">Variables REDIRECT_</a> pour la description
+ complète de ce mécanisme.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_end">END <a title="Lien permanent" href="#flag_end" class="permalink">¶</a></h2>
<p>L'utilisation du drapeau [END] permet non seulement de terminer le
processus de réécriture en cours (comme [L]), mais aussi d'empêcher tout
-processus de réécriture ultérieur dans un contexte de répertoire
-(htaccess).</p>
+processus de réécriture ultérieur dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte
+de répertoire</a>, ce qui en fait le drapeau préféré pour la plupart des
+règles de niveau répertoire.</p>
+
+<p>Dans un contexte de serveur virtuel ou global, [END] et [L] se comportent de
+manière identique. La différence entre les deux se situe dans un contexte de
+répertoire où [L] interrompt la passe actuelle, mais où le jeu de règles est à
+nouveau appliqué à l’URL réécrit. Cela peut provoquer des boucles infinies.
+[END] empêche tout processus de réécriture ultérieur en interrompant le cycle.</p>
+
+<pre class="prettyprint lang-config"># Dans .htaccess : routage de toutes les requêtes vers un contrôleur frontal
+# ici, [L] proquerait une boucle infine, pas [END]
+RewriteCond "%{REQUEST_FILENAME}" !-f
+RewriteCond "%{REQUEST_FILENAME}" !-d
+RewriteRule "^(.*)$" "/index.php" [END]</pre>
+
<p>Ceci ne s'applique pas aux nouvelles requêtes résultant d'une
redirection externe.</p>
+
+<p>Voir la discussion <a href="htaccess.html#loops">Réécritures dans un contexte
+de répertoire</a> pour une explication détaillée de la raison pour laquelle [L]
+se comporte différemment dans un contexte de répertoire, et des cas où [END]
+constitue le bon choix.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_f">F|forbidden <a title="Lien permanent" href="#flag_f" class="permalink">¶</a></h2>
<pre class="prettyprint lang-config">RewriteRule "\.exe" "-" [F]</pre>
-<p>Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce
-qui signifie que l'URI de la requête n'est pas modifié. Il n'y a aucune
-raison de réécrire un URI, si vous avez l'intention d'interdire la
+<p>Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce qui
+signifie que le chemin d’URL de la requête n'est pas modifié. Il n'y a aucune
+raison de réécrire un chemin d’URL, si vous avez l'intention d'interdire la
requête.</p>
<p>Lorsqu'on utilise [F], [L] est implicite - c'est à dire que la
que la règle courante doit être appliquée immédiatement, sans tenir
compte des règles ultérieures.</p>
-<p>Si vous utilisez des règles <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> dans des fichiers
-<code>.htaccess</code> ou des sections <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code>, il est important d'avoir quelques
-notions sur la manière dont les règles sont traitées. Pour simplifier,
-une fois les règles traitées, la requête réécrite est passée à nouveau
-au moteur d'interprétation des URLs afin que ce dernier puisse la
-traiter. Il est possible qu'au cours du traitement de la requête
-réécrite, le fichier <code>.htaccess</code> ou la section <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code> soient à nouveau
-rencontrés, entraînant un nouveau traitement du jeu de règles depuis le
-début. Cette situation se présente le plus souvent lorsqu'une des règles
-provoque une redirection - interne ou externe - ce qui réinitialise le
-traitement de la requête.</p>
-
-<p>Si vous utilisez des directives <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> dans un de ces contextes,
-il importe par conséquent de prévoir explicitement des étapes permettant
-d'éviter un bouclage infini sur les règles,
-et de ne pas compter seulement sur
-le drapeau [L] pour terminer l'exécution d'une série de règles, comme
-décrit ci-dessous.</p>
-
-<p>Un autre drapeau, [END], permet non seulement d'interrompre le cycle
-courant du processus de réécriture, mais aussi d'empêcher toute
-réécriture ultérieure dans le contexte de répertoire (htaccess). Ceci ne
-s'applique pas aux nouvelles requêtes résultant de redirections
-externes.</p>
+<p>Dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>, [L]
+arrête la passe actuelle du jeu de règles, mais la requête réécrite peut être
+traitée à nouveau depuis le début du jeu de règles — ce qui peut provoquer des
+boucles infinies. Pour éviter ce problème, utilisez le drapeau <a href="#flag_end">[END]</a>, ou consultez le document <a href="htaccess.html#loops">Réécritures au niveau répertoire</a> pour une
+description détaillée du problème et des solutions alternatives.</p>
<p>Dans l'exemple donné ici, toute requête est réécrite en
<code>index.php</code>, la requête originale étant ajoutée comme chaîne
<p>Vous pouvez vous représenter ce traitement comme une boucle
<code>while</code> : tant que le modèle de la règle correspond (c'est à
-dire, tant que l'URI contient un <code>A</code>),
+dire, tant que le chemin d’URL contient un <code>A</code>),
effectuer la substitution (c'est à dire, remplacer le <code>A</code> par
un <code>B</code>).</p>
<h2 id="flag_nc">NC|nocase <a title="Lien permanent" href="#flag_nc" class="permalink">¶</a></h2>
<p>Avec le drapeau [NC], le modèle de la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est comparé à la requête de
manière insensible à la casse. C'est à dire que cette comparaison
-s'effectue sans tenir compte des majuscules/minuscules dans l'URI
+s'effectue sans tenir compte des majuscules/minuscules dans le chemin URL
comparé.</p>
<p>Dans l'exemple suivant, toute requête pour un fichier image sera
qui aurait provoqué un code d'erreur "404 Not Found".
</p>
+<p>Voir <a href="tech.html#encoding">Encodage et décodage des URLs</a> pour une
+description complète de la manière dont httpd encode et décode les URLs lors de
+la réécriture.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_ns">NS|nosubreq <a title="Lien permanent" href="#flag_ns" class="permalink">¶</a></h2>
d'une page html, ne sont pas des sous-requêtes - le navigateur les
appelle sous forme de requêtes HTTP à part entière.
</p>
+
+<pre class="prettyprint lang-config"># Ne réécrire que les requêtes directes vers le contrôleur frontal, pas les
+# sous-requêtes des inclusions SSI ou de mod_dir.
+RewriteCond "%{REQUEST_FILENAME}" !-f
+RewriteCond "%{REQUEST_FILENAME}" !-d
+RewriteRule "^(.*)$" "/app/index.php?page=$1" [NS,L]</pre>
+
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_p">P|proxy <a title="Lien permanent" href="#flag_p" class="permalink">¶</a></h2>
toute règle ultérieure sera ignorée.</p>
<p>
-Vous devez vous assurer que la chaîne de substitution soit un URI valide
+Vous devez vous assurer que la chaîne de substitution soit un URL valide
(commençant typiquement par <code>http://</code><em>nom-serveur</em>)
qui puisse être traitée par le module <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>. Dans
le cas contraire, le module mandataire vous renverra une erreur.
<div class="warning">
<h3>Avertissement à propos de la sécurité</h3>
- <p>Lors de la construction de l'URL cible de la règle, il convient
- de prendre en compte l'impact en matière de sécurité qu'aura le
- fait de permettre au client d'influencer le jeu d'URLs pour
- lesquelles votre serveur agira en tant que mandataire.
- Assurez-vous que la partie protocole://nom-serveur de l'URL soit
- fixe, ou ne permette pas au client de l'influencer induement.</p>
+ <p>Lors de la construction de l'URL cible de la règle, il convient de
+ prendre en compte l'impact en matière de sécurité qu'aura le fait de
+ permettre au client d'influencer le jeu d'URLs pour lesquelles votre
+ serveur agira en tant que mandataire. Si une partie de l’URL cible est
+ dérivée de l’entrée de l’utilisateur (références arrières, chaînes de
+ paramètres, etc.), un attaquant pourra être capable de faire que votre
+ serveur génère des requêtes vers des hôtes internes ou externes
+ arbitraires. Cette vulnérabilité est connue sous le nom de falsification
+ de requête côté serveur (Server-Side Request Forgery — SSRF). Assurez-vous
+ que la partie protocole://nom-serveur de l'URL soit fixe, ou ne permette
+ pas au client de l'influencer indument.</p>
</div>
<div class="warning">
<p>
Par défaut, la cible (ou chaîne de substitution) d'une règle
RewriteRule est sensée être un chemin de fichier. Avec le drapeau [PT],
-par contre, elle est traitée comme un URI. Autrement dit, avec le
+par contre, elle est traitée comme un chemin URL. Autrement dit, avec le
drapeau [PT], le résultat de la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est passé à nouveau au
système de mise en correspondance des URLs avec le système de fichiers,
de façon à ce que les systèmes de mise en correspondance basés sur les
<div class="section">
<h2 id="flag_qsa">QSA|qsappend <a title="Lien permanent" href="#flag_qsa" class="permalink">¶</a></h2>
<p>
-Quand l'URI de remplacement contient une chaîne de requête, le
+Quand l'URL de remplacement contient une chaîne de requête, le
comportement par défaut de la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est de supprimer la <code>
query string</code> (il s'agit des paramètres éventuellement passés dans l'URL après le
caractère <code>?</code>, usuellement pour les formulaires traités par la
<div class="section">
<h2 id="flag_qsd">QSD|qsdiscard <a title="Lien permanent" href="#flag_qsd" class="permalink">¶</a></h2>
<p>
-Lorsque l'URI de la requête contient une chaîne de paramètres, et si
+Lorsque l'URL de la requête contient une chaîne de paramètres, et si
l'URI cible n'en contient pas, le comportement par défaut de la
directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> consiste à copier cette
-chaîne de paramètres dans l'URI cible. Avec le drapeau [QSD], la chaîne
+chaîne de paramètres dans l'URL cible. Avec le drapeau [QSD], la chaîne
de paramètres est supprimée.
</p>
</p>
<p>
-Si l'URI cible possède une chaîne de paramètres, le comportement par
+Si l'URL cible possède une chaîne de paramètres, le comportement par
défaut sera respecté - c'est à dire que la chaîne de paramètres
originale sera supprimée et remplacée par la chaîne de paramètres de
-l'URI cible.
+l'URL cible.
</p>
+<pre class="prettyprint lang-config"># Redirection des anciens URLs « search » vers le nouveau chemin en supprimant
+# la chaîne de paramètres. /search?q=term&page=2 devient /find (chaîne de
+# paramètres supprimée)
+RewriteRule "^/search" "/find" [QSD,R=301,L]</pre>
+
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_qsl">QSL|qslast <a title="Lien permanent" href="#flag_qsl" class="permalink">¶</a></h2>
substitution, il est alors possible d'ajouter un point d'interrogation à la fin
et d'utiliser ce drapeau.</p>
+<p>Par exemple, si une application patrimoniale attend une chaîne de paramètres
+qui contient elle-même un point d’interrogation :</p>
+
+<pre class="prettyprint lang-config"># Associe /lookup/foo?bar à /app?type=foo?bar
+# Sans [QSL], le premier ? dans la substitution couperait le chemin, en
+# produisant incorrectement /app avec la chaîne de paramètres type=foo?bar.
+# Avec [QSL], le DERNIER ? est utilisé comme délimiteur.
+RewriteRule "^/lookup/(.*)" "/app?type=$1" [QSL,PT]</pre>
+
+
+<p>Sans [QSL], la substitution <code>/app?type=foo?bar</code> serait coupée au
+premier <code>?</code>, perdant de ce fait le point d’interrogation littéral de
+la valeur.</p>
+
<p>Ce drapeau est disponible à partir de la version 2.4.19 du serveur HTTP
Apache.</p>
<p>
Vous utiliserez presque toujours [R] en conjonction avec [L] (c'est à
-dire [R,L]), car employé seul, le drapeau [R] préfixe l'URI avec
+dire [R,L]), car employé seul, le drapeau [R] préfixe le chemin URL avec
<code>http://cet-hôte[:ce-port]</code>, mais passe ensuite cette adresse
à la règle suivante, ce qui provoquera le plus souvent des
avertissements 'Invalid URI in request'.
spécification de HTTP. Utiliser un code d'état non reconnu provoquera une erreur
500 et l'enregistrement d'un message dans le journal des erreurs.</p>
+<div class="warning"><h3>[R=4xx] ne sert pas la substitution</h3>
+<p>Lorsqu’un code d’état en dehors de l’intervalle 300-399 est spécifié (par
+exemple <code>[R=403]</code> ou <code>[R=410]</code>), la chaîne de substitution
+est ignorée. L’URL que vous avez saisi comme cible n’est pas servi au client. À
+la place, httpd renvoie le code d’état spécifié et le traite de la manière
+habituelle pour les réponses d'erreur (entre autres tout <code class="directive"><a href="../mod/core.html#errordocument">ErrorDocument</a></code> configuré). Si vous souhaitez interdire
+l’accès, les drapeaux <a href="#flag_f">[F]</a> et <a href="#flag_g">[G]</a>
+sont des solutions plus adaptées pour exprimer la même intention.</p>
+</div>
+
+<pre class="prettyprint lang-config"># Redirection des requêtes pour l’ancien chemin de la documentation vers le
+# nouvel emplacement.
+RewriteRule "^/docs/(.*)$" "http://docs.example.com/$1" [R=301,L]</pre>
+
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_s">S|skip <a title="Lien permanent" href="#flag_s" class="permalink">¶</a></h2>
-<p>Le drapeau [S] sert à sauter des règles que vous ne voulez pas voir
-exécuter. La syntaxe du drapeau [S] est [S=<em>N</em>], où
-<em>N</em> correspond au nombre de règles à sauter (sous
-réserve que la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> corresponde et qu'au moins
-une condition <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code>
-préalable soit vérifiée).
-Ceci peut s'interpréter comme une instruction
-<code>goto</code> dans votre jeu de règles de réécriture. Dans
-l'exemple suivant, nous ne voulons exécuter la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> que si l'URI demandé ne
-correspond pas à un fichier existant.</p>
+<p>Le drapeau [S] sert à sauter des règles que vous ne voulez pas voir exécuter.
+La syntaxe du drapeau [S] est [S=<em>N</em>], où <em>N</em> correspond au nombre
+de règles à sauter (sous réserve que la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> corresponde et qu'au moins une
+condition <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> préalable soit
+vérifiée). Ceci peut s'interpréter comme une instruction <code>goto</code>
+dans votre jeu de règles de réécriture. Dans l'exemple suivant, nous ne voulons
+exécuter la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> que si
+le chemin URL demandé ne correspond pas à un fichier existant.</p>
<pre class="prettyprint lang-config"># La requête concerne-t-elle un fichier qui n'existe pas ?
RewriteCond "%{REQUEST_FILENAME}" !-f
RewriteCond "%{REQUEST_FILENAME}" !-d
RewriteRule "(.*\.html)" "docs.php?$1"</pre>
-
-
<p>Cette technique trouve son utilité dans le fait qu'une directive
<code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> ne s'applique
qu'à la règle qui la suit immédiatement. Ainsi, si vous voulez
<div class="section">
<h2 id="flag_unsafe_allow_3f">UnsafeAllow3F <a title="Lien permanent" href="#flag_unsafe_allow_3f" class="permalink">¶</a></h2>
<p>Il est nécessaire de définir ce drapeau pour permettre à une réécriture
- de continuer si la requête HTTP en cours d'écriture possède un point d'interrogation encodé, « %3f », et si le résultat réécrit contient un « ? » dans
- la substitution. Cela protège d'une URL malveillante tirant avantage d'une
- capture et d'une resubstitution du point d'interrogation encodé.</p>
+ de continuer si la requête HTTP en cours d'écriture possède un point
+ d'interrogation encodé, « %3f », et si le résultat réécrit
+ contient un « ? » dans la substitution. Cela protège d'une URL
+ malveillante tirant avantage d'une capture et d'une resubstitution du point
+ d'interrogation encodé.</p>
+
+<pre class="prettyprint lang-config"># Un contrôleur frontal PHP qui route toutes les requêtes via un élément de la
+# chaîne de paramètres.
+# Sans UnsafeAllow3F, une requête comme /page%3Fname=test renverrait 403 Forbidden,
+# car le substitution réécrite contient '?' alors que la requête originelle
+# contient un caractère encodé '%3F'.
+RewriteCond "%{REQUEST_FILENAME}" !-f
+RewriteCond "%{REQUEST_FILENAME}" !-d
+RewriteRule "(.+)" "index.php?route=$1" [L,QSA,UnsafeAllow3F]</pre>
+
+
+<div class="warning">
+L’existence de ce drapeau est due à <a href="https://www.cve.org/CVERecord?id=CVE-2024-38474">CVE-2024-38474</a>. Ne
+l’utilisez que dans les règles pour lesquelles vous êtes certain qu’un
+<code>%3F</code> saisi par l’utilisateur dans la requête ne peut pas être
+exploité pour manipuler la chaîne de paramètres de la cible de substitution.
+Préférez autant que possible la restructuration des URLs pour éviter les points
+d’interrogation encodés.
+</div>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_unsafe_prefix_stat">UnsafePrefixStat <a title="Lien permanent" href="#flag_unsafe_prefix_stat" class="permalink">¶</a></h2>
l'échelle du serveur qui commencent par une variable ou une référence
arrière et se résolvent en un chemin du système de fichiers. Ces
substitutions ne sont pas préfixées par la racine des documents. Cela protège
- d'une URL malveillante faisant correspondre la substitution expansée à un
+ d'un URL malveillant faisant correspondre la substitution développée à un
emplacement non souhaité du système de fichiers.</p>
<p>Disponible à partir de la version 2.5.1 du serveur HTTP Apache.</p>
- </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+
+<pre class="prettyprint lang-config"># Cette règle lance la substitution avec une référence arrière.
+# Depuis la version 2.4.60, cette opération est rejetée par défaut pour empêcher
+# le chemin développé de s’échapper de la racine des documents (CVE-2024-38475).
+# N’ajoutez UnsafePrefixStat qu’après avoir vérifié que la substitution ne peut
+# pas se résoudre en un chemin du système de fichiers en dehors de la racine des
+# documents de votre site.
+RewriteRule "^/mirror/(.+)$" "$1" [PT,UnsafePrefixStat]</pre>
+
+
+<div class="warning">
+L’existence de ce drapeau est due à <a href="https://www.cve.org/CVERecord?id=CVE-2024-38475">CVE-2024-38475</a>. Sans
+lui, une substitution commençant par une référence arrière ou une variable qui
+correspond à un chemin existant du système de fichiers pourrait permettre à des
+requêtes de s’échapper de la racine des documents. N’utilisez ce drapeau
+qu’après avoir confirmé que la substitution est contrainte de manière adéquate.
+</div>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="flag_unc">UNC <a title="Lien permanent" href="#flag_unc" class="permalink">¶</a></h2>
<p>Définir ce drapeau empêche la fusion des slashes de début multiples tels
multiples littéraux.</p>
<p>Disponible à partir de la version 2.5.1 du serveur HTTP Apache.</p>
+
+<pre class="prettyprint lang-config"># Sous Windows, réécriture vers un partage de fichiers UNC
+# en utilisant une variable
+# Sans [UNC], les barres obliques de tête dans la substitution seraient
+# fusionnées (//server/share deviendrait /server/share).
+RewriteCond "%{HTTP_HOST}" "^(.+)\.internal$"
+RewriteRule "^/shared/(.*)$" "//%1/fileshare/$1" [UNC]</pre>
+
+
+<p>Ce drapeau n’est pertinent que sous Windows. Il empêche httpd de fusionner
+les doubles barres obliques de tête (<code>//</code>) qui sont présentes dans un
+chemin UNC lorsque ce dernier a été construit à partir d’une référence arrière
+ou d’une variable. Si la substitution commence par des doubles barres obliques
+littérales, aucun drapeau n’est nécessaire.</p>
+
</div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../de/rewrite/flags.html" hreflang="de" rel="alternate" title="Deutsch"> de </a> |
<variant outdated="yes">de</variant>
<variant>en</variant>
<variant outdated="yes">es</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
<variant outdated="yes">tr</variant>
This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
-<title>mod_rewrite et les fichiers .htaccess - Serveur HTTP Apache Version 2.5</title>
+<title>Réécritures au niveau répertoire - Serveur HTTP Apache Version 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet">
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size">
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css"><link rel="stylesheet" type="text/css" href="../style/css/prettify.css">
<img alt="" src="../images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif"></a></div>
<div id="path">
-<a href="https://www.apache.org/">Apache</a> > <a href="https://httpd.apache.org/">Serveur HTTP</a> > <a href="https://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.5</a> > <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>mod_rewrite et les fichiers .htaccess</h1>
+<a href="https://www.apache.org/">Apache</a> > <a href="https://httpd.apache.org/">Serveur HTTP</a> > <a href="https://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.5</a> > <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>Réécritures au niveau répertoire</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>Langues Disponibles: </span><a href="../de/rewrite/htaccess.html" hreflang="de" rel="alternate" title="Deutsch"> de </a> |
<a href="../tr/rewrite/htaccess.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a> |
<a href="../zh-cn/rewrite/htaccess.html" hreflang="zh-cn" rel="alternate" title="Simplified Chinese"> zh-cn </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
-<p>Ce document est un complément de la <a href="../mod/mod_rewrite.html">documentation de référence</a> du module
-<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>. Il décrit les changements apportés aux règles
-lorsqu'on utilise <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> dans les fichiers .htaccess, et
-comment travailler avec ces changements.</p>
+<p>Utiliser <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> dans les fichiers
+<code>.htaccess</code> est une des configurations dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a> les plus courantes — et les
+plus sujettes à confusion. Ce document expose les principales différences entre
+l’utilisation de règles de réécriture dans un contexte global au serveur et leur
+utilisation dans les fichiers <code>.htaccess</code>, et fournit un guide
+pratique pour éviter les pièges les plus courants.</p>
+
+<p>Pour des détails techniques de bas niveau à propos de la manière dont
+<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> traite les règles dans un contexte de répertoire,
+voir le document <a href="tech.html#InternalAPI">Détails techniques</a>.</p>
</div>
-<div id="quickview"><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en
-correspondance</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="proxy.html">Serveurs mandataires</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="advanced.html">Techniques avancées</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li></ul></div>
+<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#prerequisites">Prérequis : AllowOverride</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#path-stripping">Quel URL la règle voit-elle ?</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#rewritebase">Quand avez-vous besoin de RewriteBase ?</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#loops">Le drapeau [L] et les boucles infinies</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#rewritemap-restriction">RewriteMap ne peut pas être déclarée
+dans un fichier .htaccess</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#context-restrictions">Quels contextes peuvent accueillir des
+règles de réécriture ?</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#inheritance">Héritage des règles avec RewriteOptions</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#debugging">Débogage des règles de réécriture dans les
+fichiers .htaccess</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#caching">Mise en cache des « 301 redirects » au niveau du
+navigateur</a></li>
+</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en
+correspondance</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li><li><a href="flags.html">Drapeaux de RewriteRule</a></li><li><a href="tech.html">Détails techniques</a></li><li><a href="../mod/mod_rewrite.html#what_is_matched">Qu’est-ce qui est
+comparé ?</a></li></ul></div>
+<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="prerequisites">Prérequis : AllowOverride <a title="Lien permanent" href="#prerequisites" class="permalink">¶</a></h2>
+
+<p>Pour que des directives de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> dans un fichier
+<code>.htaccess</code> puissent être traitées, la configuration du serveur doit
+tout d’abord les autoriser de la manière suivante :</p>
+
+<pre class="prettyprint lang-config"><Directory "/var/www/htdocs">
+ AllowOverride FileInfo
+</Directory></pre>
+
+
+<p>Si au minimum <code>AllowOverride FileInfo</code> (ou <code>AllowOverride
+All</code>) n’est pas présente, toute directive de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>
+dans les fichiers <code>.htaccess</code> sera silencieusement ignorée. Si vos
+règles semblent ne pas fonctionner, il s’agit de la première chose à vérifier.</p>
+
+<p>En outre, soit <code>Options FollowSymLinks</code>, soit <code>Options
+SymLinksIfOwnerMatch</code> doit être activée pour le répertoire en question.
+Comme une règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> peut
+associer un URL à un chemin arbitraire du système de fichiers
+— fonctionnellement équivalent à un lien symbolique
+— <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> refusera d’opérer dans un contexte de répertoire
+si aucune de ces options n’est définie. Vous verrez alors l’erreur suivante :</p>
+
+<div class="example"><p><code>
+AH00670: Options FollowSymLinks and SymLinksIfOwnerMatch are both off,
+so the RewriteRule directive is also forbidden due to its similar
+ability to circumvent directory restrictions
+</code></p></div>
+
+<p>Cette restriction s’applique aux fichiers <code>.htaccess</code> et aux
+sections <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code>.</p>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="path-stripping">Quel URL la règle voit-elle ? <a title="Lien permanent" href="#path-stripping" class="permalink">¶</a></h2>
+
+<p>Dans un contexte de serveur virtuel ou global au serveur, le motif de la
+règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est comparé à
+l’ensemble du chemin d’URL, en commençant par une barre oblique. Dans un
+contexte de fichier <code>.htaccess</code>, le préfixe du répertoire est
+<strong>supprimé</strong>.</p>
+
+<p>Par exemple, si votre fichier <code>.htaccess</code> est dans
+<code>/var/www/htdocs/app/</code> et si une requête arrive pour
+<code>/app/products/widget</code>, la règle RewriteRule ne voit que
+<code>products/widget</code> — pas de barre oblique en tête, pas de préfixe
+<code>/app/</code>.</p>
+
+<p class="figure">
+ <img src="../images/rewrite_path_stripping.png" alt="Organigramme montrant la suppression du chemin, la substitution et le pipeline de RewriteBase dans un contexte de répertoire, avec trois résultats : un chemin relatif (préfixé par RewriteBase), un chemin absolu (utilisé tel quel) et un URI absolu (redirection externe)"><br>
+ <dfn>Figure :</dfn> Suppression du chemin dans un contexte de répertoire
+ et pipeline de RewriteBase
+</p>
+
+<p>Cela signifie que vous devez écrire vos motifs différemment en fonction de
+l’emplacement des règles :</p>
+
+ <table class="bordered">
+ <tr>
+ <th>Emplacement de la règle</th>
+ <th>Règle</th>
+ </tr>
+ <tr>
+ <td>Section VirtualHost</td>
+ <td><code>RewriteRule "^/app/products/(.+)$" "/app/shop.php?item=$1"</code></td>
+ </tr>
+ <tr>
+ <td>.htaccess dans /var/www/htdocs/app/</td>
+ <td><code>RewriteRule "^products/(.+)$" "shop.php?item=$1"</code></td>
+ </tr>
+ </table>
+
+<p>Notez que la version pour <code>.htaccess</code> n’a de barre oblique de tête
+ni dans le motif, ni dans la substitution. Il s’agit de la source de confusion
+la plus courante avec la réécriture dans un contexte de répertoire.</p>
+
+<p>Lorsqu’une substitution est effectuée dans un contexte de répertoire, httpd
+génère une nouvelle sous-requête interne avec l’URL réécrit en redémarrant le
+traitement de la requête depuis le début. Si la substitution est un chemin
+relatif, la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritebase">RewriteBase</a></code>
+détermine le préfixe à ajouter au chemin d’URL. Ce mécanisme de sous-requête
+peut aussi être à l’origine d’un bouclage infini des règles — voir <a href="#loops">ci-après</a>.</p>
+
+
+<div class="warning"><h3>Ne faites pas commencer vos motifs de .htaccess avec
+une barre oblique</h3>
+<p>Étant donné que le préfixe du répertoire (y compris la barre oblique de fin)
+est supprimé avant la mise en correspondance, les motifs dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a> ne correspondront
+<em>jamais</em> avec une adresse commençant par une barre oblique. Un motif
+commençant par <code>^/</code> ne correspondra jamais dans ce contexte. Une
+règle telle que <code>RewriteRule "^/foo" ...</code> placée dans un fichier
+<code>.htaccess</code> échouera silencieusement à s’appliquer à quelque requête
+que ce soit.</p>
</div>
+
+<p>Si vous devez faire une recherche de correspondance avec le chemin d’URL
+original complet (y compris le préfixe de répertoire), utilisez
+<code>%{REQUEST_URI}</code> dans une directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{REQUEST_URI}" "^/admin/"
+RewriteRule "^.*$" "-" [F]</pre>
+
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="rewritebase">Quand avez-vous besoin de RewriteBase ? <a title="Lien permanent" href="#rewritebase" class="permalink">¶</a></h2>
+
+<p>Quand <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> effectue une substitution dans un fichier
+<code>.htaccess</code>, il doit retransformer le résultat relatif en un chemin
+d’URL complet. La directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritebase">RewriteBase</a></code> lui indique quel préfixe il doit
+ajouter.</p>
+
+<p>Par défaut, <code class="directive"><a href="../mod/mod_rewrite.html#rewritebase">RewriteBase</a></code> est
+définie avec le chemin physique du fichier <code>.htaccess</code>. Dans la
+plupart des cas, cela correspond aux attentes, et vous n’avez pas besoin de la
+définir explicitement. Il y a cependant des situations où vous devrez le faire :</p>
+
+<ul>
+<li><strong>Alias ou lien symbolique :</strong> Si le répertoire est atteint via
+une directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> ou un lien
+symbolique, le chemin d’URL et le chemin du système de fichiers diffèrent, et la
+directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritebase">RewriteBase</a></code> doit être
+définie avec le chemin d’URL.</li>
+
+<li><strong>Applications de sous-répertoire :</strong> Avec les cadriciels PHP,
+il est courant de placer un fichier <code>.htaccess</code> dans un
+sous-répertoire (par exemple <code>/var/www/htdocs/myapp/</code>) et de router
+toutes les requêtes vers un contrôleur frontal :</li>
+</ul>
+
+<pre class="prettyprint lang-config"># Dans /var/www/htdocs/myapp/.htaccess
+RewriteEngine On
+RewriteBase "/myapp/"
+RewriteCond "%{REQUEST_FILENAME}" !-f
+RewriteCond "%{REQUEST_FILENAME}" !-d
+RewriteRule "^(.*)$" "index.php" [L]</pre>
+
+
+<div class="note">Dans ce cas particulier — routage de toutes les requêtes qui ne
+correspondent pas vers un contrôleur frontal — la directive <a href="avoid.html#fallback-resource">FallbackResource</a> est une alternative à
+mod_rewrite plus simple et plus efficace.</div>
+
+<p>Sans la ligne <code>RewriteBase "/myapp/"</code>, l’URL réécrit risque de se
+résoudre incorrectement, car <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> ajouterait comme
+préfixe le chemin du système de fichiers au lieu du chemin d’URL.</p>
+
+<p>Si vous utilisez des URLs absolus (commençant par <code>/</code> ou
+<code>http://</code>) dans vos substitutions, <code class="directive"><a href="../mod/mod_rewrite.html#rewritebase">RewriteBase</a></code> n’aura aucun effet, car elle ne
+s’applique qu’aux substitutions relatives.</p>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="loops">Le drapeau [L] et les boucles infinies <a title="Lien permanent" href="#loops" class="permalink">¶</a></h2>
+
+<p>Dans le contexte global du serveur, le drapeau <code>[L]</code> signifie
+« arrêter le traitement du jeu de règles ». Dans le contexte des fichiers
+<code>.htaccess</code>, il a une signification subtilement différente :
+« arrêter le traitement du jeu de règles <em>pour cette passe</em> ». Une fois
+la substitution effectuée, httpd traite à nouveau la requête depuis le début du
+jeu de règles — tout en appliquant à nouveau les règles du fichier
+<code>.htaccess</code>. Cela peut provoquer des boucles infinies.</p>
+
+<p class="figure">
+ <img src="../images/rewrite_l_flag_looping.png" alt="Organigramme montrant la manière dont le drapeau [L] provoque une boucle infinie dans un contexte de répertoire en déclenchant une sous-requête qui réexécute le jeu de règles"><br>
+ <dfn>Figure:</dfn> Risque de boucle infinie avec le drapeau [L] dans un
+ contexte de répertoire
+</p>
+
+<p>Considérez cette règle :</p>
+
+<pre class="prettyprint lang-config"># Dans .htaccess - risque de boucle infinie !
+RewriteRule "^(.*)$" "/index.php?q=$1" [L]</pre>
+
+
+<p>À la première passe, une requête pour <code>/hello</code> est réécrite en
+<code>/index.php?q=hello</code>. Puis la requête est traitée à nouveau, et
+là, <code>index.php</code> correspond encore à <code>^(.*)$</code>, et la
+requête est réécrite en <code>/index.php?q=index.php</code>. Ce processus
+continue jusqu’à ce que httpd atteigne sa limite de redirections internes et
+renvoie une erreur 500. Le message suivant sera alors enregistré dans le journal
+des erreurs :</p>
+
+<div class="example"><p><code>
+AH00124: Request exceeded the limit of 10 internal redirects due to
+probable configuration error. Use 'LimitInternalRecursion' to increase
+the limit if necessary. Use 'LogLevel debug' to get a backtrace.
+</code></p></div>
+
+<p>Il existe plusieurs méthodes pour interrompre la boucle infinie :</p>
+
+<p><strong>Option 1 : utiliser le drapeau [END] (recommandé)</strong></p>
+
+<pre class="prettyprint lang-config">RewriteRule "^(.*)$" "/index.php?q=$1" [END]</pre>
+
+
+<p>Le drapeau <code>[END]</code> (disponible depuis la version 2.3.9 de httpd)
+arrête <em>tout</em> processus de réécriture ultérieur, y compris les passes
+suivantes. Il s’agit de la méthode la plus propre pour prévenir les boucles
+infinies.</p>
+
+<p><strong>Option 2 : ajouter une condition pour empêcher le traitement des URLs déjà réécrits</strong></p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{REQUEST_FILENAME}" !-f
+RewriteCond "%{REQUEST_FILENAME}" !-d
+RewriteRule "^(.*)$" "/index.php?q=$1" [L]</pre>
+
+
+<p>Étant donné que <code>index.php</code> existe en tant que fichier, la
+condition <code>!-f</code> fait que la règle est sautée à la seconde passe.</p>
+
+<p><strong>Option 3 : vérifier la variable THE_REQUEST</strong></p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{THE_REQUEST}" "!index\.php"
+RewriteRule "^(.*)$" "/index.php?q=$1" [L]</pre>
+
+
+<p>La variable <code>%{THE_REQUEST}</code> contient la requête originelle telle
+qu’elle a été envoyée par le client et non modifiée par
+<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>. Sa vérification empêche la règle de s’appliquer aux
+URLs réécrits.</p>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="rewritemap-restriction">RewriteMap ne peut pas être déclarée
+dans un fichier .htaccess <a title="Lien permanent" href="#rewritemap-restriction" class="permalink">¶</a></h2>
+
+<p>La directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> ne peut
+être déclarée que dans un contexte de serveur virtuel ou global au serveur, pas
+dans les fichiers <code>.htaccess</code> ou les sections <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code>. Cependant, lorsqu’un mappage
+est déclaré dans la configuration globale du serveur, vous <em>pouvez</em>
+l’utiliser dans un fichier <code>.htaccess</code> :</p>
+
+<pre class="prettyprint lang-config"># Dans httpd.conf ou dans un VirtualHost
+RewriteMap product2id "txt:/etc/apache2/productmap.txt"</pre>
+
+
+<pre class="prettyprint lang-config"># Dans .htaccess - utilisation du mappage déclaré ci-avant
+RewriteEngine On
+RewriteRule "^product/(.+)$" "/prods.php?id=${product2id:$1|NOTFOUND}" [PT]</pre>
+
+
+<p>Cette restriction existe, car les fichiers <code>.htaccess</code> sont
+analysés pour chaque requête, et la répétition de l’initialisation du mappage
+(en particulier pour les types de mappage <code>dbm:</code>, <code>dbd:</code>
+et <code>prg:</code>) serait d’un coût prohibitif en ressources.</p>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="context-restrictions">Quels contextes peuvent accueillir des
+règles de réécriture ? <a title="Lien permanent" href="#context-restrictions" class="permalink">¶</a></h2>
+
+<p>Les règles de réécriture sont prises en charge dans les <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contextes de répertoire</a> (fichiers <a href="../howto/htaccess.html">.htaccess</a> et sections <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code> et <code class="directive"><a href="../mod/core.html#if"><If></a></code>).</p>
+
+<p>Bien que les règles de réécriture soient syntaxiquement autorisées dans les
+sections <code class="directive"><a href="../mod/core.html#location"><Location></a></code> et
+<code class="directive"><a href="../mod/core.html#files"><Files></a></code> (et dans leurs
+équivalents avec expressions rationnelles), cela n’est pas pris en charge et ne
+devrait jamais être nécessaire. Les substitutions relatives, en particulier,
+sont susceptibles d’échouer dans ces contextes.</p>
+
+<div class="warning"><h3>Ces conteneurs modifient silencieusement le
+comportement des réécritures</h3>
+<p>Placer une règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> dans
+une section <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code>,
+<code class="directive"><a href="../mod/core.html#if"><If></a></code> ou <code class="directive"><a href="../mod/core.html#location"><Location></a></code> — même dans un
+<code class="directive"><a href="../mod/core.html#virtualhost"><VirtualHost></a></code> dans la
+configuration globale du serveur — fait silencieusement adopter un
+comportement de <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>.
+Cela signifie que la barre oblique de tête est supprimée de l’URL avant la
+comparaison avec le motif, que les substitutions déclenchent une redirection
+interne (avec risque de boucle infinie), et que le drapeau <a href="../rewrite/flags.html#flag_l">[L]</a> n’arrête plus strictement le
+traitement — utilisez plutôt le drapeau <a href="../rewrite/flags.html#flag_end">[END]</a>.</p>
+</div>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="inheritance">Héritage des règles avec RewriteOptions <a title="Lien permanent" href="#inheritance" class="permalink">¶</a></h2>
+
+<p>Par défaut, les règles de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> ne sont <strong>pas
+héritées</strong> par les sous-répertoires. Si vous définissez des règles dans
+<code>/var/www/htdocs/.htaccess</code>, elles ne s’appliqueront qu’au
+répertoire correspondant. Un fichier <code>.htaccess</code> dans un
+sous-répertoire contient initial un jeu de règles initial vide, à moins que vous
+n’activiez explicitement l’héritage.</p>
+
+<p>La directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriteoptions">RewriteOptions</a></code>
+permet d’effectuer cette activation :</p>
+
+<dl>
+<dt><code>RewriteOptions Inherit</code></dt>
+<dd>Les règles du contexte parent sont ajoutées à la fin du jeu de règles de
+l’enfant. Le traitement des règles de l’enfant est effectué en premier, suivi du
+traitement des règles du parent. Utilisez cette fonctionnalité lorsqu’un
+sous-répertoire doit ajouter ses propre règles, tout en gardant actives les
+règles du parent.</dd>
+
+<dt><code>RewriteOptions InheritBefore</code></dt>
+<dd>Identique à <code>Inherit</code>, excepté que les règles du parent sont
+traitées avant celles de l’enfant. Cela s’avère utile lorsque le parent définit
+un motif de contrôleur frontal et que l’enfant doit ajouter des exceptions.
+Disponible depuis la version 2.4.8 de httpd.</dd>
+
+
+<dt><code>RewriteOptions InheritDown</code></dt>
+<dd>Spécifiez cette option dans le parent pour que tous les contextes enfant
+héritent des règles du parent sans avoir à spécifier <code>Inherit</code>.
+Disponible depuis la version 2.4.8 de httpd.</dd>
+
+<dt><code>RewriteOptions InheritDownBefore</code></dt>
+<dd>Identique à <code>InheritDown</code>, excepté que les règles du parent sont
+traitées avant celles des enfants. Disponible depuis la version 2.4.8 de httpd.</dd>
+
+<dt><code>RewriteOptions IgnoreInherit</code></dt>
+<dd>Spécifiez cette option dans le contexte d’un enfant pour que ce dernier
+renonce à l’héritage qui avait été forcé par l’option <code>InheritDown</code>
+d’un parent. Disponible depuis la version 2.4.8 de httpd.</dd>
+
+<dt><code>RewriteOptions MergeBase</code></dt>
+<dd>Quand l’héritage est activé, la directive <code>RewriteBase</code> de chaque
+contexte s’applique aux règles définies dans ce contexte, au lieu que la
+directive <code>RewriteBase</code> de l’enfant s’applique à toutes les règles
+héritées. Disponible depuis la version 2.4.26 de httpd.</dd>
+</dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="debugging">Débogage des règles de réécriture dans les
+fichiers .htaccess <a title="Lien permanent" href="#debugging" class="permalink">¶</a></h2>
+
+<p>Lorsque les règles de réécriture dans les fichiers <code>.htaccess</code> ne
+fonctionnent pas comme vous le souhaitez, le journal des réécritures est votre
+meilleur ami. Activez-le avec le niveau approprié :</p>
+
+<pre class="prettyprint lang-config">LogLevel alert rewrite:trace3</pre>
+
+
+<p>Avec cette directive, le journal des erreurs montre exactement comment chaque
+règle est traitée — à quoi les motifs ont été comparés, les conditions ont-elles
+été satisfaites ou non et quelles substitutions ont été effectuées. Le
+comportement du contexte de répertoire et la suppression d’une partie du
+chemin sera visible dans ces entrées du journal.</p>
+
+<div class="warning">ne conservez pas à « trace » le niveau de journalisation sur un
+serveur en production. Il génère en effet un grand volume de données en sortie
+et affecte les performances.</div>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="caching">Mise en cache des « 301 redirects » au niveau du
+navigateur <a title="Lien permanent" href="#caching" class="permalink">¶</a></h2>
+
+<p>Quand vous renvoyez une redirection <code>301 Moved Permanently</code> (via
+<code>[R=301]</code> ou <code class="directive"><a href="../mod/mod_alias.html#redirect permanent">Redirect permanent</a></code>), le navigateur est autorisé à mettre en cache
+cette réponse indéfiniment. Cela signifie que même lorsque vous aurez corrigé
+une règle de redirection incorrecte dans votre configuration, les clients qui
+font à nouveau la même requête pourront se voir redirigés vers l’ancienne
+destination (incorrecte) sans jamais contacter à nouveau votre serveur.</p>
+
+<p>Lors d’un débogage de règles de redirection, utilisez <code>[R=302]</code>
+(redirection temporaire) à la place de <code>[R=301]</code>. Ne repassez à 301
+que lorsque vous avez confirmé que la règle est correcte. Si vous avez déjà
+renvoyé un code 301, les clients affectés devront vider le cache de leur
+navigateur (ou utiliser une fenêtre privée/incognito) pour voir un comportement
+correct.</p>
+
+<div class="note">Les moteurs de recherche mettent aussi en cache les redirections 301. Un
+code 301 incorrect peut prendre des jours ou des semaines avant d’être
+réexploré, même après que la configuration a été corrigée. C’est une autre
+raison pour laquelle il vaut mieux faire ses tests avec un code 302.</div>
+
+</div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../de/rewrite/htaccess.html" hreflang="de" rel="alternate" title="Deutsch"> de </a> |
<a href="../en/rewrite/htaccess.html" hreflang="en" rel="alternate" title="English"> en </a> |
<variant outdated="yes">de</variant>
<variant>en</variant>
<variant outdated="yes">es</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
<variant outdated="yes">tr</variant>
<a href="../tr/rewrite/remapping.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a> |
<a href="../zh-cn/rewrite/remapping.html" hreflang="zh-cn" rel="alternate" title="Simplified Chinese"> zh-cn </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<p>Ce document est un complément à la <a href="../mod/mod_rewrite.html">Documentation de référence</a> de
nombreux exemples d'utilisation courante de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> avec une
description détaillée de leur fonctionnement.</p>
-<div class="warning">Vous devez vous attacher à comprendre le
-fonctionnement des exemples, car la plupart d'entre eux ne
-fonctionneront pas sur votre système si vous vous contentez de les
-copier/coller dans vos fichiers de configuration.</div>
-
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#old-to-new">De l'ancienne à la nouvelle URL (en interne)</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#https-redirect">Forcer HTTPS</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#acme-exemption">Exempter les requêtes de défi ACME de la redirection HTTPS</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#trailing-slash">Normalisation de la barre oblique de fin</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#front-controller">Contrôleur frontal / Routage d’pplication</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#old-to-new-extern">De l'ancien au nouveau (en externe)</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#movehomedirs">Ressource déplacée vers un autre serveur</a></li>
-<li><img alt="" src="../images/down.gif"> <a href="#static-to-dynamic">De statique à dynamique</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#backward-compatibility">Compatibilité ascendante dans le cadre d'une modification
d'extension de nom de fichier</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#canonicalhost">Noms d'hôtes canoniques</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#multipledirs">Recherche de pages dans plus d'un répertoire</a></li>
-<li><img alt="" src="../images/down.gif"> <a href="#archive-access-multiplexer">Redirection vers des serveurs géographiquement distribués</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#canonicalurl">URLs canoniques</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#moveddocroot">Déplacement du répertoire <code>DocumentRoot</code></a></li>
-<li><img alt="" src="../images/down.gif"> <a href="#fallback-resource">Ressource par défaut</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#rewrite-query">Rewrite query string</a></li>
-</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="access.html">Contrôler l'accès</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="proxy.html">Serveurs mandataires</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="advanced.html">Techniques avancées</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li></ul></div>
+<li><img alt="" src="../images/down.gif"> <a href="#structuredhomedirs">Répertoires utilisateur structurés</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#redirectanchors">Redirection vers une ancre</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#time-dependent">Réécriture dépendant du temps</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#on-the-fly-content">Régénération du contenu à la volée</a></li>
+</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="htaccess.html">Réécritures par répertoire</a></li><li><a href="flags.html">Drapeaux des règles RewriteRule</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li><li><a href="tech.html">Détails techniques</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="old-to-new">De l'ancienne à la nouvelle URL (en interne) <a title="Lien permanent" href="#old-to-new" class="permalink">¶</a></h2>
<pre class="prettyprint lang-config">RewriteEngine on
RewriteRule "^<strong>/foo</strong>\.html$" "<strong>/bar</strong>.html" [PT]</pre>
+ </dd>
+</dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="https-redirect">Forcer HTTPS <a title="Lien permanent" href="#https-redirect" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Rediriger toutes les requêtes HTTP vers HTTPS. C’est un des
+ emplois les plus courants de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>, mais dans la
+ plupart des cas, on y parvient d’une meilleur façon sans lui.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+
+ <p>L’approche préférée utilise une directive <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code> dans un serveur virtuel HTTP
+ dédié :</p>
+
+<pre class="prettyprint lang-config"><VirtualHost *:80>
+ ServerName www.example.com
+ Redirect permanent "/" "https://www.example.com/"
+</VirtualHost>
+
+<VirtualHost *:443>
+ ServerName www.example.com
+ # ... emplacement de la configuration SSL
+</VirtualHost></pre>
+
+
+ </dd>
+
+ <dt>Explication :</dt>
+
+ <dd>
+ <p>Si vous n’avez pas accès à la configuration du serveur et devez
+ utiliser un fichier <code>.htaccess</code>, <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>
+ sera l’outil approprié :</p>
+
+<pre class="prettyprint lang-config">RewriteEngine On
+RewriteCond "%{HTTPS}" !=on
+RewriteRule "^(.*)" "https://%{SERVER_NAME}$1" [R=301,L]</pre>
+
+
+ <p>La variable <code>%{HTTPS}</code> est définie à <code>on</code> si
+ la connexion utilise SSL/TLS, et est vide ou à <code>off</code> dans le
+ cas contraire. Utiliser <code>R=301</code> produit une redirection
+ permanente qui signale aux moteurs de recherche qu’ils doivent mettre
+ leur index à jour.</p>
+
+ <p>Voir aussi le document <a href="avoid.html#redirect">Quand ne pas
+ utiliser mod_rewrite</a> pour plus de discussions à propos de l’approche
+ <code>Redirect</code>.</p>
+
+ <div class="note"><h3>Derrière un répartiteur de charge ou un terminateur SSL</h3>
+ <p>La variable <code>%{HTTPS}</code> n’est pas une variable
+ d’environnement à usage général — elle interroge directement
+ <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code>. Si la terminaison SSL/TLS est effectuée au
+ niveau d'un répartiteur de charge ou d'un mandataire inverse en amont,
+ <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code> ne gère pas la connexion et <code>%{HTTPS}</code>
+ indiquera toujours <code>off</code>, même si le client originel s’est
+ connecté en HTTPS.</p>
+
+ <p>Dans cette situation, il faut plutôt consulter l’en-tête défini par le
+ mandataire en amont. La plupart des répartiteurs de charge définissent
+ <code>X-Forwarded-Proto</code> :</p>
+ </div>
+
+<pre class="prettyprint lang-config">RewriteEngine On
+RewriteCond "%{HTTP:X-Forwarded-Proto}" =http [NC]
+RewriteRule "^(.*)" "https://%{SERVER_NAME}$1" [R=301,L]</pre>
+
+
+ <div class="warning">
+ <p>Ne faites confiance à <code>X-Forwarded-Proto</code> que si vous
+ contrôlez le mandataire en amont et qu'il écrase l'en-tête à chaque
+ requête. Un attaquant pourrait corrompre cet en-tête en se connectant
+ directement à votre serveur. Assurez-vous de restreindre l’accès de façon
+ que seul votre répartiteur de charge puisse atteindre le serveur dorsal,
+ ou utilisez <code class="module"><a href="../mod/mod_remoteip.html">mod_remoteip</a></code> pour valider la source.</p>
+ </div>
+
+ </dd>
+ </dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="acme-exemption">Exempter les requêtes de défi ACME de la redirection HTTPS <a title="Lien permanent" href="#acme-exemption" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Vous avez forcé tout le trafic à s’effectuer en HTTPS (comme ci-avant),
+ mais votre client ACME (Let's Encrypt, Certbot, etc.) nécessite un accès
+ en HTTP à <code>/.well-known/acme-challenge/</code> pour achever la
+ validation du domaine.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Placer une exception <em>avant</em> la règle de redirection HTTPS :</p>
+
+<pre class="prettyprint lang-config">RewriteEngine On
+RewriteRule "^/\.well-known/acme-challenge/" - [L]
+RewriteCond "%{HTTPS}" !=on
+RewriteRule "^(.*)" "https://%{SERVER_NAME}$1" [R=301,L]</pre>
+
+ </dd>
+
+ <dt>Explication :</dt>
+
+ <dd>
+ <p>La substitution matérialisée par un tiret (<code>-</code>) signifie
+ « ne pas réécrire ». En combinaison avec le drapeau <code>[L]</code>, elle
+ arrête le traitement des règles pour toute requête correspondant au chemin
+ du défi ACME, permettant à cette dernière d’être servie en HTTP. Le
+ traitement de toutes les autres requêtes continue avec la règle suivante
+ et les redirige vers HTTPS de la manière habituelle.</p>
+
+ <p>Si vous adoptez l’approche par la directive <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code> dans un serveur virtuel dédié au
+ port 80, utilisez les directives <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> et <code class="directive"><a href="../mod/mod_alias.html#redirectmatch">RedirectMatch</a></code> à la place :</p>
+
+<pre class="prettyprint lang-config"><VirtualHost *:80>
+ ServerName www.example.com
+
+ # Permettre les défis ACME sur HTTP
+ Alias "/.well-known/acme-challenge/" "/var/www/acme/.well-known/acme-challenge/"
+ <Directory "/var/www/acme/.well-known/acme-challenge">
+ Require all granted
+ </Directory>
+
+ # Tout le reste est redirigé vers HTTPS
+ RedirectMatch permanent "^/(?!\.well-known/acme-challenge/)(.*)$" "https://www.example.com/$1"
+</VirtualHost></pre>
+
+
</dd>
</dl>
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="trailing-slash">Normalisation de la barre oblique de fin <a title="Lien permanent" href="#trailing-slash" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Vous souhaitez que les URLs pour des répertoires se terminent toujours
+ par une barre oblique ou, au contraire, que ce ne soit jamais le cas.
+ Il s’agit d’un prérequis courant pour SEO et pour la gestion cohérente des
+ URLs par les applications web.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Pour ajouter une barre oblique de fin aux URLs qui correspondent à des
+ répertoires :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{REQUEST_FILENAME}" -d
+RewriteCond "%{REQUEST_URI}" "!/$"
+RewriteRule "^(.*)$" "$1/" [R=301,L]</pre>
+
+
+ <p>Pour supprimer la barre oblique de fin (sauf pour les véritables
+ répertoires) :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{REQUEST_FILENAME}" !-d
+RewriteCond "%{REQUEST_URI}" "(.+)/$"
+RewriteRule "^" "%1" [R=301,L]</pre>
+
+
+ </dd>
+
+ <dt>Explication :</dt>
+
+ <dd>
+ <p>Le module <code class="module"><a href="../mod/mod_dir.html">mod_dir</a></code> de httpd gère déjà les redirections
+ de barre oblique de fin pour les véritables répertoires lorsque la
+ directive <code class="directive"><a href="../mod/mod_dir.html#directoryslash">DirectorySlash</a></code> est
+ activée (elle l’est par défaut). Vous n’avez besoin que d’une règle de
+ <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> si vous souhaitez imposer un comportement
+ pour les barres obliques de fin pour les URLs qui ne correspondent pas à
+ de véritables répertoires sur disque, ou si vous voulez supprimer des
+ barres obliques de fin.</p>
+ </dd>
+</dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="front-controller">Contrôleur frontal / Routage d’pplication <a title="Lien permanent" href="#front-controller" class="permalink">¶</a></h2>
+
+
+
+ <p>La plupart des cadriciels web modernes routent toutes les requêtes vers un
+ seul point d’entrée : le contrôleur frontal (« front controller »). La
+ directive <code class="directive"><a href="../mod/mod_dir.html#fallbackresource">FallbackResource</a></code> gère cela
+ plus simplement et efficacement que <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>. Voir le
+ document <a href="avoid.html#fallback-resource">Quand ne pas utiliser
+ mod_rewrite</a> pour l’approche recommandée.</p>
+
+ <p>Si vous avez réellement besoin de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> pour cela
+ (par exemple, pour ajouter des conditions plus complexes que « fichier non
+ existant »), consultez le document <a href="htaccess.html#rewritebase">Réécritures par répertoire</a> pour un
+ exemple annoté qui illustre aussi l’utilisation de la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritebase">RewriteBase</a></code>.</p>
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="old-to-new-extern">De l'ancien au nouveau (en externe) <a title="Lien permanent" href="#old-to-new-extern" class="permalink">¶</a></h2>
</dd>
-<dt>Discussion</dt>
+<dt>Explication</dt>
<dd>
<p>Dans l'exemple <a href="#old-to-new-intern">interne</a>, on a utilisé <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> afin
Redirect "/docs/" "http://nouveau.example.com/docs/"</pre>
</dd>
- </dl>
-
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
-<div class="section">
-<h2 id="static-to-dynamic">De statique à dynamique <a title="Lien permanent" href="#static-to-dynamic" class="permalink">¶</a></h2>
-
-
-
- <dl>
- <dt>Description :</dt>
-
- <dd>
- <p>Comment transformer une page statique <code>foo.html</code>
- en sa variante dynamique <code>foo.cgi</code> de manière
- transparente, c'est à dire sans en avertir le
- navigateur/utilisateur.</p>
- </dd>
-
- <dt>Solution :</dt>
-
+ <dt>Explication :</dt>
<dd>
- <p>On réécrit simplement l'URL en script CGI et force le
- gestionnaire de contenu à <strong>cgi-script</strong> de façon
- à ce que le script s'exécute en tant que programme CGI.
- Ainsi, une requête vers <code>/~quux/foo.html</code> conduit
- en interne à l'invocation de
- <code>/~quux/foo.cgi</code>.</p>
-
-<pre class="prettyprint lang-config">RewriteEngine on
-RewriteBase "/~quux/"
-RewriteRule "^foo\.html$" "foo.cgi" [H=<strong>cgi-script</strong>]</pre>
+ <p>Pour une simple redirection vers un autre serveur, il est préférable
+ d’utiliser les directives <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code> ou <code class="directive"><a href="../mod/mod_alias.html#redirectmatch">RedirectMatch</a></code>, car elles sont plus simples
+ et plus efficaces.</p>
</dd>
</dl>
<dt>Solution :</dt>
<dd>
- <p>L'URL n'est réécrite en remplaçant l'ancienne extension par la
+ <p>L’URL n’est réécrite en remplaçant l’ancienne extension par la
nouvelle que si le fichier cible avec la nouvelle extension existe et
- si le fichier originel avec l'ancienne extension n'existe pas. Sinon,
- l'URL reste inchangée.</p>
+ si le fichier originel avec l’ancienne extension n’existe pas. Sinon,
+ l’URL reste inchangée.</p>
<pre class="prettyprint lang-config"># jeu de règles assurant une compatibilité ascendante en réécrivant<br>
</dd>
- <dt>Discussion</dt>
+ <dt>Explication</dt>
<dd>
<p>Cet exemple utilise une fonctionnalité souvent méconnue de
<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>, en tirant avantage de l'ordre d'exécution du jeu de
possibles de <strong>example.com</strong>, vous pouvez utiliser
le jeu de règles suivants :</p>
+<p>Pour faire l’inverse — supprimer le préfixe <code>www.</code> — inversez la
+condition :</p>
+
+<pre class="prettyprint lang-config">RewriteCond "%{HTTP_HOST}" "^www\.(.+)$" [NC]
+RewriteRule "^(.*)" "http://%1/$1" [L,R,NE]</pre>
+
+
+<p>Pour ajouter de manière générique <code>www.</code> à tout nom d’hôte :</p>
+
<pre class="prettyprint lang-config">RewriteCond "%{HTTP_HOST}" "!^www\." [NC]
RewriteCond "%{HTTP_HOST}" "!^$"
RewriteRule "^/?(.*)" "http://www.%{HTTP_HOST}/$1" [L,R,NE]</pre>
de configuration de votre serveur principal que dans un fichier
<code>.htaccess</code> placé dans le répertoire défini par la
directive <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> du serveur.</p>
- </dd>
- </dl>
+ </dd>
+
+ <dt>Explication :</dt>
+
+ <dd>
+ <p>Si vous avez accès à la configuration globale du serveur, une directive
+ <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code> dans un <code class="directive"><a href="../mod/core.html#serveur virtuel"><serveur virtuel></a></code> dédié constitue
+ l’approche la plus propre. Mettre sous forme canonique le nom d’hôte
+ permet de s’assurer que les moteurs de recherche traiterons votre site
+ comme une seule entité, et évite les problèmes de portée de cookie qui
+ surviennent lorsqu’un même site est accessible sous plusieurs noms.</p>
+ <p>N’utilisez la directive <code class="directive"><a href="../mod/core.html#if"><If></a></code> et <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> comme
+ compromis que si vous êtes contraint d’utiliser un fichier
+ <code>.htaccess</code>.</p>
+ </dd>
+
+</dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="multipledirs">Recherche de pages dans plus d'un répertoire <a title="Lien permanent" href="#multipledirs" class="permalink">¶</a></h2>
RewriteRule "^" "-" [PT]</pre>
</dd>
- </dl>
-
- </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
-<div class="section">
-<h2 id="archive-access-multiplexer">Redirection vers des serveurs géographiquement distribués <a title="Lien permanent" href="#archive-access-multiplexer" class="permalink">¶</a></h2>
-
-
-
- <dl>
- <dt>Description :</dt>
-
- <dd>
- <p>Notre site web possède de nombreux miroirs, et nous voulons
- rediriger les utilisateurs vers celui qui se situe dans le pays où
- ils se trouvent. </p>
- </dd>
- <dt>Solution :</dt>
-
- <dd>
- <p>En consultant le nom d'hôte du client demandeur, on détermine le
- pays dans lequel il se trouve. S'il est impossible d'effectuer une
- recherche sur leur adresse IP, on se rabat sur un serveur par
- défaut.</p>
- <p>Nous allons utiliser une directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> afin de construire une
- liste des serveurs que nous voulons utiliser.</p>
-
-<pre class="prettyprint lang-config">HostnameLookups on
-RewriteEngine on
-RewriteMap multiplex "txt:/path/to/map.mirrors"
-RewriteCond "%{REMOTE_HOST}" "([a-z]+)$ [NC]"
-RewriteRule "^/(.*)$" "${multiplex:<strong>%1</strong>|http://www.example.com/}$1" [R,L]</pre>
-
-
-<div class="example"><p><code>
-## liste_miroirs -- Table de correspondance pays - serveurs<br>
-<br>
-de http://www.exemple.de/<br>
-uk http://www.exemple.uk/<br>
-com http://www.example.com/<br>
-##EOF##
-</code></p></div>
- </dd>
+ <dt>Explication :</dt>
- <dt>Discussion</dt>
<dd>
- <div class="warning">Ce jeu de règles nécessite la définition à
- <code>on</code> de la directive <code class="directive"><a href="../mod/core.html#hostnamelookups">HostNameLookups</a></code>, ce qui peut induire une
- baisse de performance significative.</div>
-
- <p>La directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> extrait la dernière
- partie du nom d'hôte du client demandeur - le code du pays - et la
- règle de réécriture qui suit utilise cette valeur pour rechercher le
- serveur miroir approprié dans le fichier de correspondances.</p>
+ <p>Ce qui précède s’avère utile pendant les migrations lorsque le contenu
+ est déplacé d’un répertoire vers un autre. Pour une configuration
+ permanente, utilisez plutôt la directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> ou des liens symboliques.</p>
</dd>
</dl>
</dd>
</dl>
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
-<div class="section">
-<h2 id="fallback-resource">Ressource par défaut <a title="Lien permanent" href="#fallback-resource" class="permalink">¶</a></h2>
-
-
-<dl>
-<dt>Description :</dt>
-<dd>Vous voulez qu'une seule ressource (disons un certain fichier tel
-que index.php) soit servie pour toutes les requêtes à destination d'un
-certain répertoire, sauf pour celles qui concernent une ressource
-existant effectivement comme une image, ou un fichier css.</dd>
-
-<dt>Solution :</dt>
-<dd>
-<p>Depuis la version 2.2.16, vous pouvez y parvenir via la directive
-<code class="directive"><a href="../mod/mod_dir.html#fallbackresource">FallbackResource</a></code> :</p>
-
-<pre class="prettyprint lang-config"><Directory "/var/www/my_blog">
- FallbackResource index.php
-</Directory></pre>
-
-
-<p>Cependant, si vos besoins étaient plus complexes, vous pouviez, dans
-les versions plus anciennes d'Apache, utiliser un jeu de règles du style
-:</p>
-
-<pre class="prettyprint lang-config"><Directory "/var/www/my_blog">
- RewriteBase "/my_blog"
-
- RewriteCond "/var/www/my_blog/%{REQUEST_FILENAME}" !-f
- RewriteCond "/var/www/my_blog/%{REQUEST_FILENAME}" !-d
- RewriteRule "^" "index.php" [PT]
-</Directory></pre>
-
-
-<p>D'autre part, si vous voulez transmettre l'URI de la requête en tant
-que chaîne de paramètres à index.php, vous pouvez remplacer cette règle
-de réécriture par :</p>
-
-<pre class="prettyprint lang-config">RewriteRule "(.*)" "index.php?$1" [PT,QSA]</pre>
-
-
-<p>Notez que l'on peut utiliser ces jeux de règles aussi bien dans un
-fichier <code>.htaccess</code> que dans une section
-<Directory>.</p>
-
-</dd>
-
-</dl>
-
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="rewrite-query">Rewrite query string <a title="Lien permanent" href="#rewrite-query" class="permalink">¶</a></h2>
</li>
- <li>Cette solution produit l'effet inverse des précédentes ; elle
- copie des composantes du chemin (peut-être PATH_INFO) depuis l'URL
- vers sa chaîne de paramètres :
-<pre class="prettyprint lang-config"># The desired URL might be /products/kitchen-sink, and the script expects
+ <li>Cette solution produit l'effet inverse des précédentes ; elle copie des
+ composantes du chemin (peut-être <a class="glossarylink" href="../glossary.html#pathinfo" title="voir glossaire">PATH_INFO</a>) depuis l'URL vers sa chaîne de paramètres
+ : <pre class="prettyprint lang-config"># The desired URL might be /products/kitchen-sink, and the script expects
# /path?products=kitchen-sink.
RewriteRule "^/?path/([^/]+)/([^/]+)" "/path?$1=$2" [PT]</pre>
-
+
</li>
</ul>
</dd>
+<dt>Explication :</dt>
+
+<dd>
+<p>Voir aussi les drapeaux <a href="flags.html#flag_qsa">[QSA]</a> et <a href="flags.html#flag_qsd">[QSD]</a> qui permettent de contrôler si la chaîne de
+paramètres originelle est ajoutée à la fin de la substitution ou supprimée de
+cette dernière.</p>
+</dd>
+
+
</dl>
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="structuredhomedirs">Répertoires utilisateur structurés <a title="Lien permanent" href="#structuredhomedirs" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Certains sites avec plusieurs milliers d’utilisateurs possèdent une
+ organisation structurée des répertoires utilisateur, c’est-à-dire que
+ chaque répertoire utilisateur est dans un sous-répertoire qui commence
+ (par exemple) par le premier caractère du nom de l’utilisateur. Ainsi,
+ <code>/~larry/anypath</code> correspond à
+ <code>/home/<strong>l</strong>/larry/public_html/anypath</code> et
+ <code>/~waldo/anypath</code> à
+ <code>/home/<strong>w</strong>/waldo/public_html/anypath</code>.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Nous utilisons le jeu de règles suivant pour développer les URLs avec
+ tilde selon l’organisation ci-dessus.</p>
+
+<pre class="prettyprint lang-config">RewriteEngine on
+RewriteRule "^/~(<strong>([a-z])</strong>[a-z0-9]+)(.*)" "/home/<strong>$2</strong>/$1/public_html$3"</pre>
+
+ </dd>
+
+ <dt>Explication :</dt>
+
+ <dd>
+ <p>Cette technique est principalement utile pour les environnements
+ d’hébergement de grande capacité avec plusieurs milliers d’utilisateurs.
+ Pour la plupart des sites, <code class="module"><a href="../mod/mod_userdir.html">mod_userdir</a></code> gère les URLs
+ utilisateur avec tilde sans avoir besoin de <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>.</p>
+ </dd>
+ </dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="redirectanchors">Redirection vers une ancre <a title="Lien permanent" href="#redirectanchors" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Par défaut, la redirection vers une ancre HTML ne fonctionne pas, car
+ <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> échappe le caractère <code>#</code> en le
+ remplaçant par <code>%23</code>, ce qui casse la redirection.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Utiliser le drapeau <code>[NE]</code> dans la règle
+ <code>RewriteRule</code>. NE signifie « No Escape ».
+ </p>
+ </dd>
+
+ <dt>Explication :</dt>
+ <dd>Bien entendu, cette technique fonctionne aussi pour d’autres caractères
+ spéciaux que <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> encode par défaut pour les URLs.</dd>
+ </dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="time-dependent">Réécriture dépendant du temps <a title="Lien permanent" href="#time-dependent" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Nous voulons utiliser <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> pour servir des
+ contenus différents en fonction de l’heure du jour.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Il esixte de nombreuses variables nommées <code>TIME_xxx</code> à
+ utiliser dans les conditions de réécriture. En combinaison avec les motifs
+ de comparaison lexicographique spéciaux <code><STRING</code>,
+ <code>>STRING</code> et <code>=STRING</code>, nous pouvons configurer
+ des redirections dépendant du temps :</p>
+
+<pre class="prettyprint lang-config">RewriteEngine on
+RewriteCond "%{TIME_HOUR}%{TIME_MIN}" >0700
+RewriteCond "%{TIME_HOUR}%{TIME_MIN}" <1900
+RewriteRule "^foo\.html$" "foo.day.html" [L]
+RewriteRule "^foo\.html$" "foo.night.html"</pre>
+
+
+ <p>Cette configuration sert le contenu de <code>foo.day.html</code> sous
+ l’URL <code>foo.html</code> de <code>07:01</code> à <code>18:59</code> et
+ le contenu de <code>foo.night.html</code> pendant le temps restant.</p>
+
+ <div class="warning"><code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code>, les mandataires
+ intermédiaires et les navigateurs peuvent chacun mettre en cache les
+ réponses et provoquer de ce fait l’affichage d’une page en dehors de la
+ fenêtre de temps configurée. <code class="module"><a href="../mod/mod_expires.html">mod_expires</a></code> permet de
+ contrôler cet effet. Il est bien entendu préférable de simplement servir
+ le contenu de manière dynamique et de le personnaliser en fonction de
+ l’heure du jour.</div>
+
+ </dd>
+
+ <dt>Explication :</dt>
+
+ <dd>
+ <p>Servir du contenu dynamique par l’intermédiaire de votre application
+ constitue pratiquement toujours une meilleure approche. La mise en cache
+ par les navigateurs, les mandataires et <code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code> rend la
+ réécriture en fonction du temps non fiable en pratique.</p>
+ </dd>
+ </dl>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="on-the-fly-content">Régénération du contenu à la volée <a title="Lien permanent" href="#on-the-fly-content" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Nous voulons générer dynamiquement du contenu, mais le stocker ensuite
+ statiquement. La règle suivante va vérifier si le fichier
+ statique existe, et le générer dans le cas contraire. Les fichiers
+ statiques peuvent être supprimés périodiquement, si souhaité (par exemple
+ via cron) et seront régénérés à la demande.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ Pour ce faire, on utilise le jeu de règles suivant :
+
+<pre class="prettyprint lang-config"># Cet exemple n’est valable que dans un contexte de répertoire
+RewriteCond "%{REQUEST_URI}" !-U
+RewriteRule "^(.+)\.html$" "/regenerate_page.cgi" [PT,L]</pre>
+
+
+ <p>L’opérateur <code>-U</code> détermine si la chaîne de test (dans ce cas
+ <code>REQUEST_URI</code>) est un URL valable. Il effectue cette opération
+ via une sous-requête. Si cette sous-requête échoue — autrement dit, si la
+ ressource demandée n’existe pas — cette règle invoque le programme CGI
+ <code>/regenerate_page.cgi</code> qui va générer la ressource demandée et la
+ sauvegarder dans le répertoire des documents de sorte qu’une copie statique
+ puissent en être servie la prochaine fois qu’elle sera demandée.</p>
+
+ <p>Ainsi, les documents qui ne sont pas souvent mis à jour peuvent être
+ servis sous forme statique. Si ces documents doivent être rafraîchis, ils
+ peuvent être supprimés du répertoire des documents ; ils seront alors
+ régénérés la prochaine fois qu’ils seront demandés.</p>
+ </dd>
+
+ <dt>Explication :</dt>
+
+ <dd>
+ <p>Les approches modernes telles que <code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code>, les
+ couches de mise en cache CDN ou la mise en cache au niveau de
+ l’application fournissent des solutions plus robustes et configurables
+ pour servir du contenu statique pré-généré. Le test de la sous-requête de
+ l’opérateur <code>-U</code> utilisé ici induit un coût en performance à
+ chaque requête.</p>
+ </dd>
+ </dl>
+
</div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../de/rewrite/remapping.html" hreflang="de" rel="alternate" title="Deutsch"> de </a> |
<variant outdated="yes">de</variant>
<variant>en</variant>
<variant outdated="yes">es</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
<variant outdated="yes">tr</variant>
<a href="../tr/rewrite/rewritemap.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a> |
<a href="../zh-cn/rewrite/rewritemap.html" hreflang="zh-cn" rel="alternate" title="Simplified Chinese"> zh-cn </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<p>Ce document est un complément à la <a href="../mod/mod_rewrite.html">documentation de référence</a> du
fournit des exemples pour chacun des différents types de
<code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code>.</p>
- <div class="warning">Notez que la plupart de ces exemples ne
- fonctionneront pas en l'état dans le contexte de votre configuration
- particulière ; vous devez donc vous attacher à les
- comprendre, plutôt que de simplement les insérer dans votre
- configuration par copier/coller.</div>
-
- </div>
+ </div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#introduction">Introduction</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#int">int: fonction interne</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#txt">txt: tables de correspondances au format texte</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#dbm">dbm: Fichier condensé DBM</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#prg">prg: Programme de réécriture externe</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#dbd">dbd ou fastdbd: requête SQL</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#sharding">Distribution de la charge (sharding) basée sur l'URL entre plusieurs serveurs dorsaux</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#summary">Résumé</a></li>
</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module
- mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en
- correspondance</a></li><li><a href="access.html">Contrôle d'accès</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="proxy.html">Mise en cache</a></li><li><a href="advanced.html">Techniques avancées</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li></ul></div>
+ mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en correspondance</a></li><li><a href="flags.html">Drapeaux des règles de réécriture</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="htaccess.html">Réécritures par répertoire</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li><li><a href="tech.html">Détails techniques</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="introduction">Introduction <a title="Lien permanent" href="#introduction" class="permalink">¶</a></h2>
fonction interne, et insérez-la dans votre <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> :
</p>
- <p> <strong>Redirection d'un URI vers une version en minuscules
+ <p> <strong>Redirection d'un chemin d’URL vers une version en minuscules
d'elle-même</strong></p>
<pre class="prettyprint lang-config">RewriteMap lc int:tolower
RewriteRule "(.*)" "${lc:$1}" [R]</pre>
directive <code class="directive"><a href="../mod/core.html#mutex">Mutex</a></code>.</p>
<p>Voici un exemple simple qui remplace tous les tirets par des
- caractères de soulignement dans l'URI de la requête.</p>
+ caractères de soulignement dans le chemin d’URL de la requête.</p>
<p><strong>Configuration de la réécriture</strong></p>
<pre class="prettyprint lang-config">RewriteMap d2u "prg:/www/bin/dash2under.py" apache:apache
print(line.strip().replace('-', '_'), flush=True)</pre>
+ <p>Un exemple plus complet montre un motif typique pour qu’un programme de
+ correspondance prg: lise une ligne, recherche le résultat et l’affiche. La
+ sortie de diagnostic est écrite sur <code>STDERR</code> et termine sa course
+ dans le journal des erreurs de httpd.</p>
+
+ <p><strong>Configuration de la réécriture</strong></p>
+ <pre class="prettyprint lang-config">RewriteMap vhost2docroot "prg:/www/bin/vhost_lookup.py"
+RewriteRule "^/(.*)$" "${vhost2docroot:%{HTTP_HOST}}/$1"</pre>
+
+
+ <p><strong>vhost_lookup.py</strong></p>
+ <pre class="prettyprint lang-python">#!/usr/bin/env python3
+"""Associer un nom d’hôte au répertoire racine de ses documents."""
+import sys
+
+VHOSTS = {
+ "example.com": "/srv/www/example",
+ "blog.example.com": "/srv/www/blog",
+}
+
+for line in sys.stdin:
+ host = line.strip().lower()
+ docroot = VHOSTS.get(host)
+ if docroot:
+ print(docroot, flush=True)
+ else:
+ # "NULL" indique à mod_rewrite que la recherche a échoué
+ print("NULL", flush=True)
+ print(f"vhost_lookup: no match for {host!r}", file=sys.stderr)</pre>
+
+
<div class="note"><h3>Mises en garde !</h3>
<ul>
-<li>Votre programme doit être le plus
-simple possible. Si le programme se bloque, httpd va attendre
-indéfiniment une réponse de sa part, et par conséquent ne répondra plus
-aux requêtes.</li>
-<li>Assurez-vous de bien désactiver la mise en tampon dans votre
-programme. Dans l'exemple en Python ci-avant, cette opération s'effectue en
-passant <code>flush=True</code> à <code>print()</code>. Si les entrées/sorties sont mises en tampon, httpd va
-attendre une sortie, et va par conséquent se bloquer.</li>
+<li>Votre programme doit être le plus simple possible. Si le programme se
+bloque, httpd va attendre indéfiniment une réponse de sa part, et par conséquent
+ne répondra plus aux requêtes.</li>
+<li>Assurez-vous de bien désactiver la mise en tampon dans votre programme. Dans
+l'exemple en Python ci-avant, cette opération s'effectue en passant
+<code>flush=True</code> à <code>print()</code>. Si les entrées/sorties sont
+mises en tampon, httpd va attendre une sortie, et va par conséquent se bloquer.
+Il s’agit de la cause la plus courante pour laquelle le mappage prg: semble ne
+rien faire — le programme a la réponse mais httpd ne la verra jamais, car
+elle est prisonnière d’un tampon.</li>
<li>Rappelez-vous qu'il n'existe qu'une copie du programme lancé au
démarrage du serveur, et que toutes les requêtes vont devoir passer par
ce goulot d'étranglement. Ceci peut provoquer des ralentissements
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
+<h2 id="sharding">Distribution de la charge (sharding) basée sur l'URL entre plusieurs serveurs dorsaux <a title="Lien permanent" href="#sharding" class="permalink">¶</a></h2>
+
+
+
+ <dl>
+ <dt>Description :</dt>
+
+ <dd>
+ <p>Le « sharding » est une technique courante de distribution de la charge
+ de travail ou de l’espace de stockage. Lorsqu’on utilise cette méthode, un
+ serveur frontal va utiliser l’URL pour distribuer les utilisateurs ou
+ objets à des serveurs dorsaux de manière cohérente.</p>
+ </dd>
+
+ <dt>Solution :</dt>
+
+ <dd>
+ <p>Un mappage entre les utilisateurs et les serveurs cible est entretenu
+ dans des fichiers de mappage. Ces derniers sont sous la forme :</p>
+
+<div class="example"><p><code>
+utilisateur1 serveur_physique_de_utilisateur1<br>
+utilisateur2 serveur_physique_de_utilisateur2<br>
+# ... et ainsi de suite
+</code></p></div>
+
+ <p>Nous inscrivons ceci dans un fichier
+ <code>mappage.utilisateur-vers-serveur</code>. Le but est d’associer</p>
+
+<div class="example"><p><code>
+/u/utilisateur1/chemin
+</code></p></div>
+
+ <p>à</p>
+
+<div class="example"><p><code>
+http://serveur_physique_de_utilisateur1/u/utilisateur/chemin
+</code></p></div>
+
+ <p>de sorte que tous les chemins d’URL n’ont pas besoin d’être valables
+ sur chaque serveur dorsal physique. Le jeu de règles suivant fait cela
+ pour nous avec l’aide des fichiers de mappage, en supposant que server0
+ est un serveur par défaut qui sera utilisé si un utilisateur n’a pas
+ d’entrée dans le mappage :</p>
+
+<pre class="prettyprint lang-config">RewriteEngine on
+RewriteMap users-to-hosts "txt:/path/to/map.users-to-hosts"
+RewriteRule "^/u/([^/]+)/?(.*)" "http://${users-to-hosts:$1|server0}/u/$1/$2"</pre>
+
+ </dd>
+
+ <dt>Discussion :</dt>
+
+ <dd>
+ <p>Pour distribuer les requêtes aux différents serveurs dorsaux,
+ <code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> constitue une approche plus robuste et
+ configurable, avec la prise en charge d’un bilan de santé, d’une
+ pondération des charges et de la persistance des sessions. L’approche
+ basée sur un mappage txt: présentée ici est plus simple mais ne prend pas
+ en charge ces fonctionnalités.</p>
+ </dd>
+ </dl>
+
+ <p>Voir la documentation de <code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> pour une description plus complète
+ de la syntaxe de cette directive.
+</p>
+
+ </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
<h2 id="summary">Résumé <a title="Lien permanent" href="#summary" class="permalink">¶</a></h2>
<variant outdated="yes">de</variant>
<variant>en</variant>
<variant outdated="yes">es</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
<variant outdated="yes">tr</variant>
<a href="../tr/rewrite/tech.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a> |
<a href="../zh-cn/rewrite/tech.html" hreflang="zh-cn" rel="alternate" title="Simplified Chinese"> zh-cn </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<p>Ce document passe en revue certains détails techniques à propos du
module <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> et de la mise en correspondance des URLs</p>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#InternalAPI">Phases de l'API</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#order">Module Processing Order</a></li>
+<li><img alt="" src="../images/down.gif"> <a href="#encoding">Encodage et décodage des URLs</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#InternalRuleset">Traitement du jeu de règles</a></li>
</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module mod_rewrite</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en
correspondance</a></li><li><a href="flags.html">Drapeaux de réécriture</a></li><li><a href="vhosts.html">Serveurs virtuels</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="htaccess.html">Réécritures en fonction du répertoire</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li></ul></div>
s'exécute au cours de la phase Fixup.</p>
<p>Dans tous ces cas, <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> réécrit le
- <code>REQUEST_URI</code> soit vers une nouvelle URL, soit vers un
+ <code>REQUEST_URI</code> soit vers un nouvel URL, soit vers un
nom de fichier.</p>
<p>Dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>,
- les règles sont appliquées durant la phase "Fixup" après que l'URL a été
- traduite en nom de fichier. Cela modifie ce à quoi correspond le motif et la
+ les règles sont appliquées durant la phase "Fixup" après que l’URL a été
+ traduit en nom de fichier. Cela modifie ce à quoi correspond le motif et la
manière dont les substitutions sont gérées. Voir le document <a href="htaccess.html#path-stripping">Réécritures en fonction du
répertoire</a> pour des détails pratiques à propos de la suppression du
- chemin, de RewriteBase et de la manière d'éviter un bouclage.</p>
+ chemin, de RewriteBase et de la manière d’éviter un bouclage.</p>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="order">Module Processing Order <a title="Lien permanent" href="#order" class="permalink">¶</a></h2>
+
+ <p><code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> et <code class="module"><a href="../mod/mod_alias.html">mod_alias</a></code> agissent tous
+ les deux au cours de la phase de traduction de l’URL en nom de fichier, mais
+ <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> opère en premier, quel que soit l’ordre
+ d’apparition des directives dans le fichier de configuration. Ce
+ comportement est déterminé par la priorité des points d’accroche
+ qu’enregistre chaque module, pas par l’ordre du code source.</p>
+
+ <p>La conséquence pratique : lorsque des directives <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> et <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code> (ou <code class="directive"><a href="../mod/mod_alias.html#redirectmatch">RedirectMatch</a></code>) sont présentent simultanément
+ dans le même contexte de serveur virtuel ou global au serveur, les règles de
+ réécriture sont évaluées en premier. Si une règle <code>RewriteRule</code>
+ correspond et réécrit le chemin d’URL (ou renvoie une redirection),
+ <code>Redirect</code> ne verra jamais la requête.</p>
+
+<p class="figure">
+ <img src="../images/rewrite_module_order.png" alt="Comparaison côte-à-côte des ordres d’opération des modules : dans un contexte global au serveur, mod_rewrite opère en premier lors de la phase de traduction du chemin d’URL en nom de fichier, mod_alias opèrant en second ; dans un contexte de répertoire, mod_alias opère en premier lors de la phase de traduction du chemin d’URL en nom de fichier, mod_rewrite opérant plus tard lors de la phase de correction"><br>
+ <dfn>Figure :</dfn> Inversion de l’ordre d’opération des modules entre les
+ contextes global au serveur et de répertoire
+</p>
+
+ <pre class="prettyprint lang-config"># Dans cette configuration, le Redirect n’est jamais atteint pour /old,
+# car la règle RewriteRule s’applique en premier — même si
+# Redirect apparaît plus tôt dans le fichier.
+Redirect "/old" "http://example.com/new"
+RewriteRule "^/old" "/other" [L]</pre>
+
+
+ <div class="note"><h3>Le contexte de répertoire inverse l’ordre</h3>
+ <p>Dans un <a class="glossarylink" href="../glossary.html#perdirectory" title="voir glossaire">contexte de répertoire</a>,
+ la situation est différente. Les directives de <code class="module"><a href="../mod/mod_alias.html">mod_alias</a></code>
+ comme <code>Redirect</code> s’appliquent encore dans la phase de traduction
+ de l’URL en nom de fichier, mais les directives de
+ <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> s’appliquent plus tard, lors de la phase de
+ correction. Cela signifie que dans un contexte de répertoire,
+ <code>Redirect</code> est évaluée <em>avant</em> l’application des
+ règles <code>RewriteRule</code>.</p>
+ </div>
+
+ <p>Du fait de l’incohérence entre les contextes, mélanger des directives de
+ <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> et de <code class="module"><a href="../mod/mod_alias.html">mod_alias</a></code> dans la même
+ portée est une source courante de confusion. Un conseil simple : choisissez
+ un module pour une tâche donnée. Si vous avez besoin de conditions de
+ réécritures ou de comparaison de motif, utilisez exclusivement
+ <code>RewriteRule</code>. Si une simple redirection de préfixe suffit,
+ utilisez la directive <code>Redirect</code> et n’ajoutez pas de règles de
+ réécritures qui pourraient interagir avec elle.</p>
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
+<div class="section">
+<h2 id="encoding">Encodage et décodage des URLs <a title="Lien permanent" href="#encoding" class="permalink">¶</a></h2>
+
+ <p>Apache httpd supprime l’échappement des caractères encodés pour l’URL
+ dans le chemin d’URL de la requête avant que toute comparaison de motif de
+ directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> ne soit
+ effectuée. Une requête pour <code>/my%20page/cats%3Fdogs</code> est décodée
+ en <code>/my page/cats?dogs</code>, et c’est à cette chaîne décodée qu’est
+ comparé le motif de la directive <code>RewriteRule</code>.</p>
+
+ <p>Cela signifie que vous ne pouvez pas écrire un motif correspondant à la
+ forme littérale de l’URL encodé. Si vous devez distinguer
+ <code>/horses%2Fponies</code> de <code>/horses/ponies</code>, utilisez la
+ variable <code>%{THE_REQUEST}</code> dans une directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> — cette variable conserve la
+ requête originelle telle qu’elle a été envoyée par le client, avant tout
+ décodage :</p>
+
+<pre class="prettyprint lang-config"># Ne correspond qu’au caractère encodé littéral %2F,
+# pas au séparateur de chemin réel
+RewriteCond "%{THE_REQUEST}" "/horses%2F"
+RewriteRule "^/horses/ponies$" "/special-handler" [L]</pre>
+
+
+ <p>Après la substitution, <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> réencode le chemin
+ d’URL résultant en sortie. Plusieurs drapeaux permettent de contrôler ce
+ comportement :</p>
+
+ <ul>
+ <li><a href="flags.html#flag_b">[B]</a> : rétablit l’échappement des
+ références arrières de façon que les caractères spéciaux capturés dans le
+ chemin d’URL décodé ne soient pas interprétés comme des délimiteurs dans
+ la substitution.</li>
+
+ <li><a href="flags.html#flag_bnp">[BNP]</a> : si [B] est actif, ce drapeau
+ encode les espaces en <code>%20</code> au lieu de <code>+</code> (convient
+ pour les éléments du chemin, pas pour la chaîne de paramètres).</li>
+
+ <li><a href="flags.html#flag_ne">[NE]</a> : ce drapeau supprime
+ l’échappement par défaut des caractères spéciaux dans le résultat de la
+ substitution, permettant la transmission sans modification des littéraux
+ <code>#</code>, <code>?</code> et d’autres caractères lors des
+ redirections externes.</li>
+ </ul>
+
+ <h3 id="allowencodedslashes">Directive AllowEncodedSlashes</h3>
+
+
+ <p>Par défaut, httpd renvoie un code 404 pour tout URL contenant une barre
+ oblique encodée (<code>%2F</code>). La directive <code class="directive"><a href="../mod/core.html#allowencodedslashes">AllowEncodedSlashes</a></code> permet de modifier ce
+ comportement :</p>
+
+ <ul>
+ <li><code>Off</code> (valeur par défaut) : rejette <code>%2F</code> avec
+ un code 404.</li>
+ <li><code>On</code> : autorise <code>%2F</code> et le décode en
+ <code>/</code> avant de le transmettre aux gestionnaires.</li>
+ <li><code>NoDecode</code> : autorise <code>%2F</code>, mais le conserve
+ sous sa forme encodée de façon que l’application dorsale le distingue d’un
+ séparateur de chemin réel.</li>
+ </ul>
+
+ <p>Lorsqu’on utilise le drapeau <a href="flags.html#flag_b">[B]</a> avec des
+ URLs qui peuvent contenir des barres obliques encodées, il est en général
+ nécessaire d’utiliser <code>AllowEncodedSlashes NoDecode</code> pour éviter
+ que httpd ne rejette le résultat réencodé.</p>
+
+
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="InternalRuleset">Traitement du jeu de règles <a title="Lien permanent" href="#InternalRuleset" class="permalink">¶</a></h2>
- <p>Maintenant, quand <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> se lance dans ces deux phases de
- l'API, il lit le jeu de règles configurées depuis la structure
- contenant sa configuration (qui a été elle-même créée soit au
- démarrage d'Apache pour le contexte du serveur, soit lors du
- parcours des répertoires par le noyau d'Apache pour le contexte de
- répertoire). Puis le moteur de réécriture est démarré avec le jeu
- de règles contenu (une ou plusieurs règles associées à leurs
- conditions). En lui-même, le mode opératoire du moteur de
- réécriture d'URLs est exactement le même dans les deux contextes
- de configuration. Seul le traitement du résultat final diffère.</p>
-
- <p>L'ordre dans lequel les règles sont définies est important car
- le moteur de réécriture les traite selon une chronologie
- particulière (et pas très évidente). Le principe est le suivant :
- le moteur de réécriture traite les règles (les directives <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>) les unes
- à la suite des autres, et lorsqu'une règle s'applique, il parcourt
- les éventuelles conditions (directives
- <code>RewriteCond</code>directives) associées.
- Pour des raisons historiques, les
- conditions précèdent les règles, si bien que le déroulement du
- contrôle est un peu compliqué. Voir la figure 1 pour plus de
- détails.</p>
+ <p>Maintenant, quand <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> se lance dans ces deux
+ phases de l'API, il lit le jeu de règles configuré depuis la structure
+ contenant sa configuration (qui a été elle-même créée soit au démarrage
+ d'Apache httpd pour le contexte du serveur, soit lors du parcours des
+ répertoires par le noyau d'Apache httpd pour le contexte de répertoire).
+ Puis le moteur de réécriture est démarré avec le jeu de règles contenu
+ (une ou plusieurs règles associées à leurs conditions). En lui-même, le
+ mode opératoire du moteur de réécriture d'URLs est exactement le même dans
+ les deux contextes de configuration. Seul le traitement du résultat final
+ diffère.</p>
+
<p class="figure">
- <img src="../images/rewrite_process_uri.png" alt="Flux des comparaisons des directives RewriteRule et RewriteCond"><br>
- <dfn>Figure 1:</dfn>Déroulement du contrôle à travers le jeu de
- règles de réécriture
+ <img src="../images/mod_rewrite_fig1.png" alt="Survol du processus de réécriture par requête lors des phases par serveur et par répertoire"><br>
+ <dfn>Figure 1 :</dfn>Le processus de réécriture par requête montrant les
+ deux phases du traitement des règles (par serveur et par répertoire)
</p>
- <p>L'URL est tout d'abord comparée au
+
+ <p>L'ordre dans lequel les règles sont définies est important car le
+ moteur de réécriture les traite selon une chronologie particulière (et pas
+ très évidente). Le principe est le suivant : le moteur de réécriture
+ traite les règles (les directives <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>) les unes à la suite des
+ autres, et lorsqu'une règle s'applique, il parcourt les éventuelles
+ conditions (directives <code>RewriteCond</code>directives) associées.
+ Pour des raisons historiques, les conditions précèdent les règles, si bien
+ que le déroulement du contrôle est un peu compliqué. Voir la figure 2 pour
+ plus de détails.</p>
+<p class="figure">
+ <img src="../images/rewrite_process_uri.png" alt="Organigramme montrant le flux de contrôle par règle : pour chaque règle, comparaison du motif avec l’URL, évaluation des conditions RewriteCond, application de la substitution si les deux opérations précédentes ont réussi, puis consultation des drapeaux pour déterminer si l’on doit arrêter le traitement ou continuer avec la règle suivante"><br>
+ <dfn>Figure 2 :</dfn>Le flux de contrôle en parcourant le jeu de règles de
+ réécriture
+</p>
+ <p>L'URL est tout d'abord comparé au
<em>Modèle</em> de chaque règle. Lorsqu'une règle ne s'applique
pas, <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> stoppe immédiatement le traitement de cette règle
et passe à la règle suivante. Si l'URL correspond au
satisfaites, le traitement de la règle en cours se poursuit avec
le remplacement de l'URL par la chaîne de <em>Substitution</em>.</p>
+<p class="figure">
+ <img src="../images/mod_rewrite_fig2.png" alt="Flux des références arrières entre les directives RewriteRule et RewriteCond"><br>
+ <dfn>Figure 3 :</dfn>Le flux des références arrières dans une règle
+ Tout d’abord, le motif de la règle RewriteRule est comparé ; ses captures
+ ($1...$9) sont disponibles dans toutes les chaînes de test des conditions
+ RewriteCond. Les dernières captures du motif de la condition qui
+ correspondent (%1...%9) sont disponibles dans la substitution.
+</p>
+
</div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../de/rewrite/tech.html" hreflang="de" rel="alternate" title="Deutsch"> de </a> |
<variant outdated="yes">de</variant>
<variant>en</variant>
<variant outdated="yes">es</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
<variant outdated="yes">tr</variant>
<a href="../tr/rewrite/vhosts.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a> |
<a href="../zh-cn/rewrite/vhosts.html" hreflang="zh-cn" rel="alternate" title="Simplified Chinese"> zh-cn </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<p>Ce document est un complément à la <a href="../mod/mod_rewrite.html">documentation de référence</a> du module
<li><img alt="" src="../images/down.gif"> <a href="#xtra-conf">Utilisation d'un fichier de configuration
du serveur virtuel séparé</a></li>
</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du module</a></li><li><a href="intro.html">Introduction à mod_rewrite</a></li><li><a href="remapping.html">Redirection et remise en
-correspondance</a></li><li><a href="access.html">Contrôle d'accès</a></li><li><a href="proxy.html">Serveurs mandataires</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="advanced.html">Techniques avancées</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li></ul></div>
+correspondance</a></li><li><a href="htaccess.html">Réécritures dans un contexte de répertoire</a></li><li><a href="flags.html">Drapeaux de la règle RewriteRule</a></li><li><a href="rewritemap.html">Utilisation de RewriteMap</a></li><li><a href="avoid.html">Quand ne pas utiliser mod_rewrite</a></li><li><a href="tech.html">Détails techniques</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="per-hostname">Serveurs virtuels pour des noms d'hôtes arbitraires <a title="Lien permanent" href="#per-hostname" class="permalink">¶</a></h2>
<variant outdated="yes">de</variant>
<variant>en</variant>
<variant outdated="yes">es</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
<variant outdated="yes">tr</variant>
<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> |
<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a></p>
</div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
- anglaise pour les changements récents.</div>
<p>La fonctionnalité <strong>suEXEC</strong> permet
l'exécution des programmes <strong>CGI</strong> et
<variants>
<variant>en</variant>
- <variant outdated="yes">fr</variant>
+ <variant>fr</variant>
<variant outdated="yes">ja</variant>
<variant outdated="yes">ko</variant>
<variant outdated="yes">tr</variant>