Serveur HTTP Apache Version 2.5

Ce document passe en revue certains détails techniques à propos du
module mod_rewrite et de la mise en correspondance des URLs
Le traitement des requêtes par le serveur HTTP Apache se déroule en plusieurs phases. Au cours de chaque phase, un ou plusieurs modules peuvent être appelés pour traiter la partie concernée du cycle de vie de la requête. Les différentes phases peuvent consister en traduction d'URL en nom de fichier, authentification, autorisation, gestion de contenu ou journalisation (la liste n'est pas exhaustive).
mod_rewrite agit dans deux de ces phases (ou accroches - hooks -
comme on les nomme souvent) pour la réécriture des URLs.
Tout d'abord, il utilise le hook traduction URL vers nom de
fichier qui intervient après la lecture de la requête HTTP, mais
avant le processus d'autorisation. Ensuite, il utilise le hook
Fixup, qui intervient après les phases d'autorisation, après la
lecture des fichiers de configuration de niveau répertoire (fichiers
.htaccess), mais avant l'appel du gestionnaire de
contenu.
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 mod_rewrite apparaissant dans la
configuration de niveau serveur (autrement dit dans le
fichier de configuration principal du serveur et les sections
<Virtualhost>).
Tout ce processus s'exécute au cours de la phase de traduction URL
vers nom de fichier.
Quelques étapes plus loin, une fois les répertoires de données
finaux trouvés, les directives de configuration de niveau répertoire
(fichiers .htaccess et sections <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
nom de fichier.
Dans un contexte de répertoire, les règles sont appliquées durant la phase "Fixup" après que l’URL a été traduite en nom de fichier. Cela modifie ce à quoi correspond le motif et la 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.
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.

Figure 1:Déroulement du contrôle à travers le jeu de
règles de réécriture
L'URL est tout d'abord comparée 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
Modèle, mod_rewrite recherche la présence de conditions
correspondantes (les directives Rewritecond apparaissant dans la
configuration juste
avant les règles de réécriture). S'il n'y en a pas, mod_rewrite remplace
l'URL par une chaîne élaborée à partir de la chaîne de
Substitution, puis passe à la règle suivante. Si des
conditions sont présentes, mod_rewrite lance un bouclage
secondaire afin de les traiter selon l'ordre dans lequel elles
sont définies. La logique de traitement des conditions est
différente : on ne compare pas l'URL à un modèle. Une chaîne de
test TestString est tout d'abord élaborée en développant
des variables, des références arrières, des recherches dans des
tables de correspondances, etc..., puis cette chaîne de test est
comparée au modèle de condition CondPattern. Si le modèle
ne correspond pas, les autres conditions du jeu ne sont pas
examinées et la règle correspondante ne s'applique pas. Si le
modèle correspond, la condition suivante est examinée et ainsi de
suite jusqu'à la dernière condition. Si toutes les conditions sont
satisfaites, le traitement de la règle en cours se poursuit avec
le remplacement de l'URL par la chaîne de Substitution.