Rechercher dans les publications Rechercher:

Imprimer cet article

Référencement : La gestion des sessions et des langues en PHP/MySQL

Référencement : La gestion des sessions et des langues en PHP/MySQL

Optimisation du référencement

30 avril 2004, par Thibaud Elzière

Les portions de code, les définitions de table ne sont données qu’à titre indicatif. Cet article propose plus une méthode générale à appliquer qu’une démarche à suivre à la règle. L’auteur de cet article ne pourra en aucun cas être tenu responsable des dommages directs ou indirects pouvant subvenir après la mise en place d’une partie ou de la totalité de la méthode proposée

Cet article s’adresse aux personnes ayant des notions en PHP/MySQL.

Introduction

Les sites web dynamiques en particulier ceux reposant sur le couple PHP/MySQL sont de plus en plus nombreux grâce d’une part à une certaine facilité de programmation et de mise en œuvre, d’autre part du fait de la richesse et de la puissance qu’apportent es outils. Chacun a donc les moyens d’exprimer librement toute sa créativité et d’assouvir ses fantasmes intellectuels les plus poussés.

La visibilité d’un site web sur Internet est une donnée importante puisqu’elle sera responsable de la fréquentation du site. Cette visibilité passe en partie par un bon référencement auprès des moteurs de recherche traditionnels.

Le référencement des sites dynamiques est cependant complexe notamment du fait de l’incapacité de certains agents de recherche à suivre des liens comportant une URL complexe. Ce constat soulève deux difficultés :

- La gestion des sessions qui sous certaines conditions exige le passage d’un identifiant de session dans l’url.

- Le passage en url de paramètre pour certaines requêtes (Query String)

La gestion des langues pour les sites multilingues étant sous-jacente à l’une ou l’autre de ses méthodes, elle pose certaines difficultés. En effet, une gestion dynamique des langues exige la conservation de la langue sélectionnée pendant le parcours du visiteur.

1. Gestion des sessions

Cet article ne traite pas de la mise en œuvre des sessions dans un site en PHP. Nous présentons simplement une manière parmi d’autres et quelques astuces pour combiner une utilisation des sessions et un bon référencement. Ainsi on admettra que le lecteur possède déjà quelques notions dans ce domaine, on admettra aussi qu’une session est ouverte et que les paramètres de sessions sont enregistrés dans le tableau $session.

Ce qui équivaut à dire que le code suivant est présent sur l’ensemble de pages :

Session_start() ;
Session_register(« session ») ;

Le problème posé par les sessions se posent en règle générale lorsque le client a configuré son navigateur pour refuser les cookies n’autorisant pas la création d’une session PHP de type classique (par utilisation de cookies). C’est le cas des robots venant analyser les sites en vue du référencement.

La méthode utilisait pour résoudre ce problème est simple, l’identifiant de session (qui identifie le visiteur de manière unique) est transmis par l’url grâce à des liens de la forme page1.php ?PHPSESSID=79d27hk3hg76gffdewsfdsf4324. L’identifiant étant transmis de page en page, il n’a pas besoin d’être écrit sous la forme d’un cookie chez le client.

Certains moteurs de recherche (en particulier Google) sont peu friands de ce genre d’url et ne les suivent pas. Il en résulte des sites peu visibles pour lesquelles seule la page principale est référencée.

Nous allons dans ce premier chapitre donner quelques recommandations pour contourner ce problème.

1.1 Structure classique d’un site

Un site dynamique utilisant des sessions est constitué de manière classique d’au moins deux zones comme le représente le schéma ci-dessous :

GIF - 8.4 ko
structure
Structure classique de sites web

Le site est constitué d’une partie publique accessible à tous le visiteurs et d’une partie privée accessible au visiteur enregistré. Le passage de la zone publique à la zone privée ne peut se faire traditionnellement qu’à travers deux opérations, la création d’un compte sur la page d’enregistrement (page A), la connexion d’un visiteur déjà enregistré via la page de connexion (Page B).

La meilleure façon de référencer un site de la sorte, en contournant le problème des sessions c’est de ne les considérer que lorsque le visiteur se trouve dans la partie privée, partie qui n’est d’ailleurs généralement pas sujet au référencement.

On ne s’intéressera donc qu’au référencement des pages contenues dans la partie verte. Dans cette zone, les sessions ne seront pas utilisées afin de pouvoir se passer dans tous les cas de la transmission de l’identifiant par l’url.

1.2 Gestions des pages

La gestion de l’ensemble des pages d’un site web peut être optimisée grâce à l’utilisation d’une table MySQL pour les consigner. Nous utiliserons donc une table MySQL pour gérer les pages du site et nous vous recommandons d’en faire de même.

Voici un exemple simple de table à créer pour la gestion des pages (les champs, leur nom, leur type et les exemples ne sont donnés qu’à titre indicatif). Des champs relatifs aux balises META ont été ajoutés pour mettre en évidence une autre utilisation d’une base de données pour les pages, ici l’écriture dynamique des META-TAGS.

Table_page

Champs Type Description Exemple
Id INT(4) auto-incrémenté PRIMARY KEY Nombre qui identifie chaque page de manière unique 23
Name VARCHAR(64) INDEX Nom du fichier (nom de la page consignée) sans extension Page23
Rights INT(4) Nombre indiquant si une page est publique ou privée (ou autre) 0 : publique 1 : privée
Meta-Title VARCHAR(255) Balise Meta Titre Page 23
Meta-description VARCHAR(255) Balise Meta Description Page 23
Meta-Keywords VARCHAR(255) Balise Meta Mots-clés Page,23

La construction de cette table est importante. Elle permet en particulier d’identifier une page du site par un numéro unique. Les pages et les liens entre elles sont donc maintenant indépendants du nom des fichiers qui les supportent. Si on veut renommer, pour des raisons quelconques, la page23.php en page24.php, il suffira de changer une ligne de la table plutôt que l’ensemble des liens y faisant référence dans le site.

1.3 Gestion des liens

A partir de la table définie plus haut, il est alors possible de définir une fonction page qui à partir du numéro de la page renvoie le chemin de cette page (l’url). Aucune url ne devra donc être écrite « en dure » dans l’ensemble du site, la fonction page sera utilisée à chaque fois. La fonction page permettra en particulier de changer la manière de former les url sur l’ensemble du site en ne modifiant que celle-ci.

Function page($id_page)
{
$query=”SELECT name FROM table_page WHERE id=$id_page”;
// On récupère le nom du fichier correspondant à la variable $id_page
$result=mysql_query($query);
$line=mysql_fetch_object($result);
$name=$line->name;
$link=$name.”.php”; // On rajoute la bonne extension et on crée le lien à retourner
return $link;
}

Par exemple, page(23) retourne page23.php pour peu que la page23 soit bien indexée dans la table table_page.

1.4 Transmission de l’identifiant

Dans le cadre de la gestion des sessions, il nous faut définir une variable permettant de savoir si l’utilisateur est, ou pas, dans la zone privé. Dans cette zone en effet, on activera au travers de la fonction page, le passage en url de l’identifiant de session pour les clients n’acceptant pas les cookies. Nous avons donc besoin d’un paramètre de session consigné dans la variable $session[log-in] qui vaut 1 lorsque l’utilisateur est loggé et 0 sinon. Cette variable sera donc mise à 1 lors du passage en page A et B comme défini précédemment.

Grâce à ce paramètre, on va pouvoir modifier la fonction page afin de renvoyer une url différente selon que les sessions soient utilisées ou pas.

Il faut préalablement désactiver le passage automatique de l’identifiant de session dans l’url afin d’être maître du choix du passage de l’identifiant dans l’url ou pas. Cette option dépend de la configuration du serveur.

Utiliser la ligne suivante dans chaque page de votre site

init_set(‘session.use_trans_sid',0) ;

La fonction page devra alors être modifiée de la sorte :

Function page($id_page)
{
Global $session; // On définit la variable $session comme globale
$query=”SELECT name FROM table_page WHERE id=$id_page”;
$result=mysql_query($query);
$line=mysql_fetch_object($result);
$name=$line->name;
$link=$name.”.php”;
if ($session[log_in ]) return $link?.SID; else  return $link;
// On renvoie via SID l'identifiant de session si une session est active et utile
}

Dans le tableau suivant sont consignées les différentes valeurs retournées par page(23) suivant la configuration du navigateur et de l’état du visiteur.

Critères Non Loggé Loggé
Accepte Cookies page23.php page23.php
N’accepte pas cookies page23.php Page23.php ?PHPSESSID=326ssh98jhs

2. Gestion des langues

L’accessibilité offerte par le réseau international Internet permet d’envisager une version multilingue d’un site WEB. La programmation dynamique offerte par PHP et l’accès à une base de données MySQL permet la mise en œuvre de solutions simples de gestion de contenu multi-languages.

Nous nous intéressons ici particulièrement à la problématique du référencement pour un site multilingue et précisément dans le cadre du problème concernant le passage du paramètre langue en URL sans faire intervenir de variable de session.

La mise en ligne d’un site multilingue pose d’autres problématiques comme le référencement dans les moteurs de recherche ou la gestion de Meta multilingue.

2.1 Traduction dynamique

Il existe plusieurs méthodes dynamiques pour modifier le contenu d’un site WEB selon la langue choisie par l’utilisateur. Nous utiliserons dans notre exemple la technique utilisant une base MySQL contenant l’ensemble du contenu écrit du site. Cette méthode n’est pas irréprochable puisqu’elle nécessite des ressources MySQL plus importantes que d’autres méthodes mais elle sera choisie pour sa facilité de mis en œuvre et de gestion.

Nous essaierons toujours d’optimiser le rapport ressources utilisées et convivialité de manière à créer un site léger pour le visiteur et souple pour le webmaster.

La méthode utilisée pour la gestion des langues repose sur deux tables MySQL et deux fonctions permettant d’afficher, selon la langue, des mots et des textes contenus dans deux tables de données.

La table des mots Table_word

ChampsTypeDescriptionExemple
L1 VARCHAR(64) PRIMARY KEY Mot la langue par défaut 1 Bienvenue
L2 VARCHAR(64) Mot dans la langue 2 Welcome
L3 VARCHAR(64) Mot dans la langue 3 Willkommen

La table des phrases : Table_sentence

ChampsTypeDescriptionExemple
Id INT(4) auto-incrémenté PRIMARY KEY Nombre qui identifie chaque phrase de manière unique 142
L1 TEXT Phrase dans la langue 1 Ceci est un exemple
L2 TEXT Phrase dans la langue 2 This is an example
L3 TEXT Phrase dans la langue 3 Das ist ein Beispiel

Ces tables vont contenir l’ensemble du contenu textuel du site et il suffira d’ajouter un champs L4,L5,... et de les traduire dans la langue voulue pour ajouter d’autres langues.

Deux fonctions vont être rattachées à ces tables, respectivement la fonction word et la fonction sentence.

La fonction word a pour entrée un mot dans une langue (par défaut L1) et comme sortie ce mot dans la langue choisie par la variable globale $language. Cette fonction a pour entrée un mot plutôt qu’un identifiant pour augmenter la lisibilité du code.

Par exemple :

<input type='button' value='<?=word(Valider)?>'  >

rendra si $language=2 :

La fonction pourra par exemple être de la forme

Function word($word)
{
global $language; // On declare language comme variable globale
if ($language!=1) // Si la langue choisie n'est pas la langue par défaut
          {
           $query=&#8221;SELECT L$language as Lword FROM table_word WHERE L1='$word' &#8221;;
           $result=mysql_query($query);
           $line=mysql_fetch_object($result);
           $Lword=$line->Lword;
           return $Lword; // On renvoie le mot traduit
           }
else return $word; // Sinon, on renvoie le mot tel quel
}

La fonction word(Bienvenue) renverra

- Bienvenue si $language=1
- Welcome si $language=2
- Willkommen si $language=3

La fonction sentence, quant à elle, sera utilisée pour retourner une phrase identifiée par un numéro dans la langue définie par la variable $language. On a choisi de faire deux fonctions word et sentence plutôt qu’une pour des soucis d’économie de ressources. Lorsqu’un mot est introduit dans la fonction word, MySQL va chercher dans son index L1 la position du mot et renvoyer la ligne correspondante. Si la taille de l’index est trop importante, cette recherche sera ralentie. C’est pourquoi pour la gestion de phrases, une méthode par indexation numérique a été retenue.

La fonction sentence a donc pour entrée un nombre (identifiant numérique d’une phrase) et retourne la phrase considéré dans la langue sélectionnée, cette fonction retourne L1,L2,L3 selon la langue choisie définie par $language et la ligne déterminée par la variable numérique d’entrée.

La fonction pourra par exemple être de la forme

Function sentence($id)
{
global $language; // On declare language comme variable globale
$query=&#8221;SELECT L$language as Lsentence FROM table_sentence WHERE id='$id'&#8221;;
$result=mysql_query($query);
$line=mysql_fetch_object($result);
$Lsentence=$line->Lsentence;
return $Lsentence; // On renvoie la phrase dans la langue correspondante
}

la fonction sentence(142) renverra

- ‘Ceci est un exemple’ si $language=1
- ‘That is an example’ si $language=2
- ‘Das ist ein Beispiel’ si $language=3

Ces fonctions devront donc être utilisées lors de l’écriture des pages du site pour introduire tout contenu devont être traduit. On peut remarquer que la variable $language définie ici la langue utilisée et qu’il suffit de changer cette variable pour que le contenu de la page soit affiché dans une autre langue. On peut ajouter que le changement de langues peut-être appliqué n’ importe où dans le site (le visiteur n’est pas obligé de revenir à l’accueil).

Le maintien de la langue sélectionnée de page en page revient à la conservation de la variable $language. Deux possibilités sont envisageables pour assurer cette fonction « mémoire » : la création d’une variable de session $session[language], option que l’on a rejetée et le passage de la variable $language en url.

Le problème du passage de la variable $language dans l’url est que les moteurs de recherches ne suivront pas forcément des url du type page23.php ?language=3.

On va donc utiliser une parade appelée réécriture d’url (URL rewriting).

2.2 Réécriture d’url (URL Rewriting)

La réécriture d’URL permet, en modifiant le fichier .htaccess, de définir des règles de redirection des URL. Dans notre cas, nous cherchons à transformer une adresse du type page23-l2.html en une adresse du type page23.php ?language=2

Tous les liens utilisés sur le site seront donc des liens de la forme nom_de_la_page-llangue_choisie.html (forme1). Ces liens seront transformés par le serveur en nom_de_la_page.php ?language=langue_chosie (forme2). La fonction page définie précédemment nous permet de faire ces changements (renommer sous la forme 1) et il ne suffira plus que d’introduire des règles de réécritures transformant la forme 1 en la forme 2.

Function page($id_page)
{
global $language; // On définit $language comme variable globale
global $session;
$query=&#8221;SELECT name FROM table_page WHERE id=$id_page&#8221;;
$result=mysql_query($query);
$line=mysql_fetch_object($result);
$name=$line->name;
$link=&#8221;$name-l$language.html&#8221;; // Rajoute -language et l'extension html
if ($session[log_in]) return $link?.SID; else  return $link;
}

la fonction page(23) renverra

- page23-l1.html si $language=1
- page23-l2.html si $language=2
- page23-l3.html si $language=3

Il suffit maintenant d’écrire les règles pour transformer ces url en url interprétables par nos scripts. Ces modifications devront être effectuées dans le fichier .htaccess. Si ce fichier n’existe pas, créez-le à la racine de votre site. Nous ne nous attarderons pas ici sur les manières de créer ce fichier ni sur le langage à utiliser, veuillez consulter la documentation appropriée.

Options +FollowSymlinks
RewriteEngine on
RewriteRule  ^(.*)-l([0-9]*).html    $1.php?language=$2 [L,QSA]

Cette règle n’est pas difficile à comprendre, dans la première partie on décompose le nom du fichier (forme1) en prélevant le nom original du fichier sans extension ( (.*) rangé dans la variable $1) et le numéro de la langue ( ([0-9]*) rangé dans la variable $2) puis on recompose le nom compréhensible par le serveur (forme 2) grâce aux variables $1 et $2. Le QSA a été rajouté pour tenir en compte l’identifiant de session passé en paramètre de l’url lorsqu’un visiteur n’acceptant pas les cookies est connecté au site (visiteur loggé).

A ce niveau d’avancement, il vous est possible de tester si la réécriture d’url a fonctionné en copiant dans votre navigateur l’adresse page23-l2.html vous devriez tomber sur la page 23 traduite dans la langue 2.

2.3 Changement de langues

Le changement de langue doit être possible de manière simple directement par le visiteur en cliquant sur un drapeau ou le nom de la langue par exemple. On a vu que le choix de la langue est piloté par la valeur de la variable $language. Il suffit donc de changer cette variable à un endroit donné dans le site pour que les pages du site soient dans la langue souhaitée jusqu’au prochain changement.

Ce changement de langue peut être effectué de plusieurs façons, en particulier : par l’utilisation d’un formulaire qui renvoie la valeur de la variable $language dans un champs de type hidden ou par l’intermédiaire d’un lien qui renvoie le nom de la page suivi de la chaîne de variable $language=valeur. La première solution ne sera pas prise en compte par un moteur de recherche, nous nous intéresserons donc au passage de variable par l’url.

On peut donc changer la langue en proposant sur une image du drapeau du pays un lien vers la page en cours et la valeur correspondant de la variable $language. Si nous sommes sur la page 23, le lien devra être du type page23-l1.html ?language=2 soit en reprenant les fonctions utilisées, le lien sera de la forme page(23).?language=2.

Cette solution pose quelques problèmes, notamment le lien créé pourra ne pas être suivi pas tous les moteurs de recherche, nous allons donc utiliser une nouvelle fois la réécriture d’url pour prendre en compte le changement de langue.

La solution sera d’introduire une variable L indiquant la valeur de la langue souhaitée.

Les liens permettant le changement de langue devront alors être de la forme page23-l1-L2.html pour changer vers la langue 2. Il suffira en fait d’inclure le paramètre -L suivi du numéro de la langue dans le nom de la page en cours et d’en faire un lien.

On modifiera le fichier .htaccess comme suit de manière à prendre en considération un possible changement de langues à n’importe quelle niveau du site.

Options +FollowSymlinks
RewriteEngine on
Rewrite ^(.*)-l([0-9]*) (.*).html     $1$3.php?language=$2 [QSA]
Rewrite ^(.*)-L([0-9]*) .php         $1.php?language=$2 [L,QSA]

Par exemple, le fichier page23-l1-L2.html sera réécrit une première fois page23-L2.php ?language=1 (1ére règle) puis page23.php ?language=1&language=2 (2ème règle)

Pour ajouter ce nouveau paramètre à la page désirée, on va définir une nouvelle fonction. Ceci peut paraître lourd mais cette fonction sera très utilisée par la suite pour introduire de nouveaux paramètres à l’intérieur du nom du fichier plutôt que dans la chaîne de requête (query string).

Function add_parameter($nid_page,$parameter)
{
$old_link=page($nid_page) ; // On récupère le lien envoyé par notre fonction page
$tab_str=explode(« . »,$old_link) ; // On scinde ce lien en deux parties séparés par le point
$new_link=$tab_str[0].$parameter.$tab_str[1] ; // On reconstruit le lien en ajoutant le paramètre
return $new_link ; // On renvoie le nouveau lien reconstruit
}

- add_parameter(23,-L2) va retourner page23-l1-L2.html si $language=1
- add_parameter(23,-L1) va retourner page23-l1-L1.html si $language=1

Pour changer de langue dans le site web, on va donc recourir à cette fonction pour créer les liens sur lesquelles le visiteur devra cliquer pour opérer un changement de langue.

Exemple Si vous souhaitez, par exemple, permettre un changement de langue quelque soit la position du visiteur dans le site (c’est-à-dire quelque soit la page active), il va falloir que vous proposiez sur chaque page (ou dans un fichier commun appelé sur chacune des pages), un lien vers la page active suivi des paramètres de changement de langue que l’on a précédemment introduits.

On va préalablement définir une fonction qui à partir du nom de la page active renvoyé par php va renvoyer le numéro de la page dans notre table table_page.


Function current_page()
{
$base_page=basename($_SERVER[‘PHP_SELF']) ; // $base_page contient le nom du fichier
$tab_str=explode(&#8220;.&#8221;,$base_page); // On récupère la partie sans l'extension
$name=$tab_str[0];
$query=&#8221;SELECT id FROM table_page WHERE name=$name&#8221;;
$result=mysql_query($query); // On recherché dans la table MySQL table_page
$line=mysql_fetch_object($result);
return $line->id; // On retourne le numéro de la page correspondant
}

La fonction current_page appliqué sur la page 23 va renvoyer 23.

On va maintenant créer comme exemple deux liens permettant de changer la langue sur la page en cours, ces lignes devront être rajoutées sur chaque page ou dans un fichier commun à toutes les pages.

$id_page=current_page() ; // On récupère le numéro de la page courante
$link1= add_parameter($id_page,-L1) ; // On crée le lien pour changer en langue 1
$link2= add_parameter($id_page,-L2); // On crée le lien pour changer en langue 2
$html_link1=&#8221;<a href=$link1>Francais</a>&#8221;; // On passe en html
$html_link2=&#8221;<a href=$link2>English</a>&#8221;; // On passe en html

3. Gestion d’autres paramètres

Grâce à la méthode utilisée précédemment, on va pouvoir en jouant sur le fichier .htaccess intégrer, grâce à la fonction add_parameter, le nombre de paramètres désiré à l’intérieur même de l’url plutôt que dans la chaîne de requête et ce de manière systématique.

Ainsi imaginons qu’il existe un script dans la page article.php (page référencé sous l’id 12) qui permette de lire l’article $a lorsque l’on lance article.php ?a=$a. Si l’on veut effectuer des liens à partir de la page d’accueil pour consulter les articles 1,2,3 et 4 , il est possible d’écrire les url respectivement sous la forme

- article.php ?a=1
- article.php ?a=2
- article.php ?a=3
- article.php ?a=4

Ces liens ne tiennent pas compte de la langue choisie par le visiteur et comporte une chaîne de requête qui ne sera pas forcément suivie par tous les moteurs de recherche.

Grâce à la méthode développée, nous pouvons définir les liens vers ces articles de la manière suivante ($langue=1) :

- add_paramter(12,-a1) qui renvoie article-l1-a1.html en langue 1
- add_paramter(12,-a2) qui renvoie article-l1-a2.html en langue 1
- add_paramter(12,-a3) qui renvoie article-l1-a3.html en langue 1
- add_paramter(12,-a4) qui renvoie article-l1-a4.html en langue 1

Il suffit alors de compléter le fichier .htaccess pour signaler au serveur la manière d’interpréter la présence du nouveau paramètre a.

Options +FollowSymlinks
RewriteEngine on
Rewrite ^(.*)-l([0-9]*) (.*).html $1$3.php?language=$2 [QSA]
Rewrite ^(.*)-L([0-9]*) (.*) .php $1$3.php?language=$2 [QSA]
Rewrite article-a([0-9]*) (.*).php article$2.php?a=$1 [L,QSA]

Pour rajouter d’autre paramètre, il suffit d’appliquer cette méthode pour un ensemble de paramètres.

Exemple

Imaginons que les articles de l’exemple précédent soient écrit sur plusieurs pages, et que l’on puisse accéder à la 3-ième page de l’article 4 en faisant article.php ?a=4&p=3

Le lien sera retourné par la fonction add_parameter(12,-a4-p3) qui renverra article-l1-a4-p3.html. Pour interpréter de manière correcte ce fichier, il va falloir modifier le fichier .htaccess de la manière suivante :

Options +FollowSymlinks
RewriteEngine on
Rewrite ^(.*)-l([0-9]*) (.*).html $1$3.php?language=$2 [QSA]
Rewrite ^(.*)-L([0-9]*) (.*) .php $1$3.php?language=$2 [QSA]
Rewrite article-a([0-9]*) (.*).php article$2.php?a=$1 [QSA]
Rewrite article-p([0-9]*) .php article.php?p=$1 [L,QSA]

Ou


Options +FollowSymlinks
RewriteEngine on
Rewrite ^(.*)-l([0-9]*) (.*).html $1$3.php?language=$2 [QSA]
Rewrite ^(.*)-L([0-9]*) (.*) .php $1$3.php?language=$2 [QSA]
Rewrite article-a([0-9]*)-p ([0-9]*).php article.php?a=$1&p=$2 [L,QSA]

Conclusion

Nous nous permettons de rappeler que cet article et les méthodes qu’il contient ne sont données qu’à titre d’information et n’ont comme prétention que le désir de fournir une méthode générale pour résoudre certains problèmes orchestrés par le référencement.