Current Path : /usr/local/apache22/share/doc/apache2/rewrite/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //usr/local/apache22/share/doc/apache2/rewrite/flags.html.fr |
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head> <meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" /> <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX This file is generated from xml source: DO NOT EDIT XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --> <title>Les drapeaux de réécriture - Serveur Apache HTTP Version 2.2</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" /> <script src="../style/scripts/prettify.min.js" type="text/javascript"> </script> <link href="../images/favicon.ico" rel="shortcut icon" /><link href="http://httpd.apache.org/docs/current/rewrite/flags.html" rel="canonical" /></head> <body id="manual-page"><div id="page-header"> <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p> <p class="apache">Serveur Apache HTTP Version 2.2</p> <img alt="" src="../images/feather.gif" /></div> <div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div> <div id="path"> <a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Serveur HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.2</a> > <a href="./">Rewrite</a></div><div id="page-content"><div class="retired"><h4>A savoir</h4> <p>Ce document concerne une version ancienne (<strong>2.2</strong>) du serveur HTTP Apache. La version actuelle est documentée <a href="http://httpd.apache.org/docs/current">ici</a>. Si vous n'avez pas encore effectué la mise è jour, veuillez suivre <a href="http://httpd.apache.org/docs/current/upgrading.html">ce lien</a> pour plus d'informations.</p> <p>Pour consulter la version actuelle de ce document, vous pouvez suivre <a href="http://httpd.apache.org/docs/current/rewrite/flags.html">ce lien</a>.</p></div><div id="preamble"><h1>Les drapeaux de réécriture</h1> <div class="toplang"> <p><span>Langues Disponibles: </span><a href="../en/rewrite/flags.html" hreflang="en" rel="alternate" title="English"> en </a> | <a href="../fr/rewrite/flags.html" title="Français"> fr </a></p> </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_b">B (échappement dans les références arrières)</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_c">C|chain</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_co">CO|cookie</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_dpi">DPI|discardpathinfo</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_e">E|env</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_f">F|forbidden</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_g">G|gone</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_h">H|handler</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_l">L|last</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_n">N|next</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_nc">NC|nocase</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_ne">NE|noescape</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_ns">NS|nosubreq</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_p">P|proxy</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_pt">PT|passthrough</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_qsa">QSA|qsappend</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_qsd">QSD|qsdiscard</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_r">R|redirect</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_s">S|skip</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#flag_t">T|type</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><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div> <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="introduction" id="introduction">Introduction</a></h2> <p>Le comportement d'une directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> peut être modifié par un ou plusieurs drapeaux. Les drapeaux sont situés en fin de règle, entourés de crochets, et séparés le cas échéant par des virgules.</p> <div class="example"><p><code> RewriteRule modèle cible [drapeau1,drapeau2,drapeau3] </code></p></div> <p>Chaque drapeau (à quelques exceptions près) possède une forme courte, comme <code>CO</code>, ainsi qu'une forme longue, comme <code>cookie</code>. Bien que la forme courte soit la plus couramment utilisée, nous vous recommandons de vous familiariser avec les drapeaux sous leur forme longue, afin de bien mémoriser ce que chaque drapeau est supposé faire. 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>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><a name="flag_b" id="flag_b">B (échappement dans les références arrières)</a></h2> <p>Avec le drapeau [B], la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> échappe les caractères non-alphanumériques avant d'appliquer la transformation.</p> <p><code>mod_rewrite</code> doit supprimer les séquences d'échappement des URLs avant leur mise en correspondance avec le système de fichiers ; les séquences d'échappement sont donc supprimées des références arrières au moment où ces dernières sont appliquées. Avec le drapeau B, les caractères non-alphanumériques des références arrières seront échappés. Considérons par exemple cette règle :</p> <pre class="prettyprint lang-config">RewriteRule ^search/(.*)$ /search.php?term=$1</pre> <p>Soit la chaîne 'x & y/z' ; un navigateur va la coder en 'x%20%26%20y%2Fz', transformant la requête en 'search/x%20%26%20y%2Fz'. Sans le drapeau B, la règle va intercepter la chaîne 'search.php?term=x & y/z' qui n'est pas une URL valide, et la coder en <code>search.php?term=x%20&y%2Fz=</code>, ce qui ne correspond pas au résultat attendu.</p> <p>Avec le drapeau B, la règle va réencoder les paramètres avant de les passer à l'URL de sortie, ce qui va produire l'URL correcte <code>/search.php?term=x%20%26%20y%2Fz</code>.</p> <p>Notez que vous serez peut-être amené à définir la directive <code class="directive"><a href="../mod/core.html#allowencodedslashes">AllowEncodedSlashes</a></code> à <code>On</code> pour que cet exemple fonctionne, car httpd n'autorise pas les slashes encodés dans les URLs et renvoie une erreur 404 s'il en rencontre un.</p> <p>Ce processus d'échappement est en particulier nécessaire dans le contexte d'un mandataire, où l'accès au serveur d'arrière-plan échouera si on présente à ce dernier une URL non échappée.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_c" id="flag_c">C|chain</a></h2> <p>Le drapeau [C] ou [chain] indique que la règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> est chaînée avec la suivante. Autrement dit, si la règle s'applique, elle est traitée normalement et passe le contrôle à la règle suivante. Par contre, si elle ne s'applique pas, la règle suivante, ainsi que toutes les règles chaînées qui suivent, seront sautées.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_co" id="flag_co">CO|cookie</a></h2> <p>Le drapeau [CO], ou [cookie], vous permet de définir un cookie lorsqu'une règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> s'applique. Il possède trois arguments obligatoires et quatre arguments optionnels.</p> <p>La syntaxe complète de ce drapeau, avec tous ses attributs, est la suivante :</p> <div class="example"><p><code> [CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly] </code></p></div> <p>Vous devez déclarer un nom, une valeur et un domaine pour que le cookie puisse être défini.</p> <dl> <dt>Domain</dt> <dd>Le domaine pour lequel vous souhaitez que le cookie soit valide. Ce peut être un nom de serveur, comme <code>www.example.com</code>, ou un domaine, comme <code>.example.com</code>. Il doit comporter au moins deux parties séparées par un point. C'est à dire que vous ne pouvez pas utiliser les valeurs <code>.com</code> ou <code>.net</code>. En effet, ce style de cookie est interdit par le modèle de sécurité des cookies.</dd> </dl> <p>Vous pouvez aussi définir les valeurs suivantes :</p> <dl> <dt>Lifetime</dt> <dd>La durée de vie du cookie, en minutes.</dd> <dd>Avec la valeur 0 (valeur par défaut), le cookie est maintenu pendant la durée de la session du navigateur. Avant la version 2.2.28, la valeur 0 impliquait une expiration immédiate du cookie, et il était impossible de spécifié une autre durée de vie si un autre paramètre (Path, Secure, httponly) était présent.</dd> <dt>Path</dt> <dd>Le chemin, sur le site web concerné, pour lequel le cookie est valide, du style <code>/clients/</code> or <code>/fichiers/telechargement/</code>.</dd> <dd>La valeur par défaut est <code>/</code> - c'est à dire l'ensemble du site web.</dd> <dt>Secure</dt> <dd>Si cet argument a pour valeur <code>secure</code>, <code>true</code>, ou <code>1</code>, le cookie ne pourra être transmis que dans le cadre d'une connexion sécurisée (https).</dd> <dt>httponly</dt> <dd>Si cet argument a pour valeur <code>HttpOnly</code>, <code>true</code>, ou <code>1</code>, le cookie aura son drapeau <code>HttpOnly</code> activé, ce qui signifie qu'il sera inaccessible au code JavaScript pour les navigateurs qui supportent cette fonctionnalité.</dd> </dl> <p>Voici un exemple :</p> <div class="example"><p><code> RewriteEngine On<br /> RewriteRule ^/index\.html - [CO=frontdoor:yes:.example.org:1440:/] </code></p></div> <p>Dans l'exemple ci-dessus, la règle ne réécrit pas la requête. La cible de réécriture "-" indique à mod_rewrite de transmettre la requête sans modification. Par contre, il définit un cookie nommé 'frontdoor' avec une valeur 'yes'. Le cookie est valide pour tout hôte situé dans le domaine <code>.example.org</code>. Sa durée de vie est limitée à 1440 minutes (24 heures), et il sera renvoyé pour tous les URIs.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_dpi" id="flag_dpi">DPI|discardpathinfo</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 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 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 <code class="directive">RewriteRule</code>, sans prendre en compte quelles parties de l'URI provenaient du PATH_INFO courant, l'URI 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 résultait de la mise en correspondance précédente de cette requête avec le système de fichier n'est pas nécessaire. Avec ce drapeau, le PATH_INFO établi avant que cette passe du processus de réécriture ne débute est oublié. PATH_INFO ne sera pas recalculé tant que la passe 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> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_e" id="flag_e">E|env</a></h2> <p>Avec le drapeau [E], ou [env], vous pouvez définir la valeur d'une variable d'environnement. Notez que certaines variables d'environnement peuvent être définies après le traitement de la règle, annulant par la-même ce que vous avez défini. Voir le <a href="../env.html">document sur les variables d'environnement</a> pour plus de détails sur le fonctionnement des variables d'environnement.</p> <p>La syntaxe complète pour ce drapeau est :</p> <div class="example"><p><code> [E=!VAR] </code></p></div> <p><code>VAL</code> peut comporter des références arrières (<code>$N</code> ou <code>%N</code>) qui seront développées.</p> <p>En utilisant la version courte</p> <div class="example"><p><code> [E=VAR] </code></p></div> <p>vous pouvez définir la variable d'environnement nommée <code>VAR</code> avec une valeur vide.</p> <p>La forme</p> <div class="example"><p><code> [E=!VAR] </code></p></div> <p>permet d'annuler la définition de la variable <code>VAR</code>.</p> <p>Les variables d'environnement s'emploient dans différents contextes, comme les programmes CGI, d'autres directives RewriteRule, ou des 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 image. Cette variable d'environnement est ensuite utilisée pour exclure une telle requête du journal des accès.</p> <div class="example"><p><code> RewriteRule \.(png|gif|jpg) - [E=image:1]<br /> CustomLog logs/access_log combined env=!image </code></p></div> <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> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_f" id="flag_f">F|forbidden</a></h2> <p>L'utilisation du drapeau [F] permet de faire envoyer par le serveur au client un code de statut "403 Forbidden". Le même effet peut être obtenu à l'aide de la directive <code class="directive"><a href="../mod/mod_authz_host.html#deny">Deny</a></code>, mais ce drapeau offre plus de souplesse dans l'attribution d'un statut Forbidden.</p> <p>La règle suivante va interdire la téléchargement de fichiers <code>.exe</code> depuis votre serveur.</p> <div class="example"><p><code> RewriteRule \.exe - [F] </code></p></div> <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 requête.</p> <p>Lorsqu'on utilise [F], [L] est implicite - c'est à dire que la réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_g" id="flag_g">G|gone</a></h2> <p>Le drapeau [G] permet de faire envoyer par le serveur un code de statut "410 Gone" avec la réponse. Ce code indique qu'une ressource qui était disponible auparavant ne l'est plus actuellement.</p> <p>Comme dans le cas du drapeau [F], on utilise en général la syntaxe "-" pour la cible de réécriture lorsqu'on utilise le drapeau [G] :</p> <div class="example"><p><code> RewriteRule ancienne-ressource - [G,NC] </code></p></div> <p>Lorsqu'on utilise [G], [L] est implicite - c'est à dire que la réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_h" id="flag_h">H|handler</a></h2> <p>Force le traitement de la requête résultante par le gestionnaire spécifié. Par exemple, on peut utiliser ce drapeau pour forcer l'interprétation de tous les fichiers sans extension par le gestionnaire php :</p> <div class="example"><p><code> RewriteRule !\. - [H=application/x-httpd-php] </code></p></div> <p> L'expression rationnelle ci-dessus - <code>!\.</code> - correspond à toute requête qui ne contient pas le caractère <code>.</code>. </p> <p>On peut aussi utiliser ce drapeau pour forcer l'utilisation d'un certain gestionnaire en fonction de certaines conditions. Par exemple, l'extrait suivant utilisé dans un contexte de niveau serveur permet de faire en sorte que les fichiers <code>.php</code> soient <em>affichés</em> par <code>mod_php</code> dans le cas où ils font l'objet d'une requête avec l'extension <code>.phps</code> :</p> <div class="example"><p><code> RewriteRule ^(/source/.+\.php)s$ $1 [H=application/x-httpd-php-source] </code></p></div> <p>L'expression rationnelle ci-dessus - <code>^(/source/.+\.php)s$</code> - va correspondre à toute requête qui débutera par <code>/source/</code>, continuera par 1 ou n caractères puis par <code>.phps</code>. La référence arrière $1 fait référence à la correspondance capturée entre parenthèses de l'expression rationnelle.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_l" id="flag_l">L|last</a></h2> <p>Lorsque le drapeau [L] est présent, <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> arrête le traitement du jeu de règles. Cela signifie dans la plupart des situations que si la règle s'applique, aucune autre règle ne sera traitée. Ce drapeau correspond à la commande Perl <code>last</code>, ou à la commande <code>break</code> en C. Utilisez ce drapeau pour indiquer 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>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 de requête en argument à <code>index.php</code> ; cependant, la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewritecond">RewriteCond</a></code> permet de s'assurer que si la requête concerne déjà <code>index.php</code>, la directive <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> sera sautée.</p> <div class="example"><p><code> RewriteBase /<br /> RewriteCond %{REQUEST_URI} !=/index.php<br /> RewriteRule ^(.*) /index.php?req=$1 [L,PT] </code></p></div> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_n" id="flag_n">N|next</a></h2> <p>Le drapeau [N] provoque un redémarrage du traitement des règles depuis le début, en utilisant le résultat du jeu de règles, sous réserve qu'il existe un point de démarrage ; à utiliser avec précautions car il peut provoquer un bouclage infini. </p> <p> Le drapeau [Next] peut servir, par exemple, à remplacer de manière répétitive une chaîne de caractère ou une lettre dans une requête. Dans l'exemple suivant, chaque occurence de A sera remplacée par B dans la requête, et ceci jusqu'il n'y ait plus de A à remplacer. </p> <div class="example"><p><code> RewriteRule (.*)A(.*) $1B$2 [N] </code></p></div> <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>), effectuer la substitution (c'est à dire, remplacer le <code>A</code> par un <code>B</code>).</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_nc" id="flag_nc">NC|nocase</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 comparé.</p> <p>Dans l'exemple suivant, toute requête pour un fichier image sera transmise par Apache à votre serveur d'images dédié. La correspondance est insensible à la casse, si bien que par exemple, <code>.jpg</code> aussi bien que <code>.JPG</code> seront acceptés.</p> <div class="example"><p><code> RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [P,NC] </code></p></div> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_ne" id="flag_ne">NE|noescape</a></h2> <p>Par défaut, les caractères spéciaux, comme <code>&</code> et <code>?</code>, sont convertis en leur équivalent hexadécimal. Le drapeau [NE] permet d'éviter cette conversion. </p> <div class="example"><p><code> RewriteRule ^/ancre/(.+) /grosse-page.html#$1 [NE,R] </code></p></div> <p> Dans l'exemple ci-dessus, <code>/anchor/xyz</code> est réécrit en <code>/bigpage.html#xyz</code>. En l'absence du drapeau [NE], le # aurait été converti en son équivalent hexadécimal, <code>%23</code>, ce qui aurait provoqué un code d'erreur "404 Not Found". </p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_ns" id="flag_ns">NS|nosubreq</a></h2> <p>Le drapeau [NS] empêche la règle de s'appliquer aux sous-requêtes. Par exemple, une page incluse au moyen d'une SSI (Server Side Include) est une sous-requête, et vous ne voudrez probablement pas que la réécriture s'applique à ces sous-requêtes. Ainsi, lorsque <code class="module"><a href="../mod/mod_dir.html">mod_dir</a></code> recherche des informations à propos des fichiers par défaut du répertoire (comme les fichiers <code>index.html</code>), il s'agit d'une sous-requête interne, et vous ne désirez en général pas que ces sous-requêtes soient réécrites. Cette réécriture n'est pas toujours utile pour les sous-requêtes, et peut même causer des erreurs si l'ensemble du jeu de règles est appliqué. L'utilisation de ce drapeau permet d'exclure les règles qui peuvent poser problème.</p> <p>Comment déterminer si vous devez utiliser cette règle ou non : si vous préfixez les URLs avec des scripts CGI, afin de forcer leur traitement par le script CGI, vous vous exposez à des problèmes (ou du moins à une surcharge significative) avec les sous-requêtes. Dans ces cas, vous devez utiliser ce drapeau.</p> <p> Les images, scripts java, ou fichiers css, chargés en tant que partie 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> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_p" id="flag_p">P|proxy</a></h2> <p>L'utilisation du drapeau [P] entraîne le traitement de la requête par le module <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>, et ceci via une requête de mandataire. Par exemple, si vous voulez que toutes les requêtes d'images soient traitées par un serveur d'images annexe, vous pouvez utiliser une règle de ce style :</p> <div class="example"><p><code> RewriteRule /(.*)\.(jpg|gif|png) http://images.example.com/$1.$2 [P] </code></p></div> <p>L'utilisation du drapeau [P] provoque aussi l'effet du drapeau [L] - autrement dit, la requête est immédiatement envoyée au mandataire, et toute règle ultérieure sera ignorée.</p> <p> Vous devez vous assurer que la chaîne de substitution soit un URI 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. L'utilisation de ce drapeau implémente de manière plus puissante la directive <code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code>, pour faire correspondre le contenu distant à l'espace de nommage du serveur local.</p> <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> </div> <p>Note: <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code> doit être activé pour pouvoir utiliser ce drapeau.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_pt" id="flag_pt">PT|passthrough</a></h2> <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 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 chemins de fichiers, comme la directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code>, <code class="directive"><a href="../mod/mod_alias.html#redirect">Redirect</a></code>, ou <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>, par exemple, puissent avoir une chance d'accomplir leur tâche. </p> <p> Si par exemple, vous avez un <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> pour /icons, et une règle <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> qui renvoie vers /icons, vous devez utiliser le drapeau [PT] pour être sûr que l'<code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> sera bien évalué. </p> <div class="example"><p><code> Alias /icons /usr/local/apache/icons<br /> RewriteRule /pics/(.+)\.jpg /icons/$1.gif [PT] </code></p></div> <p> Dans l'exemple précédent, en l'absence du drapeau [PT], l'Alias aurait été ignoré, ce qui aurait provoqué une erreur 'File not found'. </p> <p>Avec le drapeau <code>PT</code>, le drapeau <code>L</code> est implicite : la réécriture s'arrêtera afin de transmettre la requête à la phase suivante du traitement.</p> <p>Notez que le drapeau <code>PT</code> est implicite dans des contextes de répertoire comme les sections <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code> ou les fichiers <code>.htaccess</code>. Le seul moyen de contourner ceci consiste à réécrire vers <code>-</code>.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_qsa" id="flag_qsa">QSA|qsappend</a></h2> <p> Quand l'URI 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 méthode HTTP <code>GET</code>) existante, et de la remplacer par celle nouvellement créée. Avec le drapeau [QSA], les chaînes de requête peuvent être combinées. </p> <p>Considérons la règle suivante :</p> <div class="example"><p><code> RewriteRule /pages/(.+) /page.php?page=$1 [QSA] </code></p></div> <p>Avec le drapeau [QSA], une requête pour <code>/pages/123?one=two</code> sera réécrite en <code>/page.php?page=123&one=two</code>. Sans le drapeau [QSA], la même requête sera réécrite en <code>/page.php?page=123</code> - autrement dit, la chaîne de requête (<code>query string</code>) existante sera supprimée. </p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_qsd" id="flag_qsd">QSD|qsdiscard</a></h2> <p> Lorsque l'URI 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 de paramètres est supprimée. </p> <p>Ce drapeau est disponible dans les versions 2.4.0 et supérieures.</p> <p> Lorsque les drapeaux [QSD] et [QSA] sont utilisés ensemble, c'est le drapeau [QSD] qui l'emporte. </p> <p> Si l'URI 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. </p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_r" id="flag_r">R|redirect</a></h2> <p> L'utilisation du drapeau [R] provoque l'envoi d'une redirection au navigateur. Si une URL pleinement qualifiée (FQDN - fully qualified domain name) est spécifiée (c'est à dire incluant <code>http://nom-du-serveur/</code>), une redirection sera effectuée vers cette adresse. Dans le cas contraire, le protocole courant, le nom du serveur et le numéro de port seront utilisés pour générer l'URL envoyée avec la redirection. </p> <p><em>Tout</em> code de statut de réponse HTTP valide peut être spécifié, en utilisant la syntaxe [R=305], le code de statut 302 étant utilisé par défaut si aucun code n'est spécifié. Le code de statut spécifié n'est pas nécessairement un code de statut de redirection (3xx). Cependant, si le code de statut est en dehors de la plage des codes de redirection (300-399), la chaîne de substitution est entièrement supprimée, et la réécriture s'arrête comme si le drapeau <code>L</code> était utilisé.</p> <p>En plus des codes de statut de réponse, vous pouvez spécifier les codes de redirection en utilisant leurs noms symboliques : <code>temp</code> (défaut), <code>permanent</code>, ou <code>seeother</code>.</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 <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'. </p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_s" id="flag_s">S|skip</a></h2> <p>Le drapeau [S] sert à sauter des règles que vous ne voulez pas voir exécuter. La syntaxe du drapeau skip 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). 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> <div class="example"><p><code> # La requête concerne-t-elle un fichier qui n'existe pas ?<br /> RewriteCond %{REQUEST_FILENAME} !-f<br /> RewriteCond %{REQUEST_FILENAME} !-d<br /> # Si c'est la cas, on saute les deux règles de réécriture suivantes<br /> RewriteRule .? - [S=2]<br /> RewriteRule (.*\.gif) images.php?$1<br /> RewriteRule (.*\.html) docs.php?$1 </code></p></div> <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 qu'une directive <code>RewriteCond</code> s'applique à plusieurs règles <code>RewriteRule</code>, une technique possible consiste à inverser ces conditions et à ajouter une <code>RewriteRule</code> avec le drapeau [Skip]. Cette technique permet d'élaborer des pseudo-constructions if-then-else : la dernière règle du bloc then contiendra <code>skip=N</code>, où N est le nombre de règles contenues dans le bloc else :</p> <div class="example"><p><code> # Est-ce que le fichier existe ?<br /> RewriteCond %{REQUEST_FILENAME} !-f<br /> RewriteCond %{REQUEST_FILENAME} !-d<br /> # Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.<br /> RewriteRule .? - [S=3]<br /> <br /> # Si le fichier existe, alors : <span class="indent"> RewriteRule (.*\.gif) images.php?$1<br /> RewriteRule (.*\.html) docs.php?$1<br /> # Skip past the "else" stanza.<br /> RewriteRule .? - [S=1]<br /> </span> # ELSE... <span class="indent"> RewriteRule (.*) 404.php?file=$1<br /> </span> # END </code></p></div> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="flag_t" id="flag_t">T|type</a></h2> <p>Définit le type MIME de la réponse résultante renvoyée. L'effet est identique à celui de la directive <code class="directive"><a href="../mod/mod_mime.html#addtype">AddType</a></code>.</p> <p>Par exemple, vous pouvez utiliser la technique suivante pour servir du code source Perl en tant que plein texte, s'il est requis d'une certaine manière :</p> <div class="example"><p><code> # Sert les fichier .pl en tant que plein texte<br /> RewriteRule \.pl$ - [T=text/plain] </code></p></div> <p>Ou encore, si vous possédez une caméra qui produit des fichiers images jpeg sans extension, vous pouvez forcer le renvoi de ces images avec le type MIME correct en se basant sur le nom du fichier :</p> <div class="example"><p><code> # Les fichiers dont le nom contient 'IMG' sont des images jpg.<br /> RewriteRule IMG - [T=image/jpg] </code></p></div> <p>Notez cependant qu'il s'agit d'un exemple trivial, et que le problème aurait pu être résolu en utilisant à la place la directive <code class="directive"><a href="../mod/core.html#filesmatch"><FilesMatch></a></code>. Il faut toujours envisager la possibilité d'une solution alternative à un problème avant d'avoir recours à la réécriture, qui sera toujours moins efficace qu'une solution alternative.</p> <p> Dans un contexte de niveau répertoire, n'utilisez que <code>-</code> (tiret) comme substitution, <em>dans toute la séquence de réécriture de mod_rewrite</em>, sinon le type MIME défini avec ce drapeau sera perdu suite à un retraitement interne (y compris les séquences de réécriture suivantes de mod_rewrite). Dans ce contexte, vous pouvez utiliser le drapeau <code>L</code> pour terminer la séquence <em>courante</em> de réécriture de mod_rewrite.</p> </div></div> <div class="bottomlang"> <p><span>Langues Disponibles: </span><a href="../en/rewrite/flags.html" hreflang="en" rel="alternate" title="English"> en </a> | <a href="../fr/rewrite/flags.html" title="Français"> fr </a></p> </div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div> <script type="text/javascript"><!--//--><![CDATA[//><!-- var comments_shortname = 'httpd'; var comments_identifier = 'http://httpd.apache.org/docs/2.2/rewrite/flags.html'; (function(w, d) { if (w.location.hostname.toLowerCase() == "httpd.apache.org") { d.write('<div id="comments_thread"><\/div>'); var s = d.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); } else { d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>'); } })(window, document); //--><!]]></script></div><div id="footer"> <p class="apache">Copyright 2017 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!-- if (typeof(prettyPrint) !== 'undefined') { prettyPrint(); } //--><!]]></script> </body></html>