TUTORIELS 
Référencement de sites dynamiques: l'exemple du PHP (Première partie)
Les robots peuvent avoir des difficultés pour suivre des URLs "exotiques". Un script PHP très simple, et quelques directives Apache dans un fichier .htaccess permettent de remédier au problème.  (7 avril 2002)
 

Si le "robot" d'un moteur de recherche comme Google "suit" correctement les liens du type index.php?var1=valeur1&var2=valeur2, ce n'est pas le cas de tous. Bâtir un site dynamique accroît donc les problèmes liés au référencement. Si certains liens du site ne sont pas "suivis", les pages vers lesquelles ils aboutissent ne seront bien sûr pas référencées, et leur contenu - où figurent éventuellement des mots-clés pertinents pour aiguiller une recherche vers le site - étant alors masqué, cela influera en retour sur le positionnement des pages effectivement référencées. Bref, un cercle vicieux s'installe.

Il est possible, fort heureusement, d'y remédier, et ce par deux méthodes:

- un site "semi-dynamique": en local, un script produit les pages HTML telles qu'elles seraient transmises au navigateur, et ce pour toutes les URLs possibles du site; ces pages sont ensuite placées sur le serveur, au lieu des pages dynamiques initiales;
- la technique de l'"URL rewriting", qui consiste à transformer les URLs contenant des "?" et des "&" en URLs plus facilement "lisibles" par un "robot".

La première méthode devient vite inélégante lorsqu'un site repose sur une très grosse base de données (un catalogue de produits par exemple), imposant de produire des milliers, voire des dizaines de milliers de pages, et ce à une fréquence peut-être quotidienne (on peut certes ne produire, à chaque fois, que les pages sur lesquelles une mise à jour a été apportée, en laissant les autres pages telles qu'elles sont). D'autre part, le problème des URLs issues du remplissage d'un formulaire par l'utilisateur se pose toujours dans le cas où l'un des champ du formulaire intervenant dans la composition de l'URL en question est un champ ouvert. En clair, la technique peut s'avérer, dans certains cas, irréalisable.

La seconde méthode semble donc meilleure, et impose moins de manipulations.
En PHP, et avec le serveur web Apache, on peut la réaliser de deux manières. La première consiste à utiliser les fonctionnalités d'"URL rewriting" d'Apache, la seconde à exécuter un petit script PHP à chaque transmission d'URL à destination d'un script nécessitant qu'on lui transmette des variables.
Nous nous attacherons ici à concevoir ce petit script, et nous reviendrons prochainement sur le paramétrage d'Apache pour l'"URL rewriting".

L'idée est de transformer, par exemple, une URL comme:

http://www.mondomaine.org/forums/lire.php?forum=4&thread=3&post=12


en

http://www.mondomaine.org/forums/messages/4_3_12.html


Ou, pour être plus précis, qu'en saisissant la deuxième, on obtienne le résultat de la première.

Pour ce faire, nous allons créer un script qui, lors de l'appel à une URL du type http://www.mondomaine.org/forums/messages/4_3_12.html, va exécuter, sur le serveur, l'ensemble des manipulations correspondant à l'URL du type http://www.mondomaine.org/forums/lire.php?forum=4&thread=3&post=12.

Ainsi, les liens du site pourront être de la forme ".../messages/xx_xx_xx.html", et donc pointeront vers des URLs qui pourront être référencées, tandis que ces URLs correspondront en fait à une "nomenclature" recouvrant des URLs "dynamiques" (ces dernières permettant de transmettre des variables).

En pratique, nous allons configurer le serveur Apache, pour que les URLs terminées par "forums/messages/xx_xx_xx.html" donnent lieu à l'éxécution d'un (unique) script. Pour cela, il faut isoler un critère commun à ces URLs. Il y en a en fait deux:

- elles contiennent le mot "messages";
- elles concernent des fichiers situés dans le répertoire "forums" (en l'occurence le fichier lire.php, qui n'apparaît pas dans notre URL modifiée mais qui est bien le script d'affichage d'un message).

Aussi, nous allons "forcer" toute URL impliquant le répertoire "forums" et contenant le mot "messages" à être interprétée comme un fichier php (malgré l'extension .html). Une directive Apache nous offre cette possibilité, sans avoir besoin, de surcroît, d'intervenir dans les fichiers de configuration du serveur web, mais par simple inclusion dans un fichier .htaccess au sein du répertoire "forums".

Ce fichier .htaccess aura la forme:

<FilesMatch "^messages$">
  ForceType application/x-httpd-php
</FilesMatch>


La directive FilesMatch nous permet (à partir de la version 1.3 d'Apache) de comparer un nom de fichier et une expression régulière. Cette dernière précise ici que le nom de fichier en question doit être rigoureusement identique à "messages".

Nous allons donc définir un fichier nommé "messages", sans extension, dans notre répertoire "forums". Ce fichier sera interprété comme un script PHP grâce à la directive ForceType. Il va nous servir à "émuler" l'URL dynamique.

Toute URL dont le texte suivant "forums/" est "messages/..." va donner lieu, sur le serveur, à l'ouverture dans le répertoire forums du "répertoire" "messages". Or ce répertoire est en fait un fichier, donc notre directive va "forcer" le serveur à l'ouvrir en tant que script PHP.

Définissons donc l'arborescence suivante:

/forums
  messages
  lire.php
  .htaccess

Notre fichier "messages" contiendra le code PHP suivant:

<?
$tab=explode("/",$REQUEST_URI);
$id=$tab[count($tab)-1];
$vars=explode("_",$id);
$forum=$vars[0];
$thread=$vars[1];
$post=strtok($vars[2],".");
include("lire.php");
?>


D'abord on isole les différentes parties de l'URL, en utilisant "/" comme délimiteur. Ces différentes parties sont placées dans un tableau dont la dernière entrée est nommé "$id" et contient une chaîne du type "xx_xx_xx.html". Ensuite cette chaîne est à son tour "éclatée", en utilisant cette fois "_" comme délimiteur, puis les différentes parties sont placées dans les variables "$forum", "$thread", "$post" (cette dernière nécessitant une manipulation supplémentaire pour se débarasser de l'extension ".html").
Il ne reste plus alors qu'à "inclure" le script "lire.php", à la disposition duquel seront mises les trois variables ainsi définies.
L'URL apparaissant dans la barre d'adresse du navigateur sera celle terminée par ".html" tandis que la page qui s'affiche résulte du script lire.php utilisant les trois valeurs figurant dans notre "fausse URL" et qui sont en fait les valeurs de trois variables "transmises" au script par le biais du fichier "messages".

Dans un prochain article, nous nous pencherons sur le module d'Apache permettant de réécrire les URLs. Cette méthode, encore plus simple, comporte toutefois l'inconvénient de nécessiter l'accès aux fichiers de configuration du serveur web, ce qui n'est pas le cas pour un hébergement mutualisé.

 
[ Jérôme Morlon,JDNet
 
Accueil | Haut de page