Réécriture d'urls avec mod_rewrite : exemples concrets d'utilisation
Cet article montre quelques exemples concrets de réécriture d'urls grâce au module mod_rewrite du serveur web Apache.
Je pars ici du principe que le module est correctement installé sur le serveur et chargé en mémoire. Pour ceux qui ne sont pas sur un serveur dédié, sachez que la plupart des hébergeurs mutualisés propose cette option.
La configuration de mod_rewrite peut être mise à deux endroits différents. Soit directement dans la configuration du serveur, soit dans le fichier .htaccess du répertoire du site. Cette dernière solution sera généralement utilisée dans le cas d'un hébergement mutualisé.
Pour pouvoir se servir de la réécriture des urls, il faudra avant toute chose activer l'utilisation de ce module en ajoutant les lignes suivantes :
# Activation de mod_rewrite RewriteEngine on
Faire une simple redirection
On commence avec une règle assez, qui consiste à faire une simple redirection.
RewriteRule ^/$ /accueil.html [R]
Ici on indique que si l'utilisateur demande une url qui commence (symbole ^) et qui finie (symbole $) par /, alors on le redirigera vers la page accueil.html. Voici un autre exemple de redirection sur une page bien précise :
RewriteRule ^/index.html$ /accueil.html [R]
Eviter le Duplicate Content
Selon la configuration de votre site web, ce dernier peut parfois être accessible via deux urls différentes :
- par l'adresse http://tux-planet.fr
- par l'adresse http://www.tux-planet.fr
Même si au premier abord cela ne semble pas gênant, certains moteurs de recherche ne l'entendent pas de la même oreille et considèrent qu'il s'agit là de deux sites bien différents avec le même contenu. Cette technique, connue sous le nom de "Duplicate Content" n'est pas très appréciée par google par exemple et peut avoir un effet négatif sur votre positionnement.
Pour y remédier facilement, on peut utiliser mod_rewrite pour réécrire toutes les urls du site :
# On récrit les urls sans www RewriteCond %{HTTP_HOST} !^www.tux-planet.fr$ RewriteRule ^(.*) http://www.tux-planet.fr/$1 [QSA,L,R=301]
RewriteCond va ici prendre en compte toutes les urls qui ne contiennent pas "www.tux-planet.fr", pour les réécrire avec le www en plus.
Rendre les urls de votre site plus belles
Mod_rewrite peut être utile si l'on souhaite avoir de belles urls. Je vais prendre l'exemple de Planet Libre, qui utilise des urls de ce type pour naviguer à travers les pages :
http://www.planet-libre.org/index.php?page=1
Afin de les rendre plus belles, je souhaiterais qu'elles soient plutôt de la forme :
http://www.planet-libre.org/page1
L'utilisation de mod_rewrite sera ici la solution la plus simple et rapide (pas besoin de recoder certaines parties du site) :
RewriteRule ^page([0-9]*)$ /index.php?page=$1 [L]
Ici, on s'occupe de réécrire tous les urls qui se terminent en pageXX (ou XX est un chiffre de 0 à 9), en index.php?page=XX afin que l'application web puisse comprendre ce qu'on lui demande.
Empêcher l'utilisation de vos images en dehors de votre site web
Il n'est pas rare de constater que certaines personnes reprennent les urls des images de votre site pour les afficher sur le leur. Cela permet d'économiser, en autre, de la bande passante qui est facturée si chère par les hébergeurs.
Pour remédier à cela, il est possible d'utiliser encore une fois mod_rewrite comme ceci :
# On interdit l'affichage des images en dehors du site RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://www.tux-planet.fr/.*$ [NC] ReWriteRule .*\.(gif|png|jpe?g)$ - [F]
La configuration ci-dessus va prendre en compte toutes les requêtes, sauf celles qui sont internes au site www.tux-planet.fr, et va en interdire l'accès grâce à l'option [F] qui veut dire Forbidden. On notera que dans la dernière ligne, on affine un peu plus la réécriture en ne s'occupant que des formats d'image gif, png, jpg et jpeg.
Pour ma part, j'ai du adapter un peu cette configuration, car les articles de ce site sont repris dans le Planet Libre, et les images n'y apparaissaient plus suite a cette manipulation.
Voici à quoi ressemble la configuration après adaptions :
# On interdit l'affichage des images en dehors du site RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://www.tux-planet.fr/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.planet-libre.org/.*$ [NC] ReWriteRule .*\.(gif|png|jpe?g)$ - [F]
Forcer l'utilisation du protocole https
Si vous êtes en possession d'un certificat SSL et que vous souhaitez que l'intégralité de votre site ne soit accessible que par le protocole https, cet autre exemple devrait vous intéresser :
# Passage en https toutes les urls RewriteCond %{SERVER_PORT} !^443$ RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]
Ici on s'occupe de réécrire toutes les urls qui n'utilisent pas le port 443 (https).
Dans certains cas, on ne voudra pas que tous les sites soient en https, mais seulement une partie bien précise. Par exemple l'interface d'administration.
Ceci est biensûr possible, il suffit simplement de rajouter une condition qui ne s'occupera que des urls comportant une chaîne bien précise :
RewriteCond %{SERVER_PORT} !^443$ RewriteCond %{REQUEST_URI} ^/admin(.*) RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]
Dans cet exemple, le passage en https ne se fera que pour les urls qui commencent par www.tux-planet.fr/admin/ et qui utilisent le protocole http.
21 Commentaires pour "Réécriture d'urls avec mod_rewrite : exemples concrets d'utilisation"
Flux des commentaires de cet article Ajouter un commentaireMerci à au pssage Spawnrider. pour m'avoir fait découvrir le "Duplicate Content" et la méthode pour y remédier.
Mais de rien
C'est bien normal de s'entre-aider, au plaisir de te revoir sur mon blog
Article très complet et bien commenté.
Merci à tous les deux.
Bon article mais
RewriteCond %{HTTPS} .*off.*
Est plus elegant pour detecter le https
My 2 cents
Regarde Seb :
http://www.zataz.com/tutorial/11...
Zataz ils font un lien vers ton site
@Deedo : c'est vrai que le https n'est pas forcement que sur le port 443.
@SckyzO : zataz possède un digg like, et c'est moi qui a soumis l'article.
Enfin un article qui présente les possibilités du mod_rewrite simplement ! Merci (toujours aussi stylé ton blog
)
@Goudie : merci.
As tu un truc pour le duplicate content venant des sites qui agrège les posts ?
il n'y a rien a faire avec htaccess en tout cas ...
Regarde l'exemple qui à été fait pour bloquer les images en extérieures. A mon avis tu peux reprendre la même chose, en changeant l'extension (la plus part des flux on l'extension xml ou port le nom de rss.php ...).
En revanche gars aux effets de bord, car tes flux ne seront peut-être plus lisible sur certains agrégateurs en ligne, comme netvibes ou google reader. Il faudra alors les autoriser un par un, via :
RewriteCond %{HTTP_REFERER} !^url-de-l-agrégateur-en-l... [NC]
Je crois que je ne vais rien faire pour l'instant du coup ...
On peut aussi choisir de réécrire les URLS sans www : no-www.org/
Des rebelles de l'anti "www"... On aura tout vu pour se faire remarquer !
Je ne vois pas trop l'intérêt de milliter contre le "www" ...
Je viens de découvrir ton blog via spawnrider, et je le trouve vraiment formidable. Je me demandais justement par rapport à ces réécritures et en regardant monPR...à la racine de mon blog htp://3w.citronet.ca/blog/ j'ai un PR de 3 alors qu'avec le index.php je monte à PR4...Qu'elle option serait la plus avantageuse afin de regrouper le tout...forcer le index.php ou le retirer. Je suis en query_string sous DC2B7.
Merci et bravo encore, je m'abonne
@JFMichaud : pour ton histoire de page rank, cela vient du faite que tu as plus de backlink (lien retour) sur l'adresse avec index.php que l'autre.
Par exemple, sur ton commentaire ici, en url de site tu as soumit celle avec le index.php. Pour ma part, dans tous les commentaires que je poste, je donne toujours l'url dans sa forme la plus courte et je conseil de faire pareil.
Cela me semble une bien meilleure solution, plutôt que de commencer à jouer avec une configuration de mod_rewrite.
L'article est très clair, merci.
Y'a t'il un moyen pour réecrire les urls dynamiquement avec des mots clés définis par des variables dans une page php ??
exemple : http://www.monsite.com/page1?phpsession=012345678910111213141516
réécrit en : http://www.monsite.com/page1-motsclé1-motclé2
D'après moi, cela boosterai considérablement le référencement
Merci
@micha : personnellement je vois pas comment tu va faire la liaison entre "012345678910111213141516" et les mots-clés données dans l'exemple.
ok merci pti-seb.
alors pour poser une question plus résonnable : est ce que le fait d'avoir ce genre d'adresse , avec la session est pénalisant pour le référencement ??
Merci
@micha : cela ne va pas t'aider, la présence des mots clés dans l'url et dans le titre des pages est quelque chose de très apprécié par les moteurs de recherche. Avec une simple série de numéros comme tu le montre, tu risuqe d'être moins visible dans les résultats de recherche.
ok merci pour la réponse.
A bientôt
Michael