Comment ajouter automatiquement un slash en fin d’URL

Posté le lundi 3 mai 2010 par Matt

Après de longues et fastidieuses recherches pour ajouter automatiquement un slash ( ‘/’ ) à la fin des adresses de mes sites web, j’ai pensé que certains pourraient profiter du fruit de ces recherches…

Pour ceux qui se demanderaient quel est le but de la manœuvre, il s’agit encore une fois d’un souci de référencement.
En effet, pour un moteur de recherche, http://www.siteweb.com/nom et http://www.siteweb.com/nom/ ne sont pas équivalents. Ceci est hérité d’une époque où /nom représentait un fichier et /nom/ un répertoire. Rien alors n’empêchait d’avoir au même endroit un répertoire et un fichier du même nom.

Aujourd’hui, on a pris l’habitude de rendre les URIs plus clairs et plus simples pour les utilisateurs, et la plupart du temps on s’arrange pour que http://www.siteweb.com/nom et http://www.siteweb.com/nom/ renvoient sur la même page.
Une fois encore, le risque est de se retrouver avec deux pages considérées comme des doublons par les moteurs de recherche, diluant le référencement global de la page.
Pour éviter cela, on va donc chercher à avoir une page canonique, et à renvoyer l’autre sur celle-ci.

Il existe plusieurs façons de faire ça, la plus simple étant probablement l’usage de l’attribut « canonical » récemment introduit par Google.
Pour référence, il s’agit d’introduire un tag du type <link rel="canonical" href="http://www.creation-de-sites-web.com/w3c.php?quality=high"> dans la balise <head> de la page en question. Ainsi, plusieurs URLs pourront pointer sur cette page, mais Google sera informé que c’est l’adresse indiquée dans ce href qui fait référence.

Une autre méthode consiste à systématiquement rediriger le visiteur sur l’adresse de page que l’on souhaite mettre en avant.
Ceci peut se faire au niveau de la page elle même (par exemple en php), mais il est probablement beaucoup plus approprié de le faire au niveau du serveur web (Apache) ou d’un fichier .htaccess.

On a alors plusieurs outils à notre disposition, liés à mod_alias et mod_rewrite (pensez à vérifier qu’ils sont bien activés sur votre hébergement avant de commencer à expérimenter! Ce n’est pas toujours le cas)

Mes expérimentations m’ont fait passer de RewriteRule à RedirectMatch, puis de retour sur RewriteRule pour un résultat qui m’a enfin paru satisfaisant.
En guise de documentation, je vous invite à visiter la documentation Apache, notamment les liens suivants :
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog

Sans plus de préambule, voici ma solution :

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_URI} (^/blog/.*)$  [NC]
RewriteRule ^.*$ - [NC,L]

RewriteRule ^(.+[^/])$  %{REQUEST_URI}/  [R=301,L]

RewriteRule ^.*$ index.php [NC,L]

Détaillons un petit peu :

RewriteEngine On

On s’assure que le moteur de ré-écriture d’URL est allumé. S’il n’est pas disponible, on aura généralement une erreur 500.

On va ensuite tester différents cas de figure :

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_URI} (^/blog/.*)$  [NC]
RewriteRule ^.*$ - [NC,L]

Si le lien pointe vers un fichier de taille non nulle (-s = sized file)
ou bien
que le lien pointe vers un lien (-l = link)
ou bien
que le lien pointe vers un répertoire (-d = directory)
ou bien que l’URI commence par /blog/ sans tenir compte de la casse (NC = Not Case-sensitive)
alors on va remplacer l’URL par elle même (-) et ignorer les règles suivantes (L = Last rule)

RewriteRule ^.*[^/]$  %{REQUEST_URI}/  [R=301,L]

Si l’on est toujours là, c’est que les conditions précédentes n’ont pas été remplies.
On est donc pas en présence d’un fichier/lien/répertoire ni d’une entrée du blog (que nous avons mis ici à titre d’exemple d’un élément d’arborescence à exclure… A noter que les blogs comme WordPress ont leur propre système de ré-écriture d’URLs).
On va alors remplacer tout ce qui ne finit pas par un / ( soit ^.*[^/]$ en expression régulière ) par l’adresse visée suivie d’un / ( %{REQUEST_URI}/ ) et faire une redirection externe sur cette adresse (R = Redirect, 301 = le code d’erreur que l’on souhaite envoyer ).
Ceci sera notre dernière règle (L = Last), afin d’éviter qu’elle ne soit remplacée par une autre avant que la redirection n’ait été prise en compte (ça n’a l’air de rien, mais j’ai du perdre un certain nombre de cheveux avant de comprendre ça!)

Enfin, dans le cadre de nos projets à URLs customisées, on va généralement renvoyer tout le reste sur le fichier index.php qui s’occupera de l’interpréter :

RewriteRule ^.*$ index.php [NC,L]

Peut-être y a-t-il de meilleures façons de procéder. Si c’est le cas, je serai ravi de les découvrir.
Quoi qu’il en soit, n’hésitez pas à laisser un commentaire, ça fait toujours plaisir ;)

Laisser un Commentaire

Haut de page
Clicky Web Analytics