SEO et PHP

Gazette Linux n°116 — Juillet 2005

Pete Savage

Article paru dans le n°116 de la Gazette Linux de juillet 2005.

Traduction française par Deny .

Relecture de la traduction française par Joëlle Cornavin .

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières
1. Introduction
2. Structuration
3. Codage préliminaire
4. Entrée en scène de mod_rewrite
5. mod_rewrite dévoilé !
6. Construction d'une base de données de produits
7. mod_rewrite à la rescousse
8. Résumé

Dans notre monde actuel en constante évolution, l'importance de la SEO (Search Engine Optimization, optimisation des moteurs de recherche) et sa maniabilité ont été propulsées sur le devant de la scène. De plus en plus d'entreprises et d'employeurs entendent la rumeur qu'est la SEO et veulent une garantie que leur nouveau site web la mettra en œuvre. Ils veulent tous étre en tête des moteurs de recherche et nous savons tous que cela se produira rarement. Il y a cependant des choses que nous pouvons faire pour aider à résoudre le problème et faciliter un peu la vie de ces aimables robots qui parcourent nos pages.


1. Introduction

Que vous croyiez ou non au fait que les moteurs de recherche font de la discrimination envers les numéros d'ID dans les chaînes d'URL ou non, il en ressort effectivement que :


[1] http://www.a_mucky_page.com/products?id=00234987&category=990003429

ne semblera jamais aussi agréable à l'utilisateur final ou aux moteurs de recherche que :


[2] http://www.a_nice_place_to_be.com/products-modems/speed-baud-5000.html

Se débarrasser des paramètres GET est aussi un avantage, car certains moteurs de recherche feront de la discrimination envers les pages basées sur le nombre de paramètres.

Cet article est une introduction pour aider à surmonter ce probléme, en utilisant PHP/MySQL/Apache et un zeste de mod_rewrite pour relever le tout. Dans certains cas, il est possible que ce ne soit pas la meilleure solution, mais il vaut toujours la peine de la prendre en considération, car mod_rewrite est un outil extrêmement puissant dans votre trousse à outils PHP de développement web.

Pour commencer, vous aurez besoin d'un serveur web sous Apache avec mod_rewrite installé. Si vous êtes propriétaire du serveur, ce sera facile. Dans le cas contraire, vous risquez d'avoir du mal à faire installer mod_rewrite à des administrateurs. Les raisons en sont simples : les administrateurs n'essaient pas de vous ennuyer, mais une seule erreur dans le code de mod_rewrite entraîne une surcharge du processeur. Cet article part du principe que vous avez déjà quelques connaissances sur les systèmes LAMP (Linux/Apache/MySQL/PHP) et que vous disposez de mod_rewrite.


2. Structuration

La structuration de votre base de données est une étape importante du processus et doit être soigneusement pensée. Cependant, il se peut que votre base de données soit déjà assez bien organisée, auquel cas il n'y a rien à faire. Garder vos données en bon ordre non seulement vous facilite la tâche, mais contribue automatiquement à une meilleure mise en œuvre du systéme SEO. Nous allons employer l'exemple d'un système de catégorisation monorangée (single-tier). Cela signifie que les produits sont classés dans une seule catégorie qui leur convient le mieux. Nous aurons deux tables, une pour la catégorie et une pour les produits. Leur structure sera telle que dans les tables ci-dessous. Vous pouvez voir que la table des produits est liée à la table de catégorie par l'intermédiaire du champ categorie_id.


Catégorie
    id 
    titre 
    description 

Produits
    id  :
    categorie_id 
    titre 
    description 
    prix


3. Codage préliminaire

Écrivons quelques lignes de code en PHP pour extraire les informations des enregistrements basés sur la ligne d'URL [1] ci-dessus. Nous avons les deux paramètres dont nous avons besoin : produits et categorie. Le client veut connaître les informations sur les catégories répertoriées sur la page avec le produit. Le code de cette opération ressemblera à l'exemple ci-dessous :


<?php
// Configuration de la base de données
mysql_connect(127.0.0.1, blark_inc, mon_mot_de_passe);
mysql_select_db(blark_inc);

// Obtention des paramètres GET 
$categorie=$_GET['categorie'];
$id=$_GET['id'];

// Appel des données pour la catégorie et les produits
$categorie =  mysql_fetch_array(mysql_query('SELECT * FROM categorie
WHERE id=\"'.$categorie.'\"'));

$produits   =  mysql_fetch_array(mysql_query('SELECT * FROM produits
WHERE id=\"'.$id.'\"'));

// Affichage des informations
echo 'Nom de la catégorie : '.$categorie['titre'].'<br>';
echo 'Description de la catégorie : '.$categorie['description'].'<br>';
echo 'Nom du produit : '.$produit['titre'].'<br>';
echo 'Description du produit : '.$produit['description'].'<br>';
?>

Ainsi, dans notre exemple simple, les ID des deux tables sont appelés avec la méthode GET, les informations y afférant sont extraites de la base de données et accessibles à l'utilisateur final. Comme établi précédemment, toutefois, cette méthode emploie une chaîne d'URL qui semble pour le moins inélégante, pour ne pas dire laide. Vous pouvez soutenir que l'ID de catégorie n'a pas besoin d'être énoncé et, bien que ce soit vrai pour un système de catégorisation monorangée, d'autres types de systèmes plus complexes risquent d'exiger cette fonction. Imaginez simplement un produit qui doive apparaître dans plus d'une catégorie.


4. Entrée en scène de mod_rewrite

Il est maintenant temps de faire appel à mod_rewrite dont nous n'avons jusqu'ici pas vraiment détaillé le rôle — nous l'avons simplement proposé en réponse à tous nos problèmes. Entrons donc dans le vif du sujet. mod_rewrite est un module Apache qui réécrit les URL selon certaines règles. En effet, un navigateur demandera un fichier par son nom, par exemple ma-vie.html et peut avoir en réponse un fichier complètement différent, par exemple, la-vie-de-mes-amis.php, mais tout se passe de manière transparente : l'utilisateur pensera encore qu'il voit ma-vie.html. Ce comportement est similaire à la notion des liens symboliques sous Linux mais beaucoup plus puissant. En voici quelques exemples d'utilisation. Notez qu'il ne s'agit pas de code à proprement parler, mais d'exemples de base.


Changer tous les .html en .php
blark.html deviendrait blark.php
Donnerait l'impression d'un site statique, tous les liens seraient changés en .html.

Rediriger les pages demandées en maintenance
index.php deviendrait maintenance.php
Modifierait un nom de fichier particulier de façon à ce qu'il pointe sur une page de maintenance.

Utiliser le nom de la page comme paramètre GET pour une autre page
mes-informationqs.php deviendrait pages.php?page=mes-informations
Utile pour avoir un script à exécuter en démonstration.

Note

mod_rewrite ne modifiera l'URL que si Apache est employé pour collecter le fichier. Il ne fait aucune différence quant aux fichiers hébergés sur votre serveur web. Par exemple, les inclusions en PHP resteront inchangées puisqu'elles n'obtiennent pas le fichier via le protocole HTTP, mais par le système de fichiers local.

C'est le dernier de ces exemples qui nous intéresse. Écrivons un fichier .htaccess simple pour tester certains des exemples que nous venons d'écrire. Le fichier .htaccess contient toutes les règles relatives à mod_rewrite au sein de ce répertoire, dont voici un exemple ci-après.


RewriteEngine on

#Premier exemple - modifier tous les .html en .php RewriteRule ^(.*).html$ $1.php

#Second exemple - modifier index.php en maintenance.php RewriteRule ^index.php$ maintenance.php

#Troisième exemple - utiliser un nom de page comme paramètre get RewriteRule ^(.*).php$ pages.php/?page=$1

Note

Si vous faites une erreur dans le fichier .htaccess et que le code résultant que trouve mod_rewrite est invalide, vous serez alerté par une Internal Server Error Page, Error 500 (page d'erreur interne au serveur). Ne vous inquiétez pas, c'est normal. Changez simplement la ligne et réessayez.

Comprendre la syntaxe des expressions peut prendre du temps et il m'a effectivement fallu du temps pour l'apprendre, quand quelqu'un a oublié de placer un caractère d'échappement / avant le ? dans un tutoriel. Les règles suivent le format suivant :


RewriteRule Ce_que_je_cherche Ce_que_je_veux_que_cela_devienne


5. mod_rewrite dévoilé !

Le ^ signifie commencer à chercher une correspondance du nom du fichier depuis le début de la chaîne d'URL située après le nom d'hôte. Par exemple, avec http://www.ma-vie.com/test.html, mod_rewrite regardera seulement ce qu'il y a après http://www.ma-vie.com/, c'est-à-dire test.html. Les () servent à capturer les données. Tout ce qui correspond et se trouve à l'intérieur de ces parenthèses sera mémorisé. Ce comportement peut être rappelé en employant un '$1' dans l'expression réécrite, comme on peut le voir dans le premier exemple. Le .* à l'intérieur des parenthèses, dans le premier exemple, capture tous les caractères et le $ désigne la fin de la chaîne d'URL. Dans cet exemple, pour correspondre aux critères, un fichier doit être un ensemble de caractères, suivis de .html, sans aucun caractère jusqu'à la fin. Quand mod_rewrite trouve une correspondance, il prend la valeur qui se trouve à l'intérieur des parenthèses et la restitue pour qu'elle soit utilisée avec l'expression réécrite '$1.php'. $1 signifie qu'on fait appel aux données provenant de la première paire de parenthèses. Si vous aviez une autre paire de parenthèses dans l'expression correspondante, l'utilisation des données qui en proviennent reviendrait à l'utilisation de $2 dans l'expression réécrite.

Le deuxième exemple devrait être évident maintenant. Il fait coïncider le terme index.php de façon exacte, sans variations et le réécrit en maintenance.php.

Le dernier exemple est celui qui devrait nous sembler le plus intéressant. Nous cherchons n'importe quelle correspondance avant le .php et la réécrivons comme le paramètre GET d'un autre fichier appelé pages.php. Notez soigneusement que le / devant le ?. ? est un caractére spécial dans le code de mod_rewrite, qui doit être échappé à l'aide de /.

Note

Pour obtenir des détails complets sur mod_rewrite, consultez http://httpd.apache.org/docs/mod/mod_rewrite.html.


6. Construction d'une base de données de produits

Nous avons maintenant tout ce qu'il nous faut pour créer notre catalogue de produits optimisé pour les moteurs de recherche. Il ne reste plus qu'à supprimer ces ID fastidieux et à les remplacer par autre chose. Pourquoi ne pas créer un champ séparé dans la table, qui peut contenir un identifiant unique d'un produit, mais écrit sous forme de texte au lieu de nombres ? La tâche peut sembler ennuyeuse et inutile, mais cela peut vous dépanner. Nous ajouterons un champ séparé à chaque table dans notre base de données et nous l'appellerons mod_page. Ce sera une version modifiée du titre produits/catégorie, qui servira en outre d'identifiant unique. Par exemple, le produit modem évolué vitesse 5 000 bauds risque d'avoir une valeur mod_page de vitesse bauds 5 000. La manière de créer mod_page est de votre ressort. Il se peut que vous deviez saisir chaque champ individuellement ou faire appel à un script PHP simple pour traduire l'un en l'autre.


7. mod_rewrite à la rescousse

Nous devons maintenant créer une règle mod_rewrite qui servira d'interface avec le code écrit précédemment, aussi rigoureusement que possible. Évidemment, maintenant que nous employons mod_names au lieu de ID pour appeler les enregistrements, il devrait y avoir quelques changements, mais la structure de l'ensemble devrait demeurer la même. Si l'on se réfère au code ci-dessous, il devrait être clair que nous attendons deux paramètres. Un appelé id et le second catégorie. Forgeons une expression mod_rewrite qui remplit ces critères.

Pour rendre l'URL conviviale, j'ai choisi le format www.blark_inc.com/produits-(nom_catégorie)/(nom_produit).html.


RewriteRule ^produits-(.*)/(.*).html$ produits.php/?categorie=$1&id=$2

Cette expression prendra deux blocs de données : le premier est le mot ou la chaîne de caractères après le 'produits-' et le second est le nom de la page dans ce répertoire virtuel. Souvenez-vous que le répertoire /produits-quelconques/ n'existe même pas. On s'en sert plutôt pour duper l'utilisateur et les moteurs de recherche en leur faisant penser que le site est structuré de cette manière.

Pour prendre l'exemple précédent :


http://www.blark_inc.com/produits-modems/vitesse-bauds-5000.html

sera par magie et de façon transparente transformé en :


http://www.blark_inc.com/produits.php?categorie=modems&id=vitesse-bauds-5000

Voyez à quel point c'est facile !

Nous devons maintenant procéder à quelques changements dans le code de la page des produits, afin d'extraire les enregistrements de la base de données. Il ne reste à modifier que les noms des champs dans les lignes de requête de la base de données.


$categorie = mysql_fetch_array(mysql_query('SELECT * FROM categorie WHERE
id="'.$categorie.'"'));
$produit = mysql_fetch_array(mysql_query('SELECT * FROM produits WHERE
id="'.$id.'"'));

devient :


$categorie = mysql_fetch_array(mysql_query('SELECT * FROM categorie WHERE
mod_name="'.$categorie.'"'));
$produit = mysql_fetch_array(mysql_query('SELECT * FROM produits WHERE
mod_name="'.$id.'"'));

et ainsi, l'ensemble du code devient :


<?php
// Configuration de la base de données
mysql_connect(127.0.0.1, blark_inc, mon_mot_de_passe);
mysql_select_db(blark_inc);

// Obtention des paramètres GET 
$categorie=$_GET['categorie'];
$id=$_GET['id'];

// Invocation des données pour catégorie et produits
$categorie  =  mysql_fetch_array(mysql_query('SELECT * FROM categorie
WHERE mod_page=\"'.$categorie.'\"'));
$produit   =  mysql_fetch_array(mysql_query('SELECT * FROM produits
WHERE mod_page=\"'.$id.'\"'));

// Affichage des informations
echo 'Nom de la catégorie : '.$categorie['titre'].'<br>';
echo 'Description de la catégorie : '.$categorie['description'].'<br>';
echo 'Nom du produit : '.$product['title'].'<br>';
echo 'Description du produit : '.$produit['description'].'<br>';
?>

8. Résumé

Comme mentionné précédemment, c'est un moyen pratique de donner à votre site un aspect bien structuré, à la fois pour l'utilisateur et pour le moteur de recherche. Nous avons vu que mod_rewrite augmente un peu plus la charge du processeur à exécuter que s'il n'y avait pas de mod_rewrite du tout, mais personnellement je n'ai jamais eu de problème avec. Si on l'utilise de la bonne manière et non pour corriger tout fichier à l'extension défectueuse, il ne doit pas étre mesestimé et devrait faire partie de votre trousse à outils PHP.

Pete programme depuis l'âge de 10 ans sur un vieil Atari 800 XE©. Bien qu'il ait obtenu le diplôme d'ingénieur acoustique à la ISVR mondialement connue, à Southampton (Royaume-Uni), l'appel de la programmation lui a fait rebrousser chemin et depuis, il travaille comme développeur web. Il utilise à la fois les plates-formes Linux et Windows. Il vit toujours au Royaume-Uni, où il coule actuellement des jours heureux avec son épouse.