Le module mod_rewrite, c’est quoi ?

Un moteur de réécriture, de l’anglais Rewrite Engine (rewrite = réécrire, engine = moteur), est un composant de logiciel Web qui permet de réécrire des URLs (Uniform Resource Locators) ou de les transférer. Le moteur le plus connu est mod_rewrite du serveur HTTP Apache. D’autres serveurs Web existent tels que nginx ou lighttpd dont les fonctions sont similaires.

Ces composants de logiciel interviennent par exemple lorsque que des URLs dynamiques peu fiables, comme ceux parfois utilisés par les systèmes de gestion de contenus, doivent être réécrits pour être davantage adaptés à la navigation. Les raisons sont évidentes. Il est complexe pour un internaute de retenir une URL tel que "http://exemple.com/a/index.php?title=titredepage". Le moteur de réécriture permet donc de créer une adresse plus simple tout en conservant sa source. Par exemple : "http://exemple.com/article/titredepage".

Un internaute peut ainsi utiliser cette URL pour charger le site Internet en question. Dès que la requête est entrée, le module Rewrite Engine modifie automatiquement l’URL dans le schéma utilisé en interne par le serveur "http://exemple.com/a/index.php?title=titredepage".

C’est ainsi que le module Rewrite Engine crée une sorte de couche d’abstraction entre les URLs qui utilisent le projet Web en interne et les URLS qui sont visibles sur le Web. Il permet d’offrir un système d’adressage convivial et uniforme tout en tenant compte des exigences techniques internes.

En interne, il est possible de continuer à utiliser l‘adresse dynamique paramétrée, les internautes ont quant à eux accès à une adresse statique. L’avantage est que ces URLs demeurent actives même si des changements internes sont mis en place dans la hiérarchie des fichiers.

En outre, ces moteurs de réécriture permettent aux administrateurs de sites Internet de mettre en place sous certaines conditions des transferts d’adresses. Il est, par exemple, possible de créer des redirections en se basant sur l’identité d’un agent utilisateur ou sur l’adresse IP du client concerné, le but est alors de mettre en œuvre un ciblage géographique ou d’optimiser un site Internet pour le rendre accessible sur tous les supports. En règle générale, une redirection 301 apparaît alors, ce qui garantit qu’une version du site soit toujours sauvegardée dans l’index du moteur de recherche, et ce indépendamment des autres pendants dédiés aux appareils mobiles ou écrits dans d’autres langues.

Il est primordial de garder ses distances face aux pratiques de cloaking dont le but est d’améliorer le positionnement d’un site en créant deux versions de pages, une destinée aux robots des moteurs de recherche et l’autre destinée à l’utilisateur final.

Exemples d‘application

En ce qui concerne la manipulation d’URLs, le module Rewrite Engine fournit diverses commandes qui sont intégrées au logiciel de serveur Web. C’est ainsi que mod_rewrite peut être utilisé dans un conteneur de répertoire au sein de httpd.conf, dans une partie d’hébergement virtuel ou à l’intérieur d’un fichier .htaccess. Une réécriture d’URL sera noté nginx dans le fichier de configuration /etc/nginx/nginx.conf. Le fichier /etc/lighttpd.conf est disponible dans la configuration VirtualHost sous lighttpd. i

Pour réécrire l’adresse dynamique "http://exemple.com/a/index.php?title=titredepage" via le moteur de réécriture dans l’URL statique "http://exemple.com/article/titredepage", plusieurs commandes sont actionnées dans les serveurs Apache nginx et lighttpd.

Rewrite Engine sous Apache

Afin d’utiliser mod_rewrite sous Apache, il convient que le module de réécriture soit activé via la commande RewriteEngine on. Par la suite apparaît RewriteRule qui définit les instructions pour la réécriture de l’URL en utilisant ce qu’on appelle les expressions régulières (« regular expressions », Regex) :

RewriteEngine on
RewriteRule ^/article/(.*)$ /a/index.php?title=$1

Si la commande RewriteRule définit une redirection, cette dernière doit alors comporter deux paramètres : le modèle de recherche ainsi que le modèle cible.

  • Modèle de recherche : ce paramètre décrit les URLs qui doivent être redirigés. C’est ainsi qu’une condition est définie sous la forme d’une suite de signes. Si cette condition est remplie, une redirection se produit vers un URL en se basant sur le modèle cible. L’exemple actuel serait le modèle de recherche de l’extrait suivant du RewriteRule ^/artikel/(.*)$.
  • Modèle de cible : ce paramètre décrit l’URL vers lequel la direction doit être faite. Si cette dernière est configurée au niveau du serveur, l’URL complet est alors remplacée. En ce qui concerne le répertoire qui se trouve dans le fichier .htaccess ou au sein de httpd.conf, le chemin est uniquement remplacé en partant du répertoire courant. Dans notre exemple, le modèle cible comprend cet extrait du RewriteRule /a/index.php?title=$1.

Le tableau suivant vous explique les expressions régulières utilisées dans notre exemple :

Expressions régulières Explications
^ Décrit le début d’une chaîne.
$ Marque la fin d’une chaîne.
(.*) Un caractère de remplacement pour une suite de signes arbitraire au sein d’un URL. Les parenthèses sauvegardent la suite de signes dans une variable.
$1 Une variable qui permet d’avoir accès aux valeurs mises en cache sauvegardées entre parenthèses.

Le module RewriteRule ^/article/(.*)$ /a/index.php?title=$1 définit en général que cet extrait est réécrit dans le schéma d’URL dynamique /a/index.php?title=$1 pour ce qui est de tous les URLs commençant avec la chaine /articlel/(.*)$1 vaut pour la suite de signes qui correspond au caractère de remplacement.

Si un internaute entre l’URL statique "http://exemple.com/article/titredepage" dans son navigateur, le moteur de recherche le réécrit alors en une adresse dynamique "http://exemple.com/a/index.php?title=titredepage" au niveau interne en se basant sur mod_rewrite et en la rendant invisible aux internautes. Le caractère de remplacement (.*) et la variable $1 correspondent dans ce cas à la suite de signe « titredepage ».

Lorsque la réécriture d’une URL est associée à certaines options qui commandent le comportement du mod_rewrite, ces dernières sont notées entre crochets derrière le RewriteRule et séparées par des virgules (si plusieurs options sont prises en compte). C’est ainsi que les redirections externes via le code de statuts HTTP sont réalisées en externe. Le tableau qui suit montre une sélection d’options pour la commande RewriteRule. Vous en trouverez une liste complète sur le site officiel de la fondation du logiciel Apache.

Options Drapeaux de réécriture Fonctions
Redirect R Le drapeau de réécriture [R] ordonne au serveur Web d’exécuter un transfert externe via le code de statuts HTTP 302. Si un autre code de statuts est envoyé, ce dernier est alors ajouté au drapeau avec un signe égal. Par exemple [R=301].
Forbidden F Ordonne au serveur Web d’envoyer au navigateur le code de statuts HTTP 403 (Forbidden).
Gone G Ordonne le serveur Web d’envoyer le code de statuts HTTP 410 au navigateur et marque le site Internet en question comme inaccessible.
Last L Ordonne le serveur Web de ne plus rien engager suite à la commande RewriteRule actuelle.
Nocase NC En vérifiant si une URL remplit les conditions de la réécriture ou non, les majuscules et les minuscules ne sont pas prises en compte.
Chain C Le prochain RewriteRule est pris en compte seulement si la condition actuelle est convient.

En se basant sur une telle option, il est possible de mettre une redirection externe en place via le code de statuts HTTP suivant :

RewriteEngine On
RewriteRule ^vieillepage.html$ /nouvellepage.html [R=301]

Outre la commande RewriteRules, le module mod_rewrite peut également être défini par RewriteConds avec lesquels les administrateurs de sites Internet fixent des conditions supplémentaires qu’il faut remplir pour engager une réécriture d’URL.

La syntaxe d’une commande RewriteCond correspond à la construction suivante et est noté devant la commande RewriteRule :

RewriteCond TESTSTRING CONDITION

La chaine test comprend en règle générale des variables de serveur définies via un signe de pourcentage et des accolades, comme dans l’exemple %{HTTP_HOST}. Le tableau suivant montre une sélection de variables de serveurs :

Variables de serveur Explications
HTTP_USER_AGENT Fait référence au client qui est utilisé pour l’accès au serveur. La variable est utilisée en générale pour que les divers navigateurs disposent d’un site Internet optimisé.
HTTP_HOST Fait référence au nom d’hôte. Ce dernier peut comprendre des valeurs telles que domain.com, subdomain.domain.com ou l’adresse IP.
SERVER_PORT Fait référence au port concerné (par exemple 80 pour HTTP ou 443 pour HTTPS). Cette variable permet à l’administrateur de site Internet de rediriger l’internaute vers une connexion sécurisée.
REMOTE_ADDR Fait référence à l’adresse IP d’un internaute qui a accès au serveur Web. Cette variable est entre autre utilisé pour bloquer l’accès au spams.

L’exemple suivant montre une commande RewriteCond, qui relie une RewriteRule à l’adresse IP d’un internaute qui dispose d’un accès :

RewriteCond %{REMOTE_ADDR} 173.45.68.79 

Réécriture d’URL sous nginx

Le serveur Web nginx soutient également la réécriture native d’URL. Tout cela est mis en place grâce aux expressions régulières. Pour réécrire des URLs, une commande doit correspondre à la syntaxe nginx et être insérée dans un bloc { [...] } dans le fichier de configuration du serveur Web /etc/nginx/nginx.conf.

location /article {
 rewrite ^/article/(.*)$ /index.php?title=$1 last;
}


L’administrateur de site Internet indique avec location /article que la réécriture d’URL fait référence au répertoire article. Les expressions régulières pour la réécriture correspondent à celles qui interviennent également au niveau des serveurs Web Apache et qui commencent par la commande rewrite. Le drapeau last indique que la réécriture doit avoir lieu en interne et sans redirection. Autrement, les drapeaux restent à disposition pour une redirection temporaire ou durable.

Drapeaux Explications
last Les URLs sont réécrits en interne. Aucune redirection ne suit.
redirect L’utilisateur est redirigé par une redirection temporaire 302 vers une nouvelle URL.
permanent L’utilisateur est redirigé par une redirection durable 301 vers une nouvelle URL.

Si aucun drapeau n’est mis en place, nginx indique de manière automatique le code d’erreur HTTP 500.

Réécriture d’URL sous lighttpd

Sous lighttpd, l’écriture d’une URL est réalisée en se basant sur la fonction url.rewrite-TYP. Le caractère de remplacement TYP vaut pour plusieurs possibilités de configurations de réécriture.

Possibilités de configurations de réécriture Explication
url.rewrite-once Unique réécriture d’URL. Si le modèle de recherche a été trouvé et l’URL a été récrit en fonction de ce dernier, aucune redirection n’a lieu.
url.rewrite-repeat Contrairement à la commande url.rewrite-once, il est possible, grâce à url.rewrite-repeat, de répéter d’autres réécritures.

Dans le cadre d’une réécriture d’URL sous Apache, les expressions régulières intervenantes sont les même que sous Apache, ce qui induit que la syntaxe correspond essentiellement au modèle déjà connu.

url.rewrite-once = (
 "^/article/(.*)$" => "/index.php?title=$1"
)

Si une redirection externe a lieu à la place d’une réécriture interne, lighttpd ne fera alors pas appel au module de réécriture (Rewriting) mais à celui de la redirection (Redirect).

Réécriture sous Microsoft IIS

La plateforme Microsoft Internet Information Services (IIS) ne possède à l’origine aucun moteur de réécriture. Ce dernier peut être après coup ajouté au serveur Web avec le module de réécriture d’URL 2.0 Microsoft pour IIS 7 (x64). C’est ainsi que les utilisateurs de Microsoft peuvent mettre de telles URLs à la disposition de leur internautes sans avoir à toucher à la gestion interne des données. L’extension de réécriture d’URL s’intègre après le téléchargement directement à l’interface du gestionnaire IIS où les modules RewritingRules sont entrés via une interface graphique. Les modules de réécritures d’URL 2.0 IIS utilisent également des expressions régulières dans le but de définir des modèles de recherche et cible d’URL.

Réécriture d’URLs et optimisation pour les moteurs de recherche

Les fonctionnalités de mod_rewrite ainsi que ses pendants dans les autres systèmes de serveurs Web représentent un intérêt pour l’optimisation sur les moteurs de recherche.  C’est ainsi que les URLs dites « conviviales » sont considérées comme des facteurs importants pour le SEO. Par conséquent, les administrateurs de sites Internet bénéficient des effets indirects de ces redirections et récritures. Contrairement aux paramètres cryptés, ces adresses URLS réécrites permettent aux internautes de comprendre vers quoi se mène un lien. Par ailleurs, ils peuvent être utilisés pour mettre les internautes en confiance et, sous certaines circonstances, pour faire croître le taux de clics. Dans un second temps, les requêtes sur Internet sont inscrites en gras dans les résultats de recherche, ce qui incite l’utilisateur à cliquer.