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