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.

Il est possible que cette balise qui résoud le problème d'une petite fraction des webmasters, en cause plus encore pour la majorité d'entre eux.
En effet les moteurs de recherche ne discernent pas toujours quand un page est copié, ce qui est l'original et ce qui est la copie. Et si le copieur ajouter une balise canonical à sa copie?
Les utilisateurs de Wordpress à ce jeu sont avantagés puisque la balise est incluse par défaut, contrairement aux sites statiques .

Il convient donc d'ajouter la balise dans toutes vos pages Web, et pour éviter un travail d'édition fastidieux, quelques lignes de PHP à ajouter dans votre modèle de page, peut le faire automatiquement...

Le problème du duplicate content

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 deux 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:

http://www.scriptol.com/mypage.php?node=mykey 

Accès par la page de catégorie:

http://www.scriptol.com/mypage.php?node=mykey&category=mycat

Accès avec un identifieur de session:

http://www.scriptol.com/mypage.php?node=mykey&sessionid=1234

Accès par un numéro:

http://www.scriptol.com/?1234

URL customisée pour le référencement:

http://www.scriptol.com/key1-key2-key3

Les inconvénients sont multiples. D'une part le PageRank provenant des backlinks sera réparti entre les différentes URLs, d'autre part le robot de Google devra choisir une URL unique pour son index, et ce n'est pas forcément celle que le webmaster voudrait mettre en avant!

Pour résoudre ce problème, Google, Yahoo et Live Search proposent une nouvelle meta tag à insérer dans la section HEAD de la page.

<link rel="canonical" href="http://www.scriptol.com/key1-key2-key3" />

Ce peut être le webmaster qui l'insérera, ou le CMS qui se chargera de générer automatiquement cette meta tag... dans une prochaine version.

Source Google Webmaster Central. La même annonce est faite sur le blog de Yahoo et celui de Microsoft.

La balise 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="http://www.scriptol.fr/scripts/canonical.php" /> 

Il peut être produit automatiquement en PHP avec ce code:

<link rel="canonical" href="http://www.scriptol.fr<?php echo $_SERVER['PHP_SELF']; ?>" />

En remplaçant http://www.scriptol.fr par le domaine de votre site.

Un code générique

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="http://www.scriptol.fr
<?php echo substr(__FILE__, strlen($_SERVER['DOCUMENT_ROOT'])); ?>" />

Ainsi le même code pourra être utilisé et placé automatiquement sur toutes vos pages.

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

  1. Utiliser la balise avec la pagination. Car si plusieurs pages du même article pointent sur la première, c'est une erreur.
  2. Des liens relatifs dans l'URL: comme la page peut ne pas être placée sur le bon site, l'effet obtenu est le contraire de l'effet voulu.
  3. Plusieurs balises dans la même page. Elles seront ignorées.
  4. Une page de catégorie contient la balise pointant sur un article.
  5. La balise à l'intérieur de <body>. Elle doit se trouver dans la section <head> sinon elle est ignorée.