Script PHP pour générer la balise rel=canonical
La balise canonical indique quelle est l'URL qui doit être indexée quand plusieurs URL aboutissant sur une même page ou un même contenu déplacé sur une nouvelle page.
Google reconnaît la directive rel=canonical entre deux domaines différents pour résoudre les problèmes de contenu en double depuis le 15 décembre 2009.
Elle est devenue en juin 2012 un standard de l'IETF sous le nom de RFC 6596.
Les utilisateurs de CMS comme Wordpress ont un avantage puisque la balise est incluse par défaut, alors que pour un site statique, ajouter la balise dans chaque page serait fastidieux*... Mais il suffit avec quelques lignes de PHP à ajouter dans un modèle de page, ou dans une en-tête à inclure, et la balise canonical sera renseignées automatiquement...
Au sujet des liens multiples
Le contenu dupliqué survient malencontreusement et non pas forcément délibéremment lorsqu'une page Web devient accessible aux robots des moteurs de recherche par des URL différentes.
C'est le cas surtout avec les CMS qui peuvent accéder aux pages selon différentes options, comme le détaille l'article du blog de Google:
Accès par la page d'accueil:
https://example.com/mypage.php?node=mykey
Accès par la page de catégorie:
https://example.com/mypage.php?node=mykey&category=mycat
Accès avec un identifieur de session:
https://example.com/mypage.php?node=mykey&sessionid=1234
Accès par un numéro:
https://example.com/?1234
URL customisée pour le référencement:
https://example.com/key1-key2-key3
L'inconvénient est que le PageRank provenant des liens retour sera réparti entre les différentes URLs.
Pour résoudre ce problème, Google, Bing et les autres proposent une meta tag à insérer dans la section HEAD de la page.
<link rel="canonical" href="https://example.com/page.php">
Source Google Search Central.
La balise rel canonical
Elle se place dans la section <head> et à la forme <link rel="canonical" href="url de la page">
Par exemple, le lien sur cette page est:
<link rel="canonical" href="https://www.scriptol.fr/scripts/canonical.php">
L'URL dans la balise peut être produite automatiquement en PHP avec ce code:
<link rel="canonical" href="https://example.com<?php echo $_SERVER['PHP_SELF']; ?>">
Remplacez https://example.com par le domaine de votre site.
Supprimez index.php dans l'URL
Pour que la racine du site soit https://example.com/ plutôt que https://example.com/index.php qui est l'URL fournie par PHP_SELF, j'utilise le code suivant:
<?php
$url = $_SERVER['PHP_SELF'];
$page = substr($url, -9);
if($page == "index.php") $url = substr($url, 0, -9);
?>
<link rel="canonical" href="https://example.com<?php echo $url; ?>">
Ce code simplifié peut convenir à la plupart des sites. Mais si vous avez des pages de la forme https://example.com/xxxindex.php, on peuts perfectionner encore le code:
<?php
$url = $_SERVER['PHP_SELF'];
$page = substr($url, -10);
if($page == "/index.php") $url = substr($url, 0, -9);
?>
<link rel="canonical" href="https://example.com<?php echo $url; ?>">
Code alternatif
Si votre serveur n'est pas configuré pour reconnaître la variable PHP_SELF, vous pouvez aussi essayer ce code, plus long:
<link rel="canonical" href="https://example.com
<?php echo substr(__FILE__, strlen($_SERVER['DOCUMENT_ROOT'])); ?>">
En fait, il est possible de rendre le domaine générique aussi avec la variable $_SERVER['HTTP_HOST'], mais si on peut accéder au site avec ou sans www, cela doit être évité.
Lien: 5 common mistakes with the canonical tag. Ce sont des erreurs que Google rencontre souvent.
En résumé:
- Pas de lien relatifs comme l'URL. Le protocole et le domaine doivent être inclus.
- Plusieurs balises rel dans la même page seront ignorées.
- La balise ne se met pas à l'intérieur de <body>. Elle doit se trouver dans la section <head>.
- Le lien canonical ne doit pas contenir d'ancres sur une section de la page, dixit Google.

