URL Rewriting pour les nuls
Contrairement aux sites dits "statiques" dont les adresses (URL) ont toujours un aspect bien propre du genre mon.site.com/accueil.html, les sites dynamiques, notamment les CMS et les blogs, les forum ou les annuaires basés sur des scripts PHP ou Python présentent généralement des URL très exotiques du genre mon.site.com/viewtopic.php ?topic_id=585&forum=1 qui peuvent laisser perplexe le visiteur autant que les robots d’indexation d’un moteur de recherche.
Quand les sites dynamiques ont fait leur apparition, les moteurs de recherches étaient tout à fait incapables de les indexer correctement, et bien souvent, seule la page d’accueil était présente dans l’index, le reste du site restant inconnu des moteurs.
Ce n’est plus vraiment le cas aujourd’hui, et la plupart des moteurs sont maintenant capables d’indexer sans problème une URL dynamique comportant jusqu’à deux paramètres. Mais même aujourd’hui, la plupart des webmasters préfèrent présenter aux visiteurs (et les robots d’ indexations) des URL sous une forme plus "sexy". En effet, avoir dans la barre de navigation une adresse comme mon.site.com/url_rewriting_pour_les_nuls.html, ça a beaucoup plus de geule que l’adresse mon.site.com/rubrique.php3 ?id_rubrique=1. (et de plus, ça permet de mettre un ou deux mots clés dans l’adresse de la page, ce qui peut aider à un meilleur positionnement sur les moteurs de recherche, ce qui n’est pas forcément à négliger.)
C’est l’action de modifier les adresses dynamiques d’origine pour les présenter sous la forme d’adresses statiques qu’on appelle URL rewriting.
En fonction du langage de script et du type de serveur web utilisé, les solutions techniques pour "maquiller" les adresses dynamiques seront très différentes. Je me bornerai dans cette article à ne parler que de ce que je connais, c’est à dire le langage de script PHP et le serveur Apache (ce qui représente quand même la majorité des sites internet).
Pour les serveurs Apache, les solutions seront également différentes selon que le mod_rewrite est installé ou non.
Cas le plus simple...et le plus fréquent : le mod_rewrite est installé et vous avez pouvez utiliser le fichier .htaccess pour donner des directives au serveur. Sinon :
sur un serveur dédié, pour activer le module mod_rewrite, il vous suffit d’éditer le fichier httpd.conf et de décommenter les lignes
LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.cpuis de redémarrer le serveur Apache.
sur un hébergement mutualisé, renseignez-vous auprès de votre hébergeur.
Tout d’abord, pour que ce soit bien clair : ce n’est pas le fichier .htaccess qui réécrit vos URL dynamiques en URL "propres". C’est votre script PHP qui doit le faire.
Voici un exemple de ré-écriture d’URL tiré de Rewrite YourPHPAnnuaire mais il existe des milliers d’autres manières de ré-écrire des URL.
Génération de l’URL d’une sous-catégorie de l’annuaire par le script index.php :
<a href="<?php echo id_to_url($une_souscat["id"],$une_souscat["cat_name"],'1'); ?>" class="link_scat_index_annuaire"><?php echo htmlspecialchars($une_souscat["cat_name"]); ?></a>La génération de l’URL fait appel à la fonction id_to_url décrite ci-dessous :
function id_to_url ($id,$cat,$page,$type='')
{
global $T_infos, $PMA_infos;
// Déterminer s'il faut faire de l'URL Rewritting
if ( $PMA_infos['url_rewritting'] )
{
list( $suffixe, $caracteres, $car_speciaux, $car_normaux ) = id_to_url_info();
// Supprime les accents, supprime les caractères non-alphanumériques, convertit en minuscules, remplace les tirets multiples par un tiret unique, supprime le dernier caractère si c'est un tiret, et limite la chaine aux $caractères premiers caractères
$url = substr( eregi_replace( "\-$", '', eregi_replace( "\-+", '-', strtolower( eregi_replace( "[^A-Za-z0-9]", '-', str_replace($car_speciaux, $car_normaux, $cat) ) ) ) ), 0, $caracteres );
// Applique le suffixe à l'url
$url = $type=='keyw' ? "$url-k$page-$id$suffixe" : "$url-p$page-$id$suffixe";
return $url;
}
else
{
if ( $type=='keyw' ) {
return "search.php?action=seek&mots=id$id&nb_results2show=20&booleen=AND";
} else {
return $page==1 ? "index.php?cat_id=$id" : "index.php?cat_id=$id&page=$page";
};
};
}Je vous passe l’explication détaillée de toutes les instructions PHP, mais en clair, ce que fait la fonction id_to_url quand elle reçoit les paramètres $id=74, cat=annuaires généralistes et page = 2, c’est vérifier si j’ai activé ou non l’URL Rewriting dans les paramètres de mon annuaire :
Si j’ai choisi d’utiliser l’URL Rewriting, après quelques manipulations, la fonction me renvoie l’URL sous la forme :
mon.annuaire.com/annuaires-generalistes-p2-74.html
sinon, elle me la renvoie sous la forme dynamique, la seule qui soit directement interprétable par mon serveur :
mon.annuaire.com/index.php ?cat_id=74&page=2
Maintenant que se passe-t-il quand un visiteur clique sur mon URL relookée : la page annuaires-generalistes-p2-74.html n’existe pas sur mon serveur, et celui-ci doit me renvoyer une erreur HTTP 404.
Mais comme je suis un petit futé, j’ai pris soin de mettre en place un fichier .htaccess qui contient les directives suivantes :
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule -p([0-9]*)-([0-9]+)\.html$ /index.php?cat_id=$2&page=$1 [L]
</IfModule>Les lignes <IfModule mod_rewrite.c> et </IfModule> ne sont pas obligatoires si vous êtes certains que le module mod_rewrite est actif sur votre serveur, mais dans le cas d’une application susceptible d’être installée sur différents serveurs, mieux vaut prévoir le cas pour éviter une erreur 500. Tout ce qui est compris entre ces deux lignes ne sera exécuté que si le module est actif.
La directive (RewriteEngine on) indique qu’on va utiliser le module rewrite (mod_rewrite) d’Apache.
La directive RewriteBase / indique le répertoire pour lequel les règles de réecriture des URLs doivent s’appliquer. Si votre application n’est pas installée à la racine du site, mais par exemple dans le sous-répertoire Applications, vous changerez cette ligne en RewriteBase /Applications. Etonnant de simplicité, non ?
La directive suivante indique au serveur Apache comment traiter l’URL, c’est à dire comment décortiquer la chaine de caractères fournie et les manipuler pour les transformer en une URL correspondant à une page existante :
Dans la chaine mon.annuaire.com/annuaires-generalistes-p2-74.html, tu prends la première série de chiffres que tu rencontres et tu alimentes le paramètre $1, puis tu alimentes le paramètre $2 avec la deuxième série de chiffres, ensuite tu iras chercher la page index.php avec les paramètres adéquates.
Comme on le voit, c’est bien le code du script qui détermine de quelle manière mes URL seront présentées au visiteur (ou au robot) et le fichier .htaccess n’est là que pour retraduire en sens inverse l’adresse relookée en une adresse interprétable par le serveur.

Commentaires