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.
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é dumod_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 :
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)
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 »
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 formatarticles/idArticle/
display_article.php?articleId=$1
: Elle indique à Apache d’exécuter le scriptdisplay_article.php
, en passant le texte qui correspondait au pattern[^/]+
en paramètre de la variablearticleId
.$1
est appelé une backreference, qui permet de stocker le texte qui correspond au résultat du patternL
: Comme vous l’avez vu dans l’exemple précédent, ce drapeau indique aumod_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.
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.
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 dumod_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 serveurHTTP_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