Réécriture d'urls avec mod_rewrite : exemples concrets d'utilisation


Stylo
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 commentaire
  •  

    Merci à au pssage Spawnrider. pour m'avoir fait découvrir le "Duplicate Content" et la méthode pour y remédier.

    RépondreRépondre
    pti-seb , le 16 septembre 2007 à 16:38
  •  

    Mais de rien :)
    C'est bien normal de s'entre-aider, au plaisir de te revoir sur mon blog :)

    RépondreRépondre
    spawnrider , le 16 septembre 2007 à 22:58
  •  

    Article très complet et bien commenté.
    Merci à tous les deux.

    RépondreRépondre
    Osku , le 17 septembre 2007 à 11:16
  •  

    Bon article mais

    RewriteCond %{HTTPS} .*off.*

    Est plus elegant pour detecter le https
    My 2 cents

    RépondreRépondre
    Deedo , le 20 septembre 2007 à 16:17
  •  

    Regarde Seb :
    http://www.zataz.com/tutorial/11...

    Zataz ils font un lien vers ton site :)

    RépondreRépondre
    SckyzO , le 20 septembre 2007 à 18:19
  •  

    @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.

    RépondreRépondre
    pti-seb , le 20 septembre 2007 à 19:28
  •  

    Enfin un article qui présente les possibilités du mod_rewrite simplement ! Merci (toujours aussi stylé ton blog ;) )

    RépondreRépondre
    Goudie , le 22 septembre 2007 à 16:58
  •  

    @Goudie : merci.

    RépondreRépondre
    pti-seb , le 22 septembre 2007 à 17:05
  •  

    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 ...

    RépondreRépondre
    jeff.keyser , le 28 septembre 2007 à 10:09
  •  

    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]

    RépondreRépondre
    pti-seb , le 28 septembre 2007 à 10:32
  •  

    Je crois que je ne vais rien faire pour l'instant du coup ...

    RépondreRépondre
    jeff.keyser , le 28 septembre 2007 à 17:02
  •  

    On peut aussi choisir de réécrire les URLS sans www : no-www.org/

    RépondreRépondre
    Moe , le 6 octobre 2007 à 02:44
  •  

    Des rebelles de l'anti "www"... On aura tout vu pour se faire remarquer !

    RépondreRépondre
    Goudie , le 6 octobre 2007 à 13:44
  •  

    Je ne vois pas trop l'intérêt de milliter contre le "www" ...

    RépondreRépondre
    pti-seb , le 6 octobre 2007 à 15:53
  •  

    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

    RépondreRépondre
    JFMichaud , le 27 octobre 2007 à 23:18
  •  

    @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.

    RépondreRépondre
    pti-seb , le 28 octobre 2007 à 16:48
  •  

    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

    RépondreRépondre
    micha , le 12 janvier 2008 à 16:44
  •  

    @micha : personnellement je vois pas comment tu va faire la liaison entre "012345678910111213141516" et les mots-clés données dans l'exemple.

    RépondreRépondre
    pti-seb , le 15 janvier 2008 à 09:07
  •  

    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

    RépondreRépondre
    micha , le 15 janvier 2008 à 09:39
  •  

    @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.

    RépondreRépondre
    pti-seb , le 15 janvier 2008 à 12:29
  •  

    ok merci pour la réponse.

    A bientôt

    Michael

    RépondreRépondre
    micha , le 15 janvier 2008 à 14:29
 

Ajouter un commentaire

actualité android apache apple astuce astuces bash bilboblog blog boot chrome clavier commande commandes conky date debian Desktop développement elementary exploit faille fedora firefox flash gimp gnome google graphique Graphisme hack hacking Hardware humour intel internet iphone jailbreak Jeux Kde kernel libre Linux log logiciels Logiciels Libres lucid lynx maemo mail maquette metasploit microsoft mobile mockup monitoring mozilla multi-touch musique mysql n900 nautilus nokia noyau openoffice open source password photos php Planet publicité redhat red hat rpm réseau screenshot script serveur serveurs shell sql ssh statistiques sysadmin system Sécurité thème tux-planet tv twitter ubuntu unity vidéo vidéos vlc voyage wallpaper windows wordpress yum