close
DéveloppementOutils - Conseils

Le “mod_rewrite” d’Apache expliqué pour les débutants

Le module mod_rewrite est une caractéristique assez sympathique du serveur Web d’Apache. Ce dernier est très flexible et peut faire toute sorte de choses utiles lors de la gestion de votre site Web, ou de votre application Web. Il utilise un moteur de réécriture à base de règles, basé sur un interpréteur d’expressions rationnelles, pour réécrire les URLs à la volée.

Le mod_rewrite peut être un frein pour les débutants du fait d’une syntaxe un peu compliquée ainsi que son mécanisme de traitement… Cependant, une fois que vous avez compris quelques concepts de base, vous pouvez utiliser le mod_rewrite pour faire ce que bon vous semble sur votre site.

Dans ce tutoriel, vous allez découvrir ce qu’est le que mod_rewrite, et dans quels cas vous allez pouvoir l’utiliser. Vous allez apprendre à créer quelques règles de base, et vous allez explorer certains exemples très utiles du monde réel, et ce afin de les utiliser sur votre propre site.

Qu’est-ce que le mod_rewrite ?

Le mod_rewrite est un module d’Apache ayant pour but de manipuler, réécrire, votre URL. Fréquemment, cela signifie que vous allez récupérer l’URL demandée par un visiteur et leur envoyer le contenu à une URL différente. Par exemple, un visiteur pourrait taper l’URL suivante dans leur navigateur : http://www.example.com/page.html

Normalement, et dans la plupart des cas, Apache va renvoyer au visiteur le contenu du fichier page.html. Cependant, avec le module mod_rewrite d’activé et de configuré, vous pouvez renvoyer le contenu d’une URL différente, comme : http://www.example.com/autre_page.html

La chose importante ici est que cette réécriture se fait au sein même du serveur Apache. La barre d’adresse du navigateur affiche toujours http://www.example.com/page.html, mais Apache renvoie le contenu du fichier http://www.example.com/autre_page.html, comme vous pouvez le voir ci-dessous.
Ainsi, avec le module mod_rewrite, vous pouvez offrir un contenu d’une URL différente de celle demandée par le navigateur.

Le mod_rewrite d'Apache expliqué pour les débutants - Affichage du contenu d'une autre page Web

C’est différent d’une redirection HTTP, qui indique au navigateur de visiter une URL différente de celle demandée.

Remarque : Comme vous le verrez bientôt, vous pouvez aussi utiliser mod_rewrite pour faire des redirections HTTP, ainsi que d’autres choses telles que les codes de retour d’erreur HTTP.

Les choses que vous pouvez faire avec le mod_rewrite

Le mod_rewrite vous permet de créer toutes sortes de règles pour manipuler des URL. Par exemple, vous pouvez insérer des valeurs récupérées de l’URL demandée dans la nouvelle URL, vous permettant de réécrire des URLs dynamiques. Vous pouvez également vérifier les variables du serveur telles que le user agent du navigateur, et seulement réécrire une URL si le navigateur est, par exemple, Safari fonctionnant sur un iPhone.

Voici quelques utilisations courantes du mod_rewrite :

  • Réécrire une URL compliquée, en beaucoup plus simple : Par exemple, vous pouvez mapper l’URL www.example.com/display_article.php?articleId=monarticle en l’URL suivante : www.example.com/articles/mon-article/. Ainsi, tout le monde peut utiliser la précédente URL, plus conviviale que la première proposée
  • Stopper le hotlink : Afin de stopper que le hotlink, c’est-à-dire que d’autres sites place un lien vers vos images dans leurs pages, vous pouvez utiliser le mod_rewrite pour renvoyer une erreur, “Forbidden”, si l’URL de référence n’est pas sur votre propre site
  • Redirection vers des URLs canoniques : De nombreuses pages Web peuvent être accessibles via plusieurs URL, par exemple, www.example.com/test.html et example.com/test.html. Vous pouvez utiliser le mod_rewrite pour rediriger les navigateurs toujours vers la “bonne” URL, tels que www.example.com/test.html
  • Éviter les erreurs 404 lors de la réorganisation de votre site : Disons que vous êtes en train de refaire votre site et que vous avez déplacée la page www.example.com/mon-article.html vers www.example.com/articles/mon-article.html. Avec l’utilisation du mod_rewrite, vous pouvez rediriger www.example.com/mon-article.html vers www.example.com/articles/mon-article.html afin que les visiteurs n’aient pas l’erreur 404, “non trouvé”, lors de la visite de l’ancienne URL qui peut être référencé sur un moteur de recherche, ou à partir d’un autre site. Grâce à la flexibilité du mod_rewrite, vous pouvez facilement créer des règles génériques qui peuvent mapper toutes les anciennes URL vers le nouveau format d’URL

Comment utiliser le mod_rewrite

Pour utiliser le mod_rewrite, vous devez créer des directives Apache afin d’indiquer au mod_rewrite de faire ce dont vous avez besoin. Les directives sont de simples paramètres de configuration. Souvent vous allez mettre ces directives dans un fichier .htaccess niveau supérieur (racine du document) du dossier de votre site Web. Les directives seront appliquées à tout votre site.

Les deux directives du mod_rewrite les plus importantes sont les suivantes :

  • RewriteEngine : Celle-ci active ou désactive l’exécution du moteur de réécriture
  • RewriteRule : Cette directive est le véritable cheval de trait de la réécriture. La directive peut apparaître plusieurs fois, chaque instance définissant une règle de réécriture particulière. L’ordre dans lequel ces règles sont définies est important – il s’agit de l’ordre dans lequel les règles seront appliquées au cours du processus de réécriture

Un exemple très simple est fourni dans le listing ci-dessous. Créez le fichier code>.htaccess et téléchargez-le à la racine de votre site :

[sourcecode language=”bash”]
RewriteEngine on
RewriteRule ^test\.html$ http://www.google.fr/ [R=301]
[/sourcecode]

Ce fichier fait 2 choses : la première ligne active l’exécution du moteur de réécriture (mod_rewrite), la seconde redirige les requêtes pour la page test.html vers Google, en utilisant une redirection HTTP 301.

Remarque : ^test\.html$ est une expression régulière. Cela signifie : “match le début de l’URL (à l’exception de la partie du nom de domaine), suivi du texte test.html, puis suivi par la fin de l’URL”

Maintenant, ouvrez votre navigateur Web et allez sur l’URL test.html de votre site (par exemple, http://localhost/test.html). Si tout se passe bien, vous devriez être redirigé vers http://www.google.fr. Veuillez noter que si vous obtenez une erreur 404, alors il est probable que le mod_rewrite ne soit pas activé sur votre serveur Web.

Comment RewriteRule fonctionne

Vous allez utiliser la directive RewriteRule afin de créer des règles de réécriture. La syntaxe générale de la directive est la suivante : RewriteRule PatternSubstitution[Optional Flags], avec :

  • Pattern : le modèle d’expression régulière. Si une URL correspond à ce pattern, la règle est traitée. Sinon, elle est ignorée
  • Substitution : la nouvelle URL à utiliser
  • [Optional Flags] : sont un ou plusieurs drapeaux qui vous permettent de modifier le comportement de la règle

Quelques exemples du mod_rewrite

Le mod_rewrite est bien plus puissant que le simple exemple que je viens de vous présenter. Selon moi, la meilleure façon d’expliquer ce qu’est le mod_rewrite, est de regarder quelques exemples pratiques. C’est exactement ce que nous allons faire dans la suite de cet article.

Exemple 1 : Eviter les erreurs 404

Parfois, vous pouvez modifier l’URL d’une page sur votre site. Cela peut se produire si vous réorganisez votre contenu. Toutefois, si les moteurs de recherche et d’autres sites ont établi un lien à votre ancienne URL, les visiteurs auront l’agréable surprise de voir une erreur “404 Not Found” s’ils suivent ces liens. (Vous pouvez retrouver un exemple de page 404 sur le blog, en cliquant sur ce lien)

Le mod_rewrite d'Apache expliqué pour les débutants - Erreur 404

Pour résoudre ce problème, vous pouvez utiliser le mod_rewrite pour émettre une redirection 301. Ainsi l’en-tête HTTP sera envoyée pour n’importe quel navigateur demandant l’accès à l’ancienne URL, indiquant à ce dernier que la page a été déplacée de façon permanente vers la nouvelle URL. De plus, pour les moteurs de recherche cela va indiquer qu’ils doivent mettre à jour leur index avec la nouvelle URL.

Le listing ci-après, permet de rediriger une ancienne URL vers une nouvelle. On y retrouve trois parties :

  • ^ancienne-url\.html$ : L’expression régulière qui correspondent à l’URL à réécrire
  • /nouvelle-url.html : La deuxième partie de la directive est l’URL que vous souhaitez utiliser à la place
  • [R=301,L] : La troisième partie d’un RewriteRule est facultative. Il s’agit d’un ou plusieurs drapeaux, séparés par des virgules et entourés par des crochets. Ces drapeaux vous permettent d’ajouter des options et des actions spécifiques à la règle. Dans notre cas, il y a 2 drapeaux : R=301 signifie “émettre une redirection 301 vers la nouvelle URL”, et L signifie “dernière règle” – en d’autres termes, “d’arrêter le traitement si cette règle correspond l’URL demandée”
[sourcecode language=”bash”]
RewriteEngine on
RewriteRule ^ancienne-url\.html$ /nouvelle-url.html [R=301,L]
[/sourcecode]

Exemple 2 : Création d’une URL plus conviviale

Disons que vous avez écrit un script PHP, display_article.php, afin d’afficher des articles de votre site. Vous voudrez sans consulter un article spécifique à l’aide de l’URL suivante : http://www.example.com/display_article.php?articleId=mon-article

Ne nous voilons pas la face, cette URL semble imbuvable à dicter pour un client. Une URL beaucoup plus agréable serait : http://www.example.com/articles/mon-article/.

Vous pouvez utiliser le mod_rewrite afin de réécrire le format de la première URL à la seconde. Pour ce faire, il suffit d’ajouter ce qui se trouve dans le listing ci-dessous, dans votre fichier .htaccess et fonctionne comme suit :

  • ^articles/([^/]+)/?$ : Cette expression régulière correspond à une URL dans le format articles/idArticle/
  • display_article.php?articleId=$1 : Elle indique à Apache d’exécuter le script display_article.php, en passant le texte qui correspondait au pattern [^/]+ en paramètre de la variable articleId. $1 est appelé une backreference, qui permet de stocker le texte qui correspond au résultat du pattern
  • L : Comme vous l’avez vu dans l’exemple précédent, ce drapeau indique au mod_rewrite d’arrêter le traitement si cette règle correspond à l’URL demandée

Donc, la directive RewriteRule prend l’URL appelée au format http://www.example.com/articles/mon-article/ et va afficher à la place le contenu de l’URL http://www.example.com/display_article.php?articleId=mon-article.

[sourcecode language=”bash”]
RewriteEngine on
RewriteRule ^articles/([^/]+)/?$ display_article.php?articleId=$1 [L]
[/sourcecode]

Exemple 3 : Prévenir le hotlinking des images

Une autre utilisation courante du mod_rewrite est de stopper les autres sites Web d’effectuer un lien vers des images de votre propre site. Disons que vous avez une page sur votre site, http://www.example.com/test.html, qui contient l’élément suivant : <img src="mon-logo.png" alt="Mon logo" />

Un autre site pourrait alors accéder directement à votre logo avec la balise suivante sur leur page : <img src="http://www.example.com/mon-logo.png" alt="Le logo du BlogNT" />

Cela signifie que l’autre site va non seulement s’approprier les droits de votre image sur la page, mais qu’il va aussi utiliser la bande passante de votre serveur pour afficher l’image sur leur page. Si ce dernier attire beaucoup de visiteurs alors ce peut être un gros problème pour vous !

Pas de panique ! Vous pouvez utiliser les directives suivantes pour arrêter n’importe quel site d’afficher vos images, sauf le votre bien entendu. Pour cela, placez-les dans un fichier .htaccess dans le dossier racine de votre site, ou dans un dossier d’images pour lequel vous souhaitez vous protéger contre les hotlinks. Ces directives sont présentées dans le listing ci-dessous.

[sourcecode language=”bash”]
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC]
RewriteRule .+\.(gif|jpg|png)$ – [F]
[/sourcecode]

Une fois que vous avez fait cela, toutes les demandes du navigateur pour une image sur votre site dont l’URL commence par se référant un domaine autre que www.example.com ou example.com seront rejetées avec une erreur “403 Forbidden”. L’image ne sera donc pas affichée sur le site distant, et votre bande passante ne sera pas utilisée. Voici comment cet ensemble de règles de fonctionne :

  • RewriteCond %{HTTP_REFERER} !^$ : RewriteCond est une autre directive du mod_rewrite. Elle vous permet de mettre en place une condition qui doit être vrai pour traiter ce qui suit. Dans notre exemple, on va tester si la variable serveur HTTP_REFERER n’est pas vide
  • RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC] : Ici, on va vérifier si la variable HTTP_REFERER ne commence pas par http://www.example.com/ ou http://example.com/. Le drapeau [NC] fait la correspondance : si l’une de ces deux conditions RewriteCond fait défaut, ce qui suit est ignorée
  • RewriteRule .+\.(gif|jpg|png)$ - [F] : La règle actuelle utilise la réécriture en utilisant le drapeau F afin de renvoyer une erreur “403 Forbidden” si l’URL contient un nom de fichier image (ici .gif, .jpg et .png)
  • On peut donc résumer l’ensemble du listing 4 par la phrase suivante : si le HTTP_REFERER n’est pas vide, et HTTP_REFERER ne commence pas par http://example.com/ ou http://www.example.com/, et que l’URL demandée contient un nom de fichier d’une image, rejeter la demande par une erreur “403 Forbidden”.

    Conclusion

    Vous venez de découvrir comment fonctionne le mod_rewrite, et tout ce que vous pouvez faire avec ce module. Vous avez vu comment créer des règles utilisant la directive RewriteRule, et comment faire des conditions avec la directive RewriteCond. De plus, cet article vous a permis de découvrir trois exemples concrets du mod_rewrite :

    • Redirections 301
    • Création d’une URL conviviale
    • Stopper le hotlinking d’images

    Bien sûr, ce tutoriel a à peine effleuré la surface du module mod_rewrite. Bien qu’il y ait une multitude de sujets que je n’ai pas abordés, j’ai essayé de vous donner un bon point de départ pour commencer à écrire vos propres règles .

    Si vous voulez en savoir plus sur ce mod_rewrite, consultez la documentation officielle. Amusez-vous bien !

    Note : Vous allez pouvoir retrouver cet article dans le numéro hors série de PHP Solutions, intitulé “Mobile First! Developper des applications « mobiles » en 2012”, disponible depuis ce lien

    Tags : apacheexemplesexplicationmod_rewritemodule
    Yohann Poiron

    The author Yohann Poiron

    J’ai fondé le BlogNT en 2010. Autodidacte en matière de développement de sites en PHP, j’ai toujours poussé ma curiosité sur les sujets et les actualités du Web. Je suis actuellement engagé en tant qu’architecte interopérabilité.