From 3161ed034bbea40a705303811d7213aff9be17d2 Mon Sep 17 00:00:00 2001
From: Daniel Baumann
Avec le drapeau [B], la directive RewriteRule
échappe les caractères
-non-alphanumériques avant d'appliquer la transformation. A partir
-de la version 2.4.26, vous pouvez limiter l'échappement dans les
-références arrières à une liste de caractères que vous pouvez spécifiez comme
-dans cet exemple : [B=#?;]
. Notez que l'espace peut faire
-partie de la liste des caractères à échapper, mais qu'il ne doit pas
-être le dernier caractère de cette liste.
-
mod_rewrite
doit supprimer les séquences d'échappement
des URLs avant leur
@@ -104,6 +98,9 @@ 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 :
Pour un échappement similaire des variables du serveur, voir la fonction de mappage "escape". +
+RewriteRule "^search/(.*)$" "/search.php?term=$1"@@ -138,6 +135,22 @@ si on présente à ce dernier une URL non échappée. %{THE_REQUEST}, les chaînes capturées se présentant alors sous la forme codée. +
A partir
+de la version 2.4.26, vous pouvez limiter l'échappement dans les
+références arrières à une liste de caractères que vous pouvez spécifiez comme
+dans cet exemple : [B=#?;]
. Notez que l'espace peut faire
+partie de la liste des caractères à échapper, mais que vous devez mettre entre
+guillemets le troisième argument de la directive RewriteRule
et que l'espace ne doit pas
+être le dernier caractère de cette liste.
+
# Échappement des espaces et des points d'interrogation. Les guillemets autour +# du dernier argument sont obligatoires lorsque l'espace est inclus. +RewriteRule "^search/(.*)$" "/search.php?term=$1" "[B= ?]"+ + +
Pour définir la liste des caractères à échapper de cette manière, voir #flag_bne et #flag_bctls
+# Échappe le caractère espace en %20 dans le chemin au lieu de + comme dans la +# soumission de formulaire à l'aide de la chaîne de paramètres +RewriteRule "^search/(.*)$" "/search.php/$1" "[B,BNP]"+ +
Ce drapeau est disponible à partir de la version 2.4.26 du serveur HTTP Apache.
+Le drapeau [BCTLS] est similaire à [B], à la différence que seuls les espaces +et les caractères de contrôle sont échappés. Il s'agit du même jeu de caractères +rejetés lorsqu'ils sont copiés dans la chaîne de paramètres non codée. +
+ +# Échappe les espaces et les caractères de contrôle +RewriteRule "^search/(.*)$" "/search.php/$1" "[BCTLS]"+ + +
Ce drapeau est disponible à partir de la version 2.4.57 du serveur HTTP +Apache.
+ + + +Les caractères listés dans [BNE=...] sont exclus des listes de caractères +correspondant aux drapeaux [B] ou [BCTLS]. Ils ne seront donc pas échappés. +
+ +# Échappe les caractères par défaut, sauf / +RewriteRule "^search/(.*)$" "/search.php?term=$1" "[B,BNE=/]"+ + +
Ce drapeau est disponible à partir de la version 2.4.57 du serveur HTTP +Apache.
+ + +Voici un exemple :
RewriteEngine On -RewriteRule "^/index\.html" "-" [CO=frontdoor:yes:.example.org:1440:/]+RewriteRule "^/index\.html" "-" [CO=frontdoor:yes:.example.com:1440:/]
Dans l'exemple ci-dessus, la règle ne réécrit @@ -321,10 +368,9 @@ 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.
-
-RewriteRule "\.(png|gif|jpg)" "-" [E=image:1]
-CustomLog "logs/access_log" combined env=!image
-
RewriteRule "\.(png|gif|jpg)$" "-" [E=image:1] +CustomLog "logs/access_log" combined env=!image+
Notez que le même effet peut être obtenu à l'aide de la directive
SetEnvIf
. Cette technique
@@ -351,7 +397,7 @@ Forbidden.
La règle suivante va interdire la téléchargement de fichiers
.exe
depuis votre serveur.
RewriteRule "\.exe" "-" [F]+
RewriteRule "\.exe" "-" [F]
Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce @@ -372,7 +418,7 @@ disponible auparavant ne l'est plus actuellement.
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] :
-RewriteRule "oldproduct" "-" [G,NC]+
RewriteRule "oldproduct" "-" [G,NC]
Lorsqu'on utilise [G], [L] est implicite - c'est à dire que la @@ -386,7 +432,7 @@ spécifié. Par exemple, on peut utiliser ce drapeau pour forcer l'interprétation de tous les fichiers sans extension par le gestionnaire php :
-RewriteRule "!\." "-" [H=application/x-httpd-php]+
RewriteRule "!\." "-" [H=application/x-httpd-php]
@@ -455,8 +501,8 @@ directive
la requête concerne déjà
index.php
, la directive RewriteRule
sera sautée.
RewriteBase "/" -RewriteCond "%{REQUEST_URI}" "!=/index.php" -RewriteRule "^(.*)" "/index.php?req=$1" [L,PT]+RewriteCond "%{REQUEST_URI}" !=/index.php +RewriteRule "^(.*)" "/index.php?req=$1" [L,PT]
A
par
un B
).
A partir de la version 2.4.8, ce module renvoie une erreur après -32000 itérations afin d'éviter les boucles infinies. Ce nombre maximum +10000 itérations afin d'éviter les boucles infinies. Ce nombre maximum d'itération peut être modifié via le drapeau N.
# On veut remplacer 1 caractère à chaque itération de la boucle -RewriteRule "(.+)[><;]$" "$1" [N=64000] +RewriteRule "(.+)[><;]$" "$1" [N=32000] # ... ou s'arrêter après 10 itérations RewriteRule "(.+)[><;]$" "$1" [N=10]@@ -589,13 +635,17 @@ local.
Utiliser ce drapeau fait intervenir mod_proxy
sans la gestion des connexions
- persistantes, ce qui signifie que vous obtiendrez des performances meilleurs si vous utilisez
- ProxyPass
ou ProxyPassMatch
.
Ceci est du au fait que ce drapeau induit l'utilisation du worker par défaut, qui - ne gère pas la mise en commun et la réutilisation des connexions.
-Partout où cela est possible, préférez l'utilisation de ces directives.
+Utiliser ce drapeau fait intervenir mod_proxy
sans la
+ gestion des connexions persistantes car dans ce cas, c'est le worker par
+ défaut qui est utilisé, et ce dernier ne gère pas la mise en commun et la
+ réutilisation des connexions.
Pour utiliser les connexions persistantes, vous devez définir un bloc
+ Proxy
, au moins pour les parties
+ protocole et hôte de l'URL cible, et contenant une directive ProxySet
où vous définissez par exemple un
+ délai.
Si vous le définissez avec une directive ProxyPass
ou ProxyPassMatch
, les connexions persistantes
+ seront automatiquement utilisées.
Note: mod_proxy
doit être activé pour pouvoir
@@ -745,19 +795,21 @@ avertissements 'Invalid URI in request'.
Le drapeau [S] sert à sauter des règles que vous ne voulez pas voir
exécuter. La syntaxe du drapeau [S] est [S=N], où
N correspond au nombre de règles à sauter (sous
-réserve que la règle RewriteRule
corresponde).
+réserve que la règle RewriteRule
corresponde et qu'au moins
+une condition RewriteCond
+préalable soit vérifiée).
Ceci peut s'interpréter comme une instruction
goto
dans votre jeu de règles de réécriture. Dans
l'exemple suivant, nous ne voulons exécuter la règle RewriteRule
que si l'URI demandé ne
correspond pas à un fichier existant.
# La requête concerne-t-elle un fichier qui n'existe pas ? -RewriteCond "%{REQUEST_FILENAME}" "!-f" -RewriteCond "%{REQUEST_FILENAME}" "!-d" +RewriteCond "%{REQUEST_FILENAME}" !-f +RewriteCond "%{REQUEST_FILENAME}" !-d # Si c'est la cas, on saute les deux règles de réécriture suivantes -RewriteRule ".?" "-" [S=2] +RewriteRule ".?" "-" [S=2] -RewriteRule "(.*\.gif)" "images.php?$1" -RewriteRule "(.*\.html)" "docs.php?$1"+RewriteRule "(.*\.gif)" "images.php?$1" +RewriteRule "(.*\.html)" "docs.php?$1" @@ -772,18 +824,19 @@ d'élaborer des pseudo-constructions if-then-else : la dernière règle du bloc then contiendra
skip=N
, où N est le nombre de règles
contenues dans le bloc else :
# Est-ce que le fichier existe ? -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] +RewriteCond "%{REQUEST_FILENAME}" !-f +RewriteCond "%{REQUEST_FILENAME}" !-d +# Créer une structure conditionnelle if-then-else en sautant 3 lignes si nous +# avions l'intention d'aller au bloc "else". +RewriteRule ".?" "-" [S=3] # Si le fichier existe, alors : -RewriteRule "(.*\.gif)" "images.php?$1" + RewriteRule "(.*\.gif)" "images.php?$1" RewriteRule "(.*\.html)" "docs.php?$1" - # Skip past the "else" stanza. - RewriteRule ".?" "-" [S=1] + # Passer le bloc "else". + RewriteRule ".?" "-" [S=1] # ELSE... -RewriteRule "(.*)" "404.php?file=$1 + RewriteRule "(.*)" "404.php?file=$1" # END@@ -801,7 +854,7 @@ du code source Perl en tant que plein texte, s'il est requis d'une certaine manière :
# Sert les fichier .pl en tant que plein texte -RewriteRule "\.pl$" "-" [T=text/plain]+RewriteRule "\.pl$" "-" [T=text/plain]
Ou encore, si vous possédez une caméra qui produit des fichiers @@ -809,7 +862,7 @@ 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 :
# Les fichiers dont le nom contient 'IMG' sont des images jpg. -RewriteRule "IMG" "-" [T=image/jpg]+RewriteRule "IMG" "-" [T=image/jpg]
Notez cependant qu'il s'agit d'un exemple trivial, et que le problème @@ -849,7 +902,7 @@ var comments_identifier = 'http://httpd.apache.org/docs/2.4/rewrite/flags.html'; } })(window, document); //-->