Réécriture d’URL : les rendre plus sexy avec un slug

Réécriture d’URL : les rendre plus sexy avec un slug

En plus d’être plus jolies pour vos visiteurs, les URL qui définissent le contenu de la page sont également utiles en référencement.

Voyons comment mettre en place un système de slug sur un site Web fait en PHP.

URL sexy ?

Pour vos visiteurs, il est plus facile de s’y retrouver en voyant une adresse de type :
http://monsite/page-sur-un-sujet/
plutôt que :
http://monsite/index.php?id=42

D’ailleurs, les moteurs de recherche extraient également les mots de cette URL pour donner un peu plus d’importance aux mots-clefs que la page contient.

Ainsi, selon le type de votre site, et s’il demande une rétribution à vos visiteurs, par exemple dans le cadre d’un annuaire payant, cette URL améliorée et qui propose des bénéfices en terme de référencement peut devenir un argument commercial.

Voilà donc au moins trois bonnes raisons d’insérer le slug, c’est-à-dire la partie descriptive après le nom de domaine, dans vos URL.

Mise en place

Le stockage des slugs

La première chose à faire est de stocker le slug dans la table qui va bien, celle qui contient les articles ou les évènements par exemple.

Il doit être unique, dans l’idéal il devrait ne pas comporter de caractères spéciaux comme les accents ou le slash et ne pas être trop long.

Il devrait également être éditable dans l’interface d’édition des articles.

Tant qu’à faire, et que nous sommes dans l’ajout de champs et la modification de l’interface d’édition, autant ajouter un champ de description du contenu pour les moteurs de recherche.

Il s’agit de la description affichée directement dans les pages de résultat des moteurs de recherche, et qui doit se trouver dans une balise meta du header de la page HTML.

Le fichier .htaccess

En saisissant cette URL : http://monsite/page-sur-un-sujet/ le dossier page-sur-un-sujet n’existe pas.

L’astuce est de rediriger toutes les pages qui n’existent pas vers un fichier qui s’occupera du traitement.

Tout se passe dans le fichier .htaccess qui doit se trouver à la racine du site :

<IfModule mod_rewrite.c>
# Active la réécriture d'URL :
RewriteEngine On
# Si le fichier demandé n'existe pas :
RewriteCond %{REQUEST_FILENAME} !-f
# Si le dossier demandé n'existe pas non plus :
RewriteCond %{REQUEST_FILENAME} !-d
# On redirige vers index.php
RewriteRule . index.php [L]
</IfModule>

Mise en oeuvre en PHP

Une fois redirigé par le fichier .htaccess, on arrive dans le fichier index.php, il reste à récupérer le slug demandé pour l’afficher.

En PHP, la véritable URL demandée se trouve dans $_SERVER["REQUEST_URI"], qui contient /page-sur-un-sujet/.

Si le site n’est pas à la racine du domaine, mais dans un sous-dossier, par exemple :
http://monsite/annuaire/page-sur-un-sujet/
alors, $_SERVER["REQUEST_URI"] contient /annuaire/page-sur-un-sujet/.

Pour extraire le slug, et ne plus avoir que page-sur-un-sujet, même si le site est dans un sous-dossier, en enlevant les slash de début et de fin :

$slug = trim(utf8_decode(trim(substr($_SERVER["REQUEST_URI"], strlen(dirname($_SERVER["SCRIPT_NAME"])) + 1))), "/");

La variable $slug contient le slug, qu’il ne reste plus qu’à traiter.

Par exemple, pour afficher le contenu selon l’information fournie, c’est-à-dire soit l’identifiant de la page, soit le slug :

if ($_GET["id"]) {
  $result = mysql_query("select content from pages where id = " .  mysql_real_escape_string($_GET["id"]));
} else {
  $result = mysql_query("select content from pages where slug = " .  mysql_real_escape_string($slug));
}
// Traitement de la page

Voilà, c’est aussi simple.

Autres points importants

Eviter les contenus dupliqués

Comme l’un des buts de cette manoeuvre est l’amélioration du référencement naturel, il serait dommage de le plomber en laissant penser aux moteurs de recherche que la page accédée par identifiant et celle par slug sont deux pages différentes, mais avec le même contenu.

Une solution pour éviter ceci est d’utiliser la balise canonical, en indiquant l’adresse de la page avec le slug dans tous les cas :

<link rel="canonical" href="http://monsite/page-sur-un-sujet/" />

Les catégories

Si vous proposez plusieurs types de contenu, vous pouvez très bien les catégoriser par l’URL, par exemple, pour regrouper les évènements :
http://monsite/evenements/page-sur-un-sujet/

En plus de donner une hiérarchie à votre site, cette architecture permet de réduire les chances d’avoir des doublons.

Aussi, cette méthode permet aussi d’ajouter un mot-clef automatiquement à toutes les pages du même genre.

Son implémentation du côté de PHP n’est pas beaucoup plus compliquée. Avec notre $slug vu plus haut :

// Découpe le slug en deux parties
list($category, $slug) = explode("/", $slug);
switch ($category) {
  case "evenements":
    // traitement de l'évènement
    break;
  case "pages":
    // traitement de la page
    break;
}

Page d’erreur

Partant du principe que la page demandée n’existe pas réellement, du principe même de la redirection dans le fichier .htaccess, il est nécessaire de gérer à ce moment là les erreurs de page non trouvée.

Cette erreur intervient un peu plus loin dans le processus : si le slug, ou le couple catégorie/slug, n’existe pas, le traitement sera d’afficher une page d’erreur 404, en définissant son code HTTP :

header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");

Pour rappel, cette fonction header() doit être appelée avant toute sortie ou affichage vers le navigateur.

La description pour les moteurs de recherche

Je vous suggérais de stocker, en plus du slug, une description de 156 caractères maximum destinée à être affichée dans les pages de résultat des moteurs de recherche.

Cette description peut contenir des mots-clefs pertinents et aide au référencement.

Pour l’utiliser, il suffit d’ajouter cette ligne dans la partie <header> :

<meta name="description" content="la description"/>

Le mot de la fin

Des CMS tels que WordPress font ce genre de chose nativement et offrent beaucoup de possibilités pour personnaliser un site. Alors pourquoi ne pas l’utiliser directement me direz-vous. Bonne question !

En tout cas, maintenant, vous savez comment l’implémenter directement en PHP.

Cet article vous a été utile ? Partage it !

4 réflexions au sujet de « Réécriture d’URL : les rendre plus sexy avec un slug »

    1. Bonjour Lucas,
      Dans certains cas WordPress est un très bon choix, et d’autres fois il est préférable de partir sur une base développée pour l’occasion.
      L’un des gros avantages de ce CMS (et des autres) est qu’il permet d’éviter les erreurs, comme l’oubli d’un title sur la page portfolio 😉
      Dans tous les cas, c’est l’étude technique qui indique lequel est le mieux 🙂
      David

  1. la réécriture est effectivement très importante aussi bien pour l’internaute et sa compréhension que nos chers amis, les moteurs de recherche.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Si vous le souhaitez, renseignez le champ 'Nom' de cette façon : 'VotreNom@VotreMotClef' pour obtenir une ancre optimisée pour les moteurs de recherche.