Back to articles

Quand les balises canoniques pointent vers d’autres langues, Hreflang échoue

SEOReport Team·
hreflangcanonical-tagsinternational-seomultilingual-seotechnical-seo

Une page localisée dont la canonique pointe vers son homologue anglais annule sa propre annotation hreflang, et aucun contrôle de navigateur ne peut la détecter. Données d’audit sur les vérifications qui détectent la contradiction, plus le jour où nos propres préfixes de locale 9 ont échoué l’un d’eux.

Une page peut porter des balises 2 dans le même <head> that address the same crawler about the same URL and say opposite things. On https://example.com/fr/pricing, cela indique que la page est le membre français d’un cluster :

html
<link rel="alternate" hreflang="fr" href="https://example.com/fr/pricing" />

Et ceci, 1 ligne en dessous, indique que la page est une variante qui doit être intégrée à l’original anglais :

html
<link rel="canonical" href="https://example.com/pricing" />

Les sites réels livrent les deux, à partir du même modèle, sur chaque route localisée qu’ils possèdent. C’est l’échec qui reste après celui que nous avons documenté en juillet — l’auto-référence hreflang manquante, toujours en échec 58% de 88 évaluations hreflang dans nos données actuelles. Un site peut fermer cette boucle, obtenir chaque auto-référence correcte, et tout de même que chaque page localisée demande à être remplacée par son homologue anglais.

Une canonique interlangue demande à Google de fusionner la page localisée URL dans l’original

Une balise canonique est une demande de consolidation : traiter ce URL comme une variante de celui-là, et indexer celui-là. Une annotation hreflang est une revendication de routage : ce URL est la version pour cette langue. Les pointer vers des URLs différentes et le site a émis une requête qui annule sa propre revendication — le créneau français dans le cluster est rempli par une page qui se déclare elle-même. Google a été explicite que hreflang est un indice plutôt qu’une directive, et la canonisation fonctionne de la même façon : le site fournit des signaux, Google les résout. Cette résolution est tout le problème. Avec une page localisée auto-canonique, l’éditeur décide quel URL sert les chercheurs français. Avec une canonique interlangue, l’éditeur a délégué la décision tout en croyant que le cluster est configuré — et le résultat qui est signalé plus tard est une page localisée qui ne se classe nulle part sur son propre marché alors que la page anglaise apparaît à sa place. Les générateurs qui produisent cela sont ordinaires. Un assistant canonique construit à partir d’une définition de route plutôt que du chemin de requête émet le URL sans préfixe pour chaque locale. Un CMS dont le réglage hreflang est par locale mais dont le réglage canonique est global fait la même chose. Donc une migration qui a ajouté des préfixes de locale aux URLs et laissé le canonique pointer vers l'endroit où le contenu était à l'origine. Dans chaque cas, la page se rend parfaitement, les annotations semblent complètes dans view-source, et la contradiction est 2 des attributs.

Le jeu de données

Référence self‑hreflang présenteLa page d'accueil est absente de ses propres annotations hreflang58% des évaluations 88 ; 59% des sites 34
Canonique de la page d'accueil présentLa page d'accueil ne déclare aucun canonique URL du tout29% des sites 49

Méthodologie : instantané d'audit le plus récent par domaine, jeu de vérification engine‑v2, approximativement mai 23 – August 31, 2026, anonymisé. Les dénominateurs diffèrent selon la vérification — 34 vers 49 sites — parce qu'une vérification ne s'exécute que lorsque ses entrées existent : la vérification de self‑reference ne donne aucun verdict sur une page d'accueil sans annotations hreflang du tout, ce qui explique pourquoi son nombre de sites est le plus petit. Les taux au niveau de l'évaluation et au niveau du site diffèrent parce que certains domaines ont été audités plus d'une fois dans la fenêtre. L'échantillon est auto‑sélectionné — propriétaires ayant effectué un audit — et penche vers les petites à moyennes tailles, donc considérez les taux comme indicatifs pour ce segment. La deuxième ligne est le risque le plus discret. Une page sans canonique n'a pas contredit son annotation hreflang, mais elle n'a pas non plus défendu l'annotation : rien dans la page ne précise quel URL elle considère comme autoritaire, donc une variante de locale accessible à plus d'une adresse est résolue entièrement par inférence. Atteindre un cluster correct passe d'abord par l'hygiène canonique, c'est pourquoi notre guide canonique est le prérequis pour le guide d'implémentation hreflang, et non un compagnon.

La contradiction n'est visible que des deux côtés du cluster

Une seule page ne peut pas signaler cet échec à elle-même. /fr/pricing semble cohérent en interne — un ensemble hreflang, un canonique, tous deux bien formés. Le défaut apparaît lorsque vous placez l'annotation et la page annotée côte à côte, c'est pourquoi notre audit récupère le cluster plutôt que de lire 1 document. Chaque exécution analyse les annotations hreflang de la page d'accueil et récupère jusqu'à 12 cibles du même site, sautant l'étape entièrement lorsque la page d'accueil elle‑même se trouve hors domaine, puisque ces annotations provenaient du site étranger HTML. Pour chaque cible qui renvoie du contenu, le moteur enregistre le code d'état, si la requête a redirigé, si une directive noindex est présente, et si le canonique propre à la cible résout vers le URL que l'annotation nomme. Une discordance là‑dessus est enregistrée comme canonical_mismatch et échoue une vérification à haute gravité — cette vérification est le piège canonique inter‑langues. Les URL sont comparées avec un slash final et la casse normalisée, donc /fr/pricing et /FR/pricing/ sont une page, et rien de plus précis n’est traité comme une différence. Une seconde vérification compare la langue déclarée par la page dans son attribut lang avec le locale que son propre annotation hreflang revendique, sur le sous‑tag principal, et uniquement lorsqu’une page dans l’audit a déclaré hreflang pour elle-même. Un site sans annotation auto‑référentielle nulle part est monolingue du point de vue de l’audit, et la vérification signale cela plutôt que de passer. Lorsqu’un alternatif ne peut pas être récupéré, le verdict est inconclusive plutôt qu’un échec, et le rapport indique combien des cibles déclarées ont réellement été évaluées. Un alternatif inatteignable est un manque de preuve, et le signaler comme un défaut serait en inventer un.

graph TD FR["/fr/pricing — html lang=fr"] EN["/pricing — original anglais"] FR -->|"hreflang=fr, self-referencing"| CLAIM["Réclamation : servir ce URL aux chercheurs français"] FR -->|"rel=canonical"| EN EN -->|"hreflang=fr"| FR CLAIM --> Q{"Quel URL répond à une requête française ?"} EN --> Q Q -->|"le site a cessé de décider"| OUT["Google picks — généralement le URL anglais"]

Nos propres préfixes de locale servaient l’anglais jusqu’à August 17, 2026

Ces vérifications existent parce que nous avons échoué à ce type de défaut sur seoreport.dev. Ahrefs Site Audit a signalé un hreflang et un désaccord de langue HTML sur 184 URL de notre propre site. L’attribut lang était le symptôme ; le contenu était également anglais, sur chacun des 9 préfixes de locale, ce qui rendait chaque URL localisé un duplicata de son jumeau anglais — le même résultat qu’un canonique cross‑langue produit, atteint depuis l’autre direction. La cause était 1 fonction boundary. Le shell du document prenait sa langue d’un helper qui renvoie la langue par défaut chaque fois que window est indéfini. Sur le serveur, /fr/pricing rendait donc lang="en" et semait le bundle de traduction anglais, tandis que le composant qui émet les liens head — qui lit le chemin, pas le runtime — émettait un fr self‑hreflang correct directement à côté. Un effet client changeait la langue après l’hydratation, donc chaque vérification basée sur le navigateur passait et aucun humain ne l’a vu. Les crawlers n’exécutent pas cet effet. Corrigé sur August 17, 2026 : le shell tire sa langue du chemin, la mise en page localisée résout le bundle de locale dans un loader afin que le rendu serveur et l’hydratation le partagent, et une locale prise en charge sans bundle lance une erreur plutôt que de servir silencieusement l’anglais sous son préfixe. La direction du texte était également incorrecte — l’arabe servait ltr. La porte est un fumée brute-HTML sans JavaScript, car une vérification de navigateur est aveugle à cette classe d'échec entière. Exécuter en rouge d'abord contre la production a signalé 440 échecs sur 128 URLs localisées, chaque page à 100% anglais en transfert. Contre la version corrigée : 0 échecs sur 144 URLs. La comparaison langue-versus-hreflang du moteur a été construite séparément, et le premier site qu'il aurait échoué était le nôtre.

x-default hérite de ce que la page de secours déclare

Notre échantillon de sites déclarant x-default est trop petit pour publier un taux d'échec, et il y a une deuxième raison pour laquelle nous ne le notons pas : la capture HTML prouve qu'une annotation x-default est déclarée, pas quel public l'éditeur l'a voulu servir. Cette question de correction n'est pas décidable à partir du document, donc la vérification signale ce qu'elle peut et les faits voisins — forme URL, santé cible, annotations réciproques, alignement canonique — sont évalués indépendamment contre la même cible. Ce que le mécanisme implique vaut la peine d'être déclaré de toute façon. x-default est le secours pour les chercheurs dont la langue n'est pas servie par le site, donc il pointe généralement vers la page du marché principal. Si cette page porte un canonique inter-langue, le secours pour chaque chercheur non apparié sur la planète hérite de la contradiction, et l'audit le signalera via les vérifications de santé cible plutôt que via x-default lui-même.

Vérifiez-le en brut HTML, par locale, dans les deux sens

Récupérez la page comme le fait un crawler et lisez 3 choses :

curl -s -A "Googlebot" https://example.com/fr/pricing | grep -iE '<html|rel="canonical"|hreflang'

L'attribut lang, l'entrée hreflang auto-référencée, et le canonique doivent être d'accord sur 1 locale et 1 URL :

html
<!-- On https://example.com/fr/pricing -->
<html lang="fr">
<link rel="canonical" href="https://example.com/fr/pricing" />
<link rel="alternate" hreflang="en" href="https://example.com/pricing" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/pricing" />
<link rel="alternate" hreflang="x-default" href="https://example.com/pricing" />

Puis répétez sur 1 page par locale, et récupérez chaque URL que le nom des annotations indique pour confirmer que chacun canonique à lui-même. La règle est assez courte pour être remise à un développeur : chaque membre d'un cluster hreflang canonique à lui-même. Un canonique inter-langue est correct dans exactement 1 situation — lorsque le URL localisé n'est pas localisé du tout et sert la même langue que l'original — et dans cette situation le URL n'appartient pas non plus au cluster. L'Inspection URL de Search Console donne la seconde opinion autoritaire sur quel canonique Google a réellement été sélectionné, par URL. Notre audit exécute la boucle sur le cluster à chaque rapport, et le free report liste chaque paire contradictoire avec la page où elle a été trouvée. Les préfixes de locale 9 sur seoreport.dev passent maintenant, et ils passent parce que nous avons expédié le défaut d'abord, sur un site dont tout le produit le trouve.

Voir comment votre site se classe

Get a free IA-powered SEO report with actionable findings and priority fixes for your website.

Aucune inscription requise.