Ce document traite des drapeaux qui sont à la disposition de la règle de réécriture du serveur. RewriteRule en fournissant des explications détaillées et des exemples.

Introduction

A RewriteRule peut voir son comportement modifié par un ou plusieurs drapeaux. Les drapeaux sont inclus entre crochets à la fin de la règle, et les drapeaux multiples sont séparés par des virgules.

RewriteRule pattern target [Flag1,Flag2,Flag3]

Chaque drapeau (à quelques exceptions près) a une forme courte, telle que COainsi qu'une forme plus longue, telle que cookie. Bien qu'il soit plus courant d'utiliser la forme courte, il est recommandé de se familiariser avec la forme longue, afin de se rappeler ce que chaque drapeau est censé faire. Certains drapeaux prennent un ou plusieurs arguments. Les drapeaux ne sont pas sensibles à la casse.

Les drapeaux qui modifient les métadonnées associées à la requête (T=, H=, E=) n'ont aucun effet dans le cadre d'un traitement par répertoire et htaccess, lorsqu'une substitution (autre que '-') est effectuée au cours du même tour de traitement de réécriture.

Présentés ici sont chacun des drapeaux disponibles, ainsi qu'un exemple de la façon dont vous pourriez les utiliser.

B (échapper aux rétro-références)

Le site [B] indique RewriteRule d'échapper les caractères non alphanumériques avant d'appliquer la transformation.

Dans les versions 2.4.26 et ultérieures, vous pouvez limiter l'échappement à des caractères spécifiques dans les rétro-références en les listant : [B=#?;]. Remarque : Le caractère espace peut être utilisé dans la liste des caractères à échapper, mais il ne peut pas être le dernier caractère de la liste.

mod_rewrite doit déséchapper les URL avant de les mettre en correspondance, de sorte que les rétro-références sont déséchappées au moment où elles sont appliquées. En utilisant le drapeau B, les caractères non alphanumériques dans les rétro-références seront échappés. Par exemple, considérez la règle suivante :

RewriteRule "^search/(.*)$" "/search.php?term=$1"

Étant donné un terme de recherche de 'x & y/z', un navigateur le codera comme 'x%20%26%20y%2Fz', ce qui rendra la requête 'search/x%20%26%20y%2Fz'. Sans le drapeau B, cette règle de réécriture correspondra à 'search.php?term=x & y/z', qui n'est pas une URL valide, et sera donc encodée comme suit search.php?term=x%20&y%2Fz=ce qui n'est pas ce qui était prévu.

Avec le drapeau B sur cette même règle, les paramètres sont ré-encodés avant d'être transmis à l'URL de sortie, ce qui donne un mappage correct à /search.php?term=x%20%26%20y%2Fz.

RewriteRule "^search/(.*)$" "/search.php?term=$1" [B,PT]

Notez que vous pouvez également avoir besoin de définir AllowEncodedSlashes pour On pour que cet exemple particulier fonctionne, car httpd n'autorise pas les slashs codés dans les URL, et renvoie un 404 s'il en voit un.

Cet échappement est particulièrement nécessaire dans une situation de proxy, lorsque le backend peut se casser si on lui présente une URL non encodée.

Une alternative à ce drapeau est l'utilisation d'un RewriteCond pour capturer contre %{THE_REQUEST} qui capturera les chaînes sous la forme encodée.

BNP|backrefnoplus (ne pas échapper l'espace vers +).

Le site [BNP] indique RewriteRule d'échapper le caractère espace dans une rétro-référence à %20 plutôt qu'à '+'. Utile lorsque la rétro-référence sera utilisée dans le composant de chemin d'accès plutôt que dans la chaîne de requête.

Ce drapeau est disponible à partir de la version 2.4.26.

C|chaîne

Le site [C] ou [chain] indique que l'option RewriteRule est enchaînée à la règle suivante. C'est-à-dire que si la règle correspond, alors elle est traitée comme d'habitude et le contrôle passe à la règle suivante. Cependant, si elle ne correspond pas, alors la règle suivante, et toutes les autres règles qui sont enchaînées ensemble, sont sautées.

CO|cookie

Le site [CO], ou [cookie] vous permet d'établir un cookie lorsqu'une valeur particulière de l'indicateur RewriteRule particulier. L'argument se compose de trois champs obligatoires et de quatre champs facultatifs.

La syntaxe complète du drapeau, y compris tous les attributs, est la suivante :

[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly]

Si un caractère littéral ':' est nécessaire dans l'un des champs du cookie, une syntaxe alternative est disponible. Pour opter pour la syntaxe alternative, le "Nom" du cookie doit être précédé d'un caractère ';', et les séparateurs de champs doivent être spécifiés comme ';'.

[CO=;NAME;VALUE:MOREVALUE;DOMAIN;lifetime;path;secure;httponly]

Vous devez déclarer un nom, une valeur et un domaine pour le cookie à définir.

Domaine
Le domaine pour lequel vous voulez que le cookie soit valide. Il peut s'agir d'un nom d'hôte, tel que www.example.comou un domaine, tel que .example.com. Il doit comporter au moins deux parties séparées par un point. C'est-à-dire qu'il ne peut pas être simplement .com ou .net. Les cookies de ce type sont interdits par le modèle de sécurité des cookies.

Vous pouvez également, de manière facultative, définir les valeurs suivantes :

Durée de vie
La durée pendant laquelle le cookie persistera, en minutes.
Une valeur de 0 indique que le cookie ne persistera que pour la session actuelle du navigateur. Il s'agit de la valeur par défaut si aucune valeur n'est spécifiée.
Chemin d'accès
Le chemin, sur le site Web actuel, pour lequel le cookie est valide, par exemple. /customers/ ou /files/download/.
Par défaut, cette valeur est fixée à / - c'est-à-dire l'ensemble du site Web.
Sécurisé
Si la valeur est fixée à secure, trueou 1, le cookie ne sera autorisé à être traduit que via des connexions sécurisées (https).
httponly
Si la valeur est fixée à HttpOnly, trueou 1le cookie aura la valeur HttpOnly activé, ce qui signifie que le cookie est inaccessible au code JavaScript sur les navigateurs qui prennent en charge cette fonctionnalité.

Considérez cet exemple :

RewriteEngine On
RewriteRule "^/index.html" "-" [CO=frontdoor:yes:.example.com:1440:/]

Dans l'exemple donné, la règle ne réécrit pas la requête. La cible de réécriture "-" indique à mod_rewrite de transmettre la requête sans la modifier. Au lieu de cela, elle définit un cookie appelé 'frontdoor' avec une valeur de 'yes'. Ce cookie est valable pour tout hôte du groupe .example.com . Il est configuré pour expirer dans 1440 minutes (24 heures) et est renvoyé pour toutes les URI.

DPI|discardpath

L'indicateur DPI entraîne le rejet de la partie PATH_INFO de l'URI réécrit.

Ce drapeau est disponible à partir de la version 2.2.12.

Dans un contexte par répertoire, l'URI chaque... RewriteRule compare est la concaténation des valeurs actuelles de l'URI et de PATH_INFO.

L'URI actuel peut être l'URI initial tel que demandé par le client, le résultat d'un cycle précédent de traitement mod_rewrite, ou le résultat d'une règle antérieure dans le cycle actuel de traitement mod_rewrite.

En revanche, le PATH_INFO qui est ajouté à l'URI avant chaque règle reflète uniquement la valeur du PATH_INFO avant ce cycle de traitement mod_rewrite. Par conséquent, si de larges portions de l'URI sont mises en correspondance et copiées dans une substitution dans de multiples RewriteRule sans tenir compte des parties de l'URI provenant de la PATH_INFO actuelle, l'URI final peut avoir plusieurs copies de PATH_INFO qui lui sont annexées.

Utilisez ce drapeau sur toute substitution où le PATH_INFO qui a résulté de l'application précédente de cette requête au système de fichiers n'est pas intéressant. Ce drapeau oublie définitivement le PATH_INFO établi avant le début de ce cycle de traitement mod_rewrite. PATH_INFO ne sera pas recalculé avant la fin du cycle actuel de traitement mod_rewrite. Les règles ultérieures au cours de ce cycle de traitement ne verront que le résultat direct des substitutions, sans aucune PATH_INFO ajoutée.

E|env

Avec le [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 l'exécution de la règle, annulant ainsi ce que vous avez défini. Consultez le document Variables d'environnement pour plus de détails sur le fonctionnement des variables d'environnement.

La syntaxe complète de ce drapeau est :

[E=VAR:VAL]
[E=!VAR]

VAL peut contenir des rétro-références ($N ou %N) qui sont développées.

Utilisation de la forme courte

[E=VAR]

vous pouvez définir la variable d'environnement nommée VAR à une valeur vide.

La forme

[E=!VAR]

permet d'annuler une variable d'environnement précédemment définie nommée VAR.

Les variables d'environnement peuvent ensuite être utilisées dans divers contextes, notamment dans des programmes CGI, d'autres directives RewriteRule ou des directives CustomLog.

L'exemple suivant définit une variable d'environnement appelée 'image' à une valeur de '1' si l'URI demandé est un fichier image. Ensuite, cette variable d'environnement est utilisée pour exclure ces demandes du journal des accès.

RewriteRule ".(png|gif|jpg)$" "-" [E=image:1]
CustomLog "logs/access_log" combined env=!image

Notez que ce même effet peut être obtenu en utilisant SetEnvIf. Cette technique est proposée à titre d'exemple et non de recommandation.

FIN

Utilisation de la [END] met fin non seulement au tour actuel de traitement de réécriture (comme [L]) mais empêche également tout traitement de réécriture ultérieur de se produire dans un contexte par répertoire (htaccess).

Cela ne s'applique pas aux nouvelles demandes résultant de redirections externes.

F|forbidden

L'utilisation du [F] fait en sorte que le serveur renvoie un code d'état 403 Forbidden au client. Bien que le même comportement puisse être obtenu en utilisant l'indicateur Deny cette directive permet une plus grande flexibilité dans l'attribution d'un état interdit.

La règle suivante interdira .exe d'être téléchargés à partir de votre serveur.

RewriteRule ".exe" "-" [F]

Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce qui signifie que l'URI demandé n'est pas modifié. Il n'y a aucune raison de réécrire vers un autre URI, si vous comptez interdire la requête.

Lorsque l'on utilise [F], un [L] est implicite - c'est-à-dire que la réponse est retournée immédiatement, et aucune autre règle n'est évaluée.

G|gone

Le site [G] oblige le serveur à renvoyer un statut 410 Gone avec la réponse. Cela indique qu'une ressource était disponible auparavant, mais ne l'est plus.

Comme pour l'indicateur [F] vous utiliserez généralement la syntaxe "-" pour la cible de réécriture lorsque vous utilisez le drapeau [G] pour la cible de réécriture :

RewriteRule "oldproduct" "-" [G,NC]

Lorsque vous utilisez [G]un indicateur [L] est implicite - c'est-à-dire que la réponse est retournée immédiatement, et aucune autre règle n'est évaluée.

H|handler

Force la requête résultante à être traitée avec le gestionnaire spécifié. Par exemple, on pourrait utiliser ceci pour forcer tous les fichiers sans extension de fichier à être analysés par le gestionnaire php :

RewriteRule "!." "-" [H=application/x-httpd-php]

L'expression régulière ci-dessus - !. - correspondra à toute requête qui ne contient pas le littéral . littéral.

Ceci peut également être utilisé pour forcer le gestionnaire en fonction de certaines conditions. Par exemple, le snippet suivant, utilisé dans un contexte par serveur, autorise .php d'être affichés par mod_php s'ils sont demandés avec le .phps extension :

RewriteRule "^(/source/.+.php)s$" "$1" [H=application/x-httpd-php-source]

L'expression régulière ci-dessus - ^(/source/.+.php)s$ - correspondra à toute requête qui commence par /source/ suivie de 1 ou n caractères suivis de .phps littéralement. La référence arrière 1 $ les référents de la correspondance capturée entre les parenthèses de l'expression régulière.

L|dernier

Le site [L] provoque mod_rewrite à arrêter le traitement de l'ensemble de règles. Dans la plupart des contextes, cela signifie que si la règle correspond, aucune autre règle ne sera traitée. Cela correspond à l'indicateur last en Perl, ou à la commande break en C. Utilisez ce drapeau pour indiquer que la règle actuelle doit être appliquée immédiatement sans considérer d'autres règles.

Si vous utilisez RewriteRule soit dans .htaccess soit dans les fichiers il est important d'avoir une certaine compréhension de la façon dont les règles sont traitées. La forme simplifiée de ceci est qu'une fois que les règles ont été traitées, la requête réécrite est remise au moteur d'analyse d'URL pour qu'il en fasse ce qu'il peut. Il est possible qu'au cours du traitement de la requête réécrite, l'élément .htaccess ou le fichier soit à nouveau rencontré, et donc que la série de règles soit exécutée à nouveau depuis le début. Le plus souvent, cela se produira si l'une des règles provoque une redirection - interne ou externe - entraînant le recommencement du processus de requête.

Il est donc important, si vous utilisez RewriteRule dans l'un de ces contextes, que vous preniez des mesures explicites pour éviter le bouclage des règles, et que vous ne comptiez pas uniquement sur la directive [L] pour mettre fin à l'exécution d'une série de règles, comme indiqué ci-dessous.

Un drapeau alternatif, [END], peut être utilisé pour terminer non seulement le cycle actuel de traitement de réécriture, mais aussi pour empêcher tout traitement de réécriture ultérieur de se produire dans un contexte par répertoire (htaccess). Cela ne s'applique pas aux nouvelles requêtes résultant de redirections externes.

L'exemple donné ici réécrira toute requête vers index.php, en donnant la requête originale comme argument de chaîne de requête à index.phpCependant, la requête RewriteCond garantit que si la requête est déjà pour index.phple RewriteRule sera ignorée.

RewriteBase "/"
RewriteCond "%{REQUEST_URI}" "!=/index.php"
RewriteRule "^(.*)" "/index.php?req=$1" [L,PT]

N|suivant

Le site [N] fait en sorte que la série de règles recommence depuis le début, en utilisant le résultat de la série de règles jusqu'à présent comme point de départ. Utilisez-le avec une extrême prudence, car il peut entraîner une boucle.

Le site [Next] peut être utilisé, par exemple, si vous souhaitez remplacer une certaine chaîne ou lettre de manière répétée dans une requête. L'exemple présenté ici remplacera A par B partout dans une requête, et continuera à le faire jusqu'à ce qu'il n'y ait plus de As à remplacer.

RewriteRule "(.*)A(.*)" "$1B$2" [N]

Vous pouvez considérer ceci comme un while boucle : Tant que ce motif correspond encore (c'est-à-dire, tant que l'URI contient encore un élément A), effectuez cette substitution (c.-à-d. remplacez l'élément A par un B).

Dans les versions 2.4.8 et ultérieures, ce module renvoie une erreur après 32 000 itérations pour se protéger contre les boucles involontaires. Un autre nombre maximal d'itérations peut être spécifié en ajoutant au drapeau N.

# Be willing to replace 1 character in each pass of the loop
RewriteRule "(.+)[><;]$" "$1" [N=64000]
# ... or, give up if after 10 loops
RewriteRule "(.+)[><;]$" "$1" [N=10]

NC|nocase

Utilisation de l'indicateur [NC] provoque le RewriteRule de manière insensible à la casse. C'est-à-dire qu'il ne se soucie pas de savoir si les lettres apparaissent en majuscules ou en minuscules dans l'URI apparié.

Dans l'exemple ci-dessous, toute demande de fichier image sera envoyée par procuration à votre serveur d'images dédié. La correspondance est insensible à la casse, de sorte que .jpg et .JPG sont tous deux acceptables, par exemple.

RewriteRule "(.*.(jpg|gif|png))$" "http://images.example.com$1" [P,NC]

NE|noescape

Par défaut, les caractères spéciaux, tels que & et ?par exemple, seront convertis en leur équivalent hexcode. En utilisant le caractère [NE] empêche que cela ne se produise.

RewriteRule "^/anchor/(.+)" "/bigpage.html#$1" [NE,R]

L'exemple ci-dessus redirigera /anchor/xyz vers /bigpage.html#xyz. En omettant le [NE] entraînera la conversion du # en son équivalent hexcode, %23ce qui entraînera une erreur de type 404 Not Found.

NS|nosubreq

Utilisation de l'élément [NS] empêche l'utilisation de la règle sur les sous-requêtes. Par exemple, une page qui est incluse à l'aide d'un SSI (Server Side Include) est une sous-requête, et vous pouvez vouloir éviter que des réécritures se produisent sur ces sous-requêtes. De même, lorsque mod_dir essaie de trouver des informations sur d'éventuels fichiers par défaut de répertoire (comme le fichier index.html ), il s'agit d'une sous-requête interne, et vous voulez souvent éviter les réécritures sur ces sous-requêtes. Sur les sous-requêtes, il n'est pas toujours utile, et peut même provoquer des erreurs, si l'ensemble complet des règles est appliqué. Utilisez ce drapeau pour exclure les règles problématiques.

Pour décider d'utiliser ou non cette règle : si vous préfixez les URL avec des scripts CGI, pour les forcer à être traitées par le script CGI, il est probable que vous rencontriez des problèmes (ou une surcharge importante) sur les sous-requêtes. Dans ces cas, utilisez ce drapeau.

Les images, les fichiers javascript ou les fichiers css, chargés dans le cadre d'une page HTML, ne sont pas des sous-requêtes - le navigateur les demande en tant que requêtes HTTP distinctes.

P|proxy

Utilisation du [P] fait en sorte que la demande soit traitée par mod_proxyet traitée via une requête proxy. Par exemple, si vous vouliez que toutes les demandes d'images soient traitées par un serveur d'images back-end, vous pourriez faire quelque chose comme ce qui suit :

RewriteRule "/(.*).(jpg|gif|png)$" "http://images.example.com/$1.$2" [P]

Utilisation de l'option [P] implique [L] - c'est-à-dire que la demande est immédiatement poussée à travers le proxy, et toute règle suivante ne sera pas prise en compte.

Vous devez vous assurer que la chaîne de substitution est un URI valide (commençant typiquement par http://nom d'hôte) qui peut être traité par la fonction mod_proxy. Dans le cas contraire, vous obtiendrez une erreur de la part du module proxy. Utilisez ce drapeau pour obtenir une implémentation plus puissante de la fonction ProxyPass pour mapper le contenu distant dans l'espace de noms du serveur local.

Avertissement de sécurité

Faites attention lors de la construction de l'URL cible de la règle, en considérant l'impact sur la sécurité de permettre au client d'influencer l'ensemble des URL vers lesquelles votre serveur agira comme un proxy. Assurez-vous que la partie schéma et nom d'hôte de l'URL est soit fixe, soit ne permet pas au client d'exercer une influence indue.

Avertissement sur les performances

L'utilisation de ce drapeau déclenche l'utilisation de mod_proxy, sans gestion des connexions persistantes. Cela signifie que les performances de votre proxy seront meilleures si vous le configurez avec ProxyPass ou ProxyPassMatch

Cela est dû au fait que ce drapeau déclenche l'utilisation du travailleur par défaut, qui ne gère pas la mise en commun/réutilisation des connexions.

Évitez d'utiliser ce drapeau et préférez ces directives, chaque fois que vous le pouvez.

Note : mod_proxy doit être activé afin d'utiliser ce drapeau.

PT|passthrough

La cible (ou chaîne de substitution) dans une RewriteRule est supposée être un chemin de fichier, par défaut. L'utilisation de l'indicateur [PT] fait en sorte qu'elle soit traitée comme une URI à la place. C'est-à-dire que l'utilisation de l'indicateur [PT] fait en sorte que le résultat de la fonction RewriteRule soit renvoyé par le mappage d'URL, de sorte que les mappages basés sur la localisation, tels que Alias, Redirectou ScriptAliaspar exemple, puissent avoir une chance de prendre effet.

Si, par exemple, vous avez un Alias pour les /icônes, et que vous avez un RewriteRule pointant là, vous devriez utiliser le [PT] pour s'assurer que la balise Alias soit évaluée.

Alias "/icons" "/usr/local/apache/icons"
RewriteRule "/pics/(.+).jpg$" "/icons/$1.gif" [PT]

Omission de l'indicateur [PT] dans ce cas, l'alias sera ignoré, ce qui entraînera le renvoi d'une erreur 'File not found'.

Le site PT implique le drapeau L : la réécriture sera arrêtée afin de faire passer la demande à la phase suivante du traitement.

Notez que le drapeau PT est implicite dans des contextes par répertoire, tels que ou dans les sections .htaccess ou dans des fichiers .htaccess. Le seul moyen de contourner cela est de réécrire en -.

QSA|qsappend

Lorsque l'URI de remplacement contient une chaîne de requête, le comportement par défaut de RewriteRule est d'écarter la chaîne de requête existante et de la remplacer par la chaîne nouvellement générée. L'utilisation de la balise [QSA] fait en sorte que les chaînes de requête soient combinées.

Considérons la règle suivante :

RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]

Avec l'indicateur [QSA] une demande de /pages/123?one=two sera transformée en /page.php?page=123&one=two. Sans l'indicateur [QSA] la même demande sera affectée à la classe /page.php?page=123 - c'est-à-dire que la chaîne de requête existante sera rejetée.

QSD|qsdiscard

Lorsque l'URI demandé contient une chaîne de requête, et que l'URI cible n'en contient pas, le comportement par défaut de RewriteRule est de copier cette chaîne de requête dans l'URI cible. L'utilisation de la fonction [QSD] entraîne la mise au rebut de la chaîne de requête.

Ce drapeau est disponible à partir de la version 2.4.0.

Utilisation de [QSD] et [QSA] ensemble, on obtient [QSD] aura la priorité.

Si l'URI cible possède une chaîne de requête, le comportement par défaut sera observé - c'est-à-dire que la chaîne de requête originale sera écartée et remplacée par la chaîne de requête dans le champ RewriteRule URI cible.

QSL|qslast

Par défaut, le premier point d'interrogation (le plus à gauche) dans la substitution délimite le chemin d'accès à partir de la chaîne de requête. En utilisant le [QSL] indique RewriteRule de séparer plutôt les deux composants en utilisant le dernier point d'interrogation (le plus à droite).

Ceci est utile lors de la mise en correspondance avec des fichiers qui ont des points d'interrogation littéraux dans leur nom de fichier. Si aucune chaîne de requête n'est utilisée dans la substitution, un point d'interrogation peut lui être ajouté en combinaison avec ce drapeau.

Ce drapeau est disponible à partir de la version 2.4.19.

R|redirect

Utilisation de l'option [R] entraîne une redirection HTTP vers le navigateur. Si une URL entièrement qualifiée est spécifiée (c'est-à-dire incluant http://servername/), une redirection sera émise vers cet emplacement. Sinon, le protocole, le nom de serveur et le numéro de port actuels seront utilisés pour générer l'URL envoyée avec la redirection.

Tout code d'état de réponse HTTP valide peut être spécifié, en utilisant la syntaxe suivante [R=305], un code d'état 302 étant utilisé par défaut si aucun n'est spécifié. Le code d'état spécifié ne doit pas nécessairement être un code d'état de redirection (3xx). Toutefois, si un code d'état se situe en dehors de la plage de redirection (300-399), la chaîne de substitution est entièrement abandonnée et la réécriture est arrêtée comme si le code d'état L était utilisée.

En plus des codes de statut de réponse, vous pouvez également spécifier le statut de redirection en utilisant leurs noms symboliques : temp (par défaut), permanentou seeother.

Vous voudrez presque toujours utiliser [R] en conjonction avec [L] (c'est-à-dire utiliser [R,L]) car, seul, le [R] précède http://thishost[:thisport] à l'URI, mais le transmet ensuite à la règle suivante dans le jeu de règles, ce qui peut souvent entraîner des avertissements 'URI invalide dans la requête'.

S|skip

Le site [S] est utilisé pour sauter les règles que vous ne voulez pas exécuter. La syntaxe de l'indicateur skip est [S=N]où N signifie le nombre de règles à sauter (à condition que l'option RewriteRule corresponde). Cela peut être considéré comme un goto dans votre jeu de règles de réécriture. Dans l'exemple suivant, nous voulons seulement exécuter l'instruction RewriteRule si l'URI demandé ne correspond pas à un fichier réel.

# Is the request for a non-existent file?
RewriteCond "%{REQUEST_FILENAME}" "!-f"
RewriteCond "%{REQUEST_FILENAME}" "!-d"
# If so, skip these two RewriteRules
RewriteRule ".?" "-" [S=2]

RewriteRule "(.*.gif)" "images.php?$1"
RewriteRule "(.*.html)" "docs.php?$1"

Cette technique est utile car un RewriteCond ne s'applique qu'au fichier RewriteRule qui le suit immédiatement. Ainsi, si vous voulez faire un RewriteCond s'applique à plusieurs RewriteRuleune technique possible est de nier ces conditions et d'ajouter un RewriteRule .RewriteRuleavec un [Skip] . Vous pouvez utiliser ceci pour faire des constructions pseudo if-then-else : La dernière règle de la clause then devient skip=N, où N est le nombre de règles dans la clause else :

# Does the file exist?
RewriteCond "%{REQUEST_FILENAME}" "!-f"
RewriteCond "%{REQUEST_FILENAME}" "!-d"
# Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.
RewriteRule ".?" "-" [S=3]

# IF the file exists, then:
    RewriteRule "(.*.gif)" "images.php?$1"
    RewriteRule "(.*.html)" "docs.php?$1"
    # Skip past the "else" stanza.
    RewriteRule ".?" "-" [S=1]
# ELSE...
    RewriteRule "(.*)" "404.php?file=$1"
# END

Il est probablement plus facile d'accomplir ce type de configuration en utilisant la règle , , et à la place.

T|type

Définit le type MIME avec lequel la réponse résultante sera envoyée. Ceci a le même effet que la directive AddType .

Par exemple, vous pouvez utiliser la technique suivante pour servir le code source Perl en tant que texte brut, s'il est demandé d'une manière particulière :

# Serve .pl files as plain text
RewriteRule ".pl$" "-" [T=text/plain]

Ou, peut-être, si vous avez un appareil photo qui produit des images jpeg sans extension de fichier, vous pourriez forcer ces images à être servies avec le type MIME correct en vertu de leurs noms de fichiers :

# Files with 'IMG' in the name are jpg images.
RewriteRule "IMG" "-" [T=image/jpg]

Veuillez noter qu'il s'agit d'un exemple trivial, et qu'il serait plus efficace d'utiliser la commande à la place. Il faut toujours considérer les solutions alternatives à un problème avant de recourir à la réécriture, qui sera invariablement une solution moins efficace que les alternatives.

S'il est utilisé dans un contexte par répertoire, utilisez seulement - (tiret) comme substitution pour l'ensemble du cycle de traitement mod_rewrite. sinon le type MIME défini avec cet indicateur est perdu en raison d'un nouveau traitement interne (y compris les cycles ultérieurs du traitement mod_rewrite). L'adresse L peut être utile dans ce contexte pour mettre fin au traitement de type courant cycle de traitement du mod_rewrite.