Introduction
@@ -154,7 +147,7 @@ exemples pour chacun d'entre eux.
module="mod_rewrite">RewriteRule :
- Redirection d'un URI vers une version en minuscules
+ Redirection d'un chemin dâURL vers une version en minuscules
d'elle-même
@@ -413,7 +406,7 @@ directive RewriteMap.
directive Mutex.
Voici un exemple simple qui remplace tous les tirets par des
- caractères de soulignement dans l'URI de la requête.
+ caractères de soulignement dans le chemin dâURL de la requête.
Configuration de la réécriture
@@ -431,16 +424,51 @@ for line in sys.stdin:
print(line.strip().replace('-', '_'), flush=True)
+ 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 STDERR et termine sa course
+ dans le journal des erreurs de httpd.
+
+ Configuration de la réécriture
+
+RewriteMap vhost2docroot "prg:/www/bin/vhost_lookup.py"
+RewriteRule "^/(.*)$" "${vhost2docroot:%{HTTP_HOST}}/$1"
+
+
+ vhost_lookup.py
+
+#!/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)
+
+
Mises en garde !
-- 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.
-- 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
flush=True à print(). Si les entrées/sorties sont mises en tampon, httpd va
-attendre une sortie, et va par conséquent se bloquer.
+- 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.
+- 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
+
flush=True à print(). 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.
- 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
@@ -494,6 +522,78 @@ RewriteMap ma-requete "fastdbd:SELECT destination FROM rewrite WHERE source = %s
règles imposées par votre base de données (comme la sensibilité à la casse).
+
+
Résumé
diff --git a/docs/manual/rewrite/tech.xml.fr b/docs/manual/rewrite/tech.xml.fr
index 8f1a8a759b..29bdcb743a 100644
--- a/docs/manual/rewrite/tech.xml.fr
+++ b/docs/manual/rewrite/tech.xml.fr
@@ -1,7 +1,7 @@
-
+
-
+
@@ -35,9 +35,10 @@ module mod_rewrite et de la mise en correspondance des URLs
Introduction à mod_rewrite
Redirection et remise en
correspondance
+Drapeaux de réécriture
Serveurs virtuels
Utilisation de RewriteMap
-Réécritures en fonction du répertoire (.htaccess)
+Réécritures en fonction du répertoire
Quand ne pas utiliser mod_rewrite
Phases de l'API
@@ -63,7 +64,7 @@ correspondance
Lorsqu'une requête arrive et une fois le serveur
correspondant ou le serveur virtuel déterminé, le moteur de
- réécriture commence à traiter toute directive apparaissant dans la
+ réécriture commence à traiter toute directive mod_rewrite apparaissant dans la
configuration de niveau serveur (autrement dit dans le
fichier de configuration principal du serveur et les sections
Virtualhost).
@@ -76,109 +77,197 @@ correspondance
type="section">Directory) sont appliquées. Ce processus
s'exécute au cours de la phase Fixup.
- Dans tous ces cas, mod_rewrite réécrit le
- REQUEST_URI soit vers une nouvelle URL, soit vers un
+
Dans tous ces cas, mod_rewrite réécrit le
+ REQUEST_URI soit vers un nouvel URL, soit vers un
nom de fichier.
- Dans un contexte de répertoire (autrement dit dans les
- fichiers .htaccess et les sections
- Directory), les règles de réécriture s'appliquent après
- la traduction de l'URL en nom de fichier. C'est pourquoi le chemin
- URL auquel mod_rewrite compare initialement les directives
- RewriteRule est le
- chemin complet vers le nom de fichier traduit amputé de la partie
- répertoires (y compris le dernier slash).
-
- Un exemple : si les règles se trouvent dans
- /var/www/foo/.htaccess et si une requête pour /foo/bar/baz est
- traité, une expression comme ^bar/baz$ correspondra.
-
- Si une substitution intervient dans un contexte de répertoire,
- une nouvelle sous-requête interne est générée avec la nouvelle URL,
- ce qui relance le traitement des phases de la requête. Si la
- substitution est un chemin relatif, la directive RewriteBase détermine le chemin URL
- devant préfixer cette substitution. Dans un contexte de répertoire,
- il faut s'assurer de créer des règles qui
- n'effectueront pas de substitution au
- cours d'une passe ultérieure du processus de réécriture au niveau
- répertoire afin d'éviter les bouclages . Voir Bouclage dans le
- processus de réécriture pour une discussion plus détaillée Ã
- propos de ce problème.
-
- En conséquence de cette manipulation de l'URL , vous devrez
- pensez à confectionner différemment vos règles de réécriture dans un
- contexte de niveau répertoire. En particulier, rappelez-vous que le
- chemin de répertoire sera absent de l'URL que vos règles de
- réécriture verront. Voici quelques exemples qui permettront de
- clarifier les choses :
-
-
-
-
- | Position de la règle |
- Règle |
-
-
-
- | Section VirtualHost |
- RewriteRule "^/images/(.+)\.jpg" "/images/$1.gif" |
-
-
-
- | Fichier .htaccess à la racine des documents |
- RewriteRule "^images/(.+)\.jpg" "images/$1.gif" |
-
-
-
- | Fichier .htaccess dans le répertoire images |
- RewriteRule "^(.+)\.jpg" "$1.gif" |
-
-
-
-
- Pour une étude plus approfondie de la manière dont
- mod_rewrite manipule les URLs dans les différents
- contextes, vous pouvez consulter les entrées du journal
- générées au cours du processus de
- réécriture.
+ Dans un contexte de répertoire,
+ 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 Réécritures en fonction du
+ répertoire pour des détails pratiques à propos de la suppression du
+ chemin, de RewriteBase et de la manière dâéviter un bouclage.
+Module Processing Order
+
+ mod_rewrite et mod_alias agissent tous
+ les deux au cours de la phase de traduction de lâURL en nom de fichier, mais
+ mod_rewrite 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.
+
+ La conséquence pratique : lorsque des directives RewriteRule et Redirect (ou RedirectMatch) 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 RewriteRule
+ correspond et réécrit le chemin dâURL (ou renvoie une redirection),
+ Redirect ne verra jamais la requête.
+
+
+ 
+ Figure : Inversion de lâordre dâopération des modules entre les
+ contextes global au serveur et de répertoire
+
+
+
+# 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]
+
+
+ Le contexte de répertoire inverse lâordre
+ Dans un contexte de répertoire,
+ la situation est différente. Les directives de mod_alias
+ comme Redirect sâappliquent encore dans la phase de traduction
+ de lâURL en nom de fichier, mais les directives de
+ mod_rewrite sâappliquent plus tard, lors de la phase de
+ correction. Cela signifie que dans un contexte de répertoire,
+ Redirect est évaluée avant lâapplication des
+ règles RewriteRule.
+
+
+ Du fait de lâincohérence entre les contextes, mélanger des directives de
+ mod_rewrite et de mod_alias 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
+ RewriteRule. Si une simple redirection de préfixe suffit,
+ utilisez la directive Redirect et nâajoutez pas de règles de
+ réécritures qui pourraient interagir avec elle.
+
+
+
+Encodage et décodage des URLs
+
+ 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 RewriteRule ne soit
+ effectuée. Une requête pour /my%20page/cats%3Fdogs est décodée
+ en /my page/cats?dogs, et câest à cette chaîne décodée quâest
+ comparé le motif de la directive RewriteRule.
+
+ Cela signifie que vous ne pouvez pas écrire un motif correspondant à la
+ forme littérale de lâURL encodé. Si vous devez distinguer
+ /horses%2Fponies de /horses/ponies, utilisez la
+ variable %{THE_REQUEST} dans une directive RewriteCond â cette variable conserve la
+ requête originelle telle quâelle a été envoyée par le client, avant tout
+ décodage :
+
+
+# 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]
+
+
+ Après la substitution, mod_rewrite réencode le chemin
+ dâURL résultant en sortie. Plusieurs drapeaux permettent de contrôler ce
+ comportement :
+
+
+ - [B] : 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.
+
+ - [BNP]Â : si [B] est actif, ce drapeau
+ encode les espaces en
%20 au lieu de + (convient
+ pour les éléments du chemin, pas pour la chaîne de paramètres).
+
+ - [NE]Â : 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
+
#, ? et dâautres caractères lors des
+ redirections externes.
+
+
+
+ Directive AllowEncodedSlashes
+
+ Par défaut, httpd renvoie un code 404 pour tout URL contenant une barre
+ oblique encodée (%2F). La directive AllowEncodedSlashes permet de modifier ce
+ comportement :
+
+
+ Off (valeur par défaut) : rejette %2F avec
+ un code 404.
+ On : autorise %2F et le décode en
+ / avant de le transmettre aux gestionnaires.
+ NoDecode : autorise %2F, 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.
+
+
+ Lorsquâon utilise le drapeau [B] avec des
+ URLs qui peuvent contenir des barres obliques encodées, il est en général
+ nécessaire dâutiliser AllowEncodedSlashes NoDecode pour éviter
+ que httpd ne rejette le résultat réencodé.
+
+
+
+
+
+
Traitement du jeu de règles
- Maintenant, quand mod_rewrite 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.
-
- 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 RewriteRule) les unes
- à la suite des autres, et lorsqu'une règle s'applique, il parcourt
- les éventuelles conditions (directives
- RewriteConddirectives) 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.
+ Maintenant, quand mod_rewrite 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.
+
+
+ 
+ Figure 1 :Le processus de réécriture par requête montrant les
+ deux phases du traitement des règles (par serveur et par répertoire)
+
+
+ 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 RewriteRule) les unes à la suite des
+ autres, et lorsqu'une règle s'applique, il parcourt les éventuelles
+ conditions (directives RewriteConddirectives) 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.

- Figure 1:Déroulement du contrôle à travers le jeu de
- règles de réécriture
+ 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" />
+ Figure 2 :Le flux de contrôle en parcourant le jeu de règles de
+ réécriture
- L'URL est tout d'abord comparée au
+
L'URL est tout d'abord comparé au
Modèle de chaque règle. Lorsqu'une règle ne s'applique
pas, mod_rewrite stoppe immédiatement le traitement de cette règle
et passe à la règle suivante. Si l'URL correspond au
@@ -203,8 +292,17 @@ correspondance
satisfaites, le traitement de la règle en cours se poursuit avec
le remplacement de l'URL par la chaîne de Substitution.
-
+
+ 
+ Figure 3 :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.
+
+
-