Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Redirections Http et SEO
Dans les
formations Php précédentes, nous avons bâti une application serveur intéressante. Sur la base de critères recoupés par des
listes déroulantes, elle produit l'extraction des résultats concordants. Les informations extraites sont bien sûr issues de la
base de données MySql. Elle propose de même un
système de pagination offrant la possibilité de naviguer au travers de toutes les pages restituées.
Un clic sur l'une des données extraites conduit vers sa page de descriptif, enrichie dynamiquement par le
code Php. Ce dernier exécute une
requête SQL exploitant le numéro passé en paramètre de l'URL, dans une
clause WHERE. Pour des raisons de
référencement naturel, nous avons retravaillé ces adresses pour qu'elles soient explicitement différentes. Pour cela, nous avons exploité les
expressions régulières dans un
fichier htaccess, afin de créer une
règle de réécriture.
Mais en termes de
SEO, un problème persiste. Dans la signature de l'URL, tant que le paramètre numérique est conservé, la page est chargée, quels que soient les termes en préfixe. Si vous supprimez l'un des mots dans la construction de l'Url, le résultat est identique. Dans la durée de vie d'une application Web, ce souci confronte le site internet au
Duplicate Content. De nombreuses adresses conduisent vers la même page. Chaque Url mal prélevée ou modifiée sur des sites référents, conduira au même résultat. Google, au travers de ses phases d'indexation, conclura que la page est de mauvaise qualité, car son contenu est dupliqué à de nombreuses reprises. Nous ne devons donc pas autoriser qu'une URL puisse être modifiée.
Sources et présentation de la problématique
Nous devons commencer par récupérer les travaux aboutis lors des formations précédentes.
La décompression fournit un certain nombre de fichiers à la racine. Les ressources externes de l'application serveur sont placées dans les sous dossiers. Le
fichier index.php correspond à la page Web principale offrant les listes déroulantes articulées entre elles. Le
fichier reponse.php renferme le
code Php externalisé pour restituer les résultats de l'extraction, par la
technologie Ajax. Ainsi, pour des raisons d'ergonomie, la page Web n'est pas complètement rechargée. Le
fichier fiche.php est celui qui enrichit dynamiquement la page Web selon l'enregistrement cliqué, depuis les résultats d'extraction. Et c'est le
fichier htaccess qui indique au serveur comment se comporter lorsqu'une signature d'Url bien bien spécifique est demandée :
RewriteEngine on
RewriteRule ^idee-([a-z-]+)[-]([0-9]+) fiche.php?ID=$2
ErrorDocument 404 /index.php
La règle est simple. Toute url préfixée du terme
idee-, suivi d'une séquence de lettres et de tirets, suivie d'un numéro, doit conduire vers la
page fiche.php en lui passant en
paramètre le numéro correspondant à la seconde séquence. Vous notez que grâce à cette règle, nous nous débarrassons des extensions de pages (.html, .php...).
- A la racine du dossier de décompression, cliquer droit sur le fichier reponse.php,
- Dans le menu contextuel, choisir de l'ouvrir avec un éditeur comme le Notepad++,
...
$requete = "SELECT liste_num, liste_nom, liste_activite, liste_ville FROM liste_id WHERE liste_dep='".utf8_decode($le_dep)."' AND liste_ville='".utf8_decode($la_ville)."' ORDER BY liste_nom LIMIT ".$depart.",10;";
$retours = mysqli_query($liaison2,$requete);
$chaine = ""; $url = "";
include("fonctions/traitement_chaine.php");
while($retour = mysqli_fetch_array($retours))
{
$url = "idee-".supprAccents( supprSpeciaux( strtolower( $retour["liste_nom"]."-".$retour["liste_ville"])))."-".$retour["liste_num"];
$chaine .= "<div style='float:left; width:190px; margin-left:10px; font-size:12px; text-align:left;'><a href='".$url."' style='text-decoration:none; color:#666666;'>".utf8_encode(str_replace("#", "'", $retour["liste_nom"]))."</a></div><div style='float:left; width:130px; font-size:10px; text-align:left;'>".utf8_encode(str_replace("#", "'", $retour["liste_activite"]))."</div><br/>";
}
...
Ces url sont construites conformément à cette signature, dans une
boucle while parcourant tous les enregistrements correspondant à la demande. Pour purger l'adresse des accents et caractères spéciaux, nous exploitons des
fonctions Php externes que nous intégrons dans la page, grâce à l'
instruction include.
Dans la page appelée nommée
fiche.php, nous devons reconstruire exactement la même adresse, en récupérant les informations issues de la
base de données MySql, selon le numéro de clé primaire passé en paramètre. Puis, nous devons comparer cette adresse conforme avec celle effectivement appelée. Si les deux ne concordent pas, nous devons produire une redirection vers la bonne Url. De cette manière, nous indiquerons explicitement qu'une seule adresse est reconnue pour cette page. Nous devrons néanmoins fournir des indications importantes au
robot d'indexation dans l'
entête http. Nous expliquerons ainsi les causes des
redirections pour qu'elles ne soient pas considérées comme des fraudes au référencement.
Mais avant cela, le projet doit être référencé dans EasyPhp. Les deux serveurs (Http et Database) doivent être démarrés. La
base de données ids doit exister. Elle doit offrir la
table liste_id. Elle stocke des idées de sorties rangées par département et par ville notamment.
Il s'agit des données que nous avons consolidées lors des formations précédentes. Si vous ne les possédez pas, vous devez créer la
base ids et y importer le
fichier id2sorties.sql, situé dans le sous
dossier bdd du dossier de décompression.
De même, le
compte utilisateur suivant doit être créé afin que Php puisse accéder à ces ressources :
- Nom d'utilisateur : codePHP,
- Mot de passe : php123bd,
- Nom d'hôte : L'adresse locale, ici: 127.0.0.1,
Vérifier l'Url d'une page appelée
Pour tester la validité de l'adresse demandée, nous devons être en mesure de prélever la chaîne de l'URL. C'est l'
instruction Php $_SERVER avec le
paramètre REQUEST_URI qui renvoie cette donnée. Mais seule l'adresse de la page en cours nous intéresse. Le préfixe qui mentionne le nom de domaine peut être écarté, pour simplifier la comparaison. C'est pourquoi nous allons découper cette chaîne à l'aide de la
fonction Php substr que nous avons déjà exploitée.
- A la racine du dossier de décompression, cliquer droit sur le fichier fiche.php,
- Dans le menu contextuel, choisir de l'ouvrir avec un éditeur comme le Notepad++,
Nous y retrouvons le code Php questionnant la base de données sur le numéro de la clé primaire passé en paramètre. De fait, il restitue toutes les informations de l'enregistrement correspondant.
- Juste après l'affectation de la variable $tab_nb, ajouter les lignes Php suivantes :
...
$retours_nb = mysqli_query($liaison, $requete_nb);
$tab_nb = mysqli_fetch_array($retours_nb);
$url_en_cours = substr($_SERVER['REQUEST_URI'], strripos($_SERVER['REQUEST_URI'], "/")+ 1);
echo $url_en_cours;
$le_nom = utf8_encode(str_replace("#", "'", $tab_nb["liste_nom"]));
$le_dep = utf8_encode($tab_nb["liste_dep"]);
...
La
fonction substr permet de découper la chaîne de caractères qui lui est passée en premier paramètre. Nous lui indiquons donc l'url de la page en cours ($_SERVER['REQUEST_URI']). Cette découpe se réalise à partir d'une position spécifiée en second paramètre. Grâce à la
fonction Php strripos, nous définissons le point de départ après le dernier slash (/). C'est pourquoi nous ajoutons une unité à la valeur retournée par la fonction. Le troisième argument de la
fonction substr est facultatif. Il permet de préciser sur quelle longueur le prélèvement doit se faire. S'il n'est pas spécifié comme ici, les caractères sont prélevés jusqu'à la fin de la chaîne, en partant bien sûr de la position indiquée en deuxième paramètre. Enfin, grâce à la
fonction Php echo, nous resituons l'information découpée en lieu et place, à titre de test.
- Enregistrer les modifications et basculer sur l'interface d'EasyPhp,
- Cliquer sur le lien du projet pour atteindre sa page d'accueil,
- Avec la liste déroulante qui se propose, choisir un département, par exemple : 26-Drome,
- Avec la seconde liste déroulante liée qui apparaît, choisir une ville, par exemple : Valence,
- Cliquer sur le chiffre 3 de la barre de navigation sous les résultats,
- Puis, cliquer sur l'idée de sortie : MAISON PIC - Relais et Chateaux Pic,
Nous accédons ainsi à la fiche de l'enregistrement cliqué. L'url est parfaitement réécrite selon les développements aboutis lors de la formation précédente.
Et comme vous le remarquez, tout en haut de la page Web, nous sommes en effet en mesure de récolter la partie utile de l'url en cours. Cette information est précieuse pour pouvoir la comparer avec l'adresse unique qui doit définir cette page.
Et pour effectuer cette comparaison, nous devons reconstruire l'Url de la page, comme nous l'avions fait dans le code du
fichier reponse.php, pour créer le lien organique. Souvenez-vous, pour purger la chaîne des accents et caractères spéciaux, nous devons exploiter deux fonctions externes. Elles appartiennent au
fichier traitement_chaine.php, situé dans le
sous dossier fonctions. Nous devons donc l'intégrer dans la construction du code.
- Revenir dans le code de la page fiche.php,
- Compléter le code précédent à l'aide des instructions Php suivantes, mentionnées en gras :
...
$tab_nb = mysqli_fetch_array($retours_nb);
$url_en_cours = substr($_SERVER['REQUEST_URI'], strripos($_SERVER['REQUEST_URI'], "/")+ 1);
include("fonctions/traitement_chaine.php");
$url_ok = "idee-".supprAccents( supprSpeciaux( strtolower( $tab_nb["liste_nom"]."-".$tab_nb["liste_ville"])))."-".$tab_nb["liste_num"];
echo $url_en_cours."<br />".$url_ok;
$le_nom = utf8_encode(str_replace("#", "'", $tab_nb["liste_nom"]));
...
Tout d'abord, nous exploitons la
fonction include pour faire référence au
fichier php externe, proposant les deux fonctions de traitement de chaînes. Puis, grâce à elles, nous reconstruisons l'url correcte que nous stockons dans la
variable $url_ok. Pour éviter toute erreur, cette affectation peut être copiée depuis la
page reponse.php. Il s'agit néanmoins d'adapter le nom du
tableau de variables. $retour devient $tab_nb. Nous adaptons enfin l'
instruction echo afin de restituer ces deux url l'une sous l'autre, Ã titre de comparaison temporaire.
- Enregistrer les modifications et basculer sur la fenêtre du navigateur internet,
- Rafraîchir la précédente page Web avec la touche F5 du clavier,
Comme vous le constatez, les deux adresses sont restituées l'une sous l'autre. Et elles coïncident.
- Dans l'Url, supprimer le mot chateaux puis valider la barre d'adresse pour recharger la page,
Les deux adresses ne correspondent plus. Pourtant, la page Web continue de se charger de son contenu comme si de rien n'était. Et c'est bien là que réside le problème. En l'état, une infinité d'Url peut désigner la même page Web. Le risque est grave. Si
Google recense plusieurs Url pour une même page Web, il parle de
Duplicate Content, soit de contenu dupliqué. En termes de référencement, les rubriques sont discréditées voire Sand boxées. En conclusion, on ne vous trouve pas dans les
moteurs de recherche.
Redirection Http en PHP
La solution consiste donc à comparer ces deux Url. Si celle de la barre d'adresse ne correspond pas à l'url validée ($url_ok), alors une redirection doit être réalisée pour afficher la page avec son adresse d'origine.
En Php, une
redirection s'effectue grâce à la
fonction header. Pour qu'elle fonctionne, elle doit intervenir avant l'entête de la page en cours, soit avant sa construction propre. Notre section de
code Php est située au-dessus des déclaratives Html, soit au-dessus de l'entête. Nous pouvons donc y finaliser notre code.
- Revenir dans le code de la page fiche.php,
- Remplacer l'instruction echo par les lignes Php suivantes :
...
$tab_nb = mysqli_fetch_array($retours_nb);
$url_en_cours = substr($_SERVER['REQUEST_URI'], strripos($_SERVER['REQUEST_URI'], "/")+1);
include("fonctions/traitement_chaine.php");
$url_ok ="idee-".supprAccents( supprSpeciaux( strtolower( $tab_nb["liste_nom"]."-".$tab_nb["liste_ville"])))."-".$tab_nb["liste_num"];
if($url_ok!="" && $url_ok!=$url_en_cours)
{
header("HTTP/1.0 404 Not Found");
header("location:https://127.0.0.1:8080/edsa-seo-http/".$url_ok);
exit();
}
$le_nom = utf8_encode(str_replace("#", "'", $tab_nb["liste_nom"]));
...
Le code Php est relativement simple. Grâce à une
instruction conditionnelle, nous vérifions un double critère avant de nous prononcer. Tout d'abord, l'url doit avoir été reconstruite. Elle doit donc exister ($url_ok!=""). En effet, si le numéro de clé primaire passé en paramètre n'existe pas, l'erreur est gérée par le
fichier htaccess. En conséquence, les robots d'indexation en sont informés conformément aux règles de l'art. Dans le même temps, nous vérifions que l'url conforme et celle prélevée ne coïncident pas. Dans ce cas, nous exploitons la
fonction header à deux reprises. Premièrement nous passons des informations dans l'entête. Elles sont destinées aux robots d'indexation. Une
erreur 404 signifie clairement que l'Url demandée n'existe pas. Elle justifie donc la redirection qui suit. Pour cela, en paramètre de la fonction, nous exploitons l'
attribut location que nous faisons suivre de l'url originelle reconstruite. Nous n'oublions pas d'exploiter la
fonction Php exit pour mettre fin au traitement serveur sur cette page, après la redirection.
- Enregistrer les modifications et basculer sur la fenêtre du navigateur Internet,
- Recharger la page Web à l'aide de la touche F5,
Vous constatez que l'url précédemment trafiquée est désormais parfaitement reconstruite. Si vous supprimez certains termes de l'adresse, vous remarquez qu'une
redirection est exécutée à validation. Le résultat est désormais le même pour toutes les url appelant cette
page fiche.php. Nous venons d'ajouter une sécurité importante en termes de
référencement naturel, afin d'éviter le
duplicate content et la dégradation des résultats naturels.