Un client m'appelle un mardi matin, paniqué : sa version canadienne-française vient de disparaître des résultats Google. Pas désindexée, non. Juste remplacée par la version française de France dans les recherches canadiennes. Deux semaines plus tôt, quelqu'un dans son équipe avait "nettoyé" le head HTML et supprimé une quinzaine de balises qui "ne servaient à rien".
Parmi elles, les balises hreflang. Le truc que personne ne comprend vraiment, que tout le monde copie mal, et qui casse silencieusement.
Ce n'est pas un sujet sexy. Mais si vous gérez un site multilingue, c'est probablement la balise la plus rentable que vous puissiez configurer correctement — ou la plus coûteuse à rater.
Points clés à retenir
- Une balise hreflang indique à Google quelle version linguistique ou régionale servir à quel public.
- La règle de réciprocité est non négociable : chaque page doit lister toutes les autres, y compris elle-même.
- Trois méthodes d'implémentation existent : HTML head, sitemap XML, en-têtes HTTP.
- Une erreur de hreflang ne provoque pas de pénalité — elle provoque du silence, ce qui est pire.
- x-default sert de page de secours quand aucune version ne correspond à la langue de l'internaute.
Comment fonctionne vraiment une balise hreflang sur un site multilingue
Imaginez que vous ayez trois versions d'une même page produit : une en français de France, une en français du Canada, une en anglais. Le contenu est quasi identique. Pour Googlebot, c'est du contenu dupliqué à 90 %. Sans signal, le moteur en choisit une au hasard et l'affiche partout. Souvent la mauvaise.
La balise hreflang existe pour régler ce problème. Elle ne dit pas "cette page est en français". Elle dit : "cette page est la variante française de France, et voici où trouver ses cousines."
La structure exacte d'un bloc hreflang
Voici le bloc que j'utilise sur une page française de France, avec ses deux sœurs :
<link rel="alternate" hreflang="fr-fr" href="https://exemple.fr/produit" />
<link rel="alternate" hreflang="fr-ca" href="https://exemple.ca/produit" />
<link rel="alternate" hreflang="en" href="https://exemple.com/product" />
<link rel="alternate" hreflang="x-default" href="https://exemple.com/product" />
Trois choses à observer. D'abord, la page se référence elle-même dans son propre bloc. Ensuite, le code pays est en minuscules (fr-fr, pas fr-FR — Google tolère les majuscules mais l'usage veut le minuscule). Enfin, chaque page cible doit contenir exactement le même bloc, à l'identique. C'est ce qu'on appelle la réciprocité.
Et c'est là que tout casse. Une page qui pointe vers une autre sans que l'autre ne pointe en retour est ignorée. Google ne la lit pas. Je l'ai appris à mes dépens sur un projet e-commerce : j'avais déployé les balises en trois vagues successives, un pays à la fois. Résultat : pendant six semaines, aucune relation n'était complète, et Google a servi la version française à tout le monde. Les Canadiens voyaient les prix en euros.
Langue seule ou langue + région ?
La règle :
fr= français, sans distinction géographiquefr-fr= français de Francefr-ca,fr-be,fr-ch= variantes régionalesen= anglais générique (utile pour les marchés anglophones multiples)
Mon conseil : ne multipliez pas les variantes régionales sans raison commerciale. Si votre contenu est identique pour la Belgique et la France, servez fr aux deux. J'ai vu des sites avec huit versions "françaises" différentes dont le contenu était mot pour mot le même. Google a fini par ignorer le bloc entier, jugeant le signal incohérent. Personnellement, c'est l'erreur que je vois le plus souvent.
Trois méthodes d'implémentation, et laquelle choisir
Toutes les balises hreflang ne se valent pas selon le contexte technique. Voici le comparatif que j'aurais aimé trouver il y a quelques années.
| Méthode | Quand l'utiliser | Limite |
|---|---|---|
HTML <head> | Sites de quelques centaines de pages multilingues | Ne marche pas pour les PDF ou fichiers non-HTML |
| Sitemap XML | Gros catalogues, plusieurs milliers d'URL | Déploiement plus lourd à maintenir |
| En-têtes HTTP | Fichiers PDF, vidéos, contenus non-HTML | Nécessite un accès serveur, difficile à auditer |
Méthode 1 : dans le HTML
La plus répandue. Une balise <link rel="alternate"> par variante, dans le <head>. Avantage : visible dans le code source, facile à auditer avec un crawler.
Méthode 2 : dans le sitemap XML
Chaque URL porte un bloc xhtml:link qui liste les alternatives. Ce format est plus verbeux mais centralise l'information. Je l'utilise quand les équipes techniques ne veulent pas toucher au template HTML — c'est souvent plus simple à faire valider.
Méthode 3 : via les en-têtes HTTP
Indispensable pour les PDF. Un Link: header envoyé avec la réponse HTTP fait le même travail qu'une balise HTML. Mais franchement, je ne recommande cette approche que si vous n'avez pas le choix : un en-tête mal configuré est invisible dans le navigateur, donc impossible à débugger sans outils dédiés.
À quoi sert x-default, concrètement
Une question que je reçois souvent : "Ma page est en français et en anglais. Que faire pour un visiteur japonais ?"
Réponse : x-default. Cette valeur indique la page de secours quand aucune autre ne correspond à la langue de l'internaute. Souvent, il s'agit d'un sélecteur de langue global, ou de la version anglaise par défaut.
Sans x-default, Google pioche au hasard. Avec, vous contrôlez l'expérience pour 100 % des visiteurs, y compris ceux qui parlent coréen et que vous ne ciblez pas explicitement. Ce n'est pas indispensable — mais c'est bon marché, et ça évite des sauts de page absurdes.
Comment auditer et diagnostiquer ses erreurs hreflang
Le problème avec hreflang, c'est que quand ça ne marche pas, rien ne s'affiche en rouge. Pas d'alerte, pas de pénalité. Juste un trafic qui ne décolle pas sur certains marchés.
Voici ma procédure, celle que j'applique systématiquement :
- Ouvrir la Search Console, rapport "Ciblage international" — Google y liste les erreurs détectées, page par page.
- Lancer un crawl avec Screaming Frog (ou équivalent) et exporter la colonne hreflang. Filtrer les pages sans autopointage.
- Vérifier la réciprocité : pour chaque page A qui pointe vers B, s'assurer que B pointe vers A.
- Contrôler les codes de langue avec un validateur dédié (il en existe plusieurs, gratuits).
Sur un audit récent, j'ai trouvé que sur 340 pages multilingues, 78 présentaient au moins un défaut hreflang — majoritairement des codes pays écrits en majuscules, ou des blocs incomplets dans les templates produits générés dynamiquement.
Les erreurs que je vois systématiquement (et que j'ai faites)
Avouons-le : personne ne configure hreflang parfaitement du premier coup. Voici les pièges classiques.
Oublier l'autopointage
La page doit se citer elle-même dans son bloc. Sinon Google considère le bloc comme incomplet et peut l'ignorer. C'est contre-intuitif, mais obligatoire.
Mélanger plusieurs méthodes sur le même site
HTML pour une section, sitemap pour une autre, sans cohérence. Techniquement possible, mais ingérable à maintenir. Choisissez une méthode par site et tenez-la.
Canonical qui pointe ailleurs
Une canonical cross-langue sur une page hreflang annule le signal. La canonical doit être auto-référente pour chaque version linguistique. J'ai vu un site où la page canadienne-française avait une canonical vers la française — Google ne l'a jamais indexée. Le client a mis huit mois à comprendre pourquoi son trafic canadien était à zéro.
Servir le même contenu sous des codes différents
Si vous déclarez fr-be mais que le contenu est strictement identique à fr-fr, mieux vaut déclarer fr pour les deux ou ne cibler qu'un seul pays. Google accepte les variantes régionales quand elles ont une substance (prix en devise locale, frais de port, mentions légales). Sinon, le signal devient du bruit.
Comment hreflang s'articule avec les autres signaux
Un site multilingue bien configuré empile trois couches :
- hreflang : quel public servir.
- canonical : quelle URL est la version de référence pour un contenu donné.
- sitemap : quand Google doit crawler.
Ces trois signaux se complètent, ils ne s'opposent pas. Une page française de France a : sa propre canonical (auto-référente), un bloc hreflang complet listant ses trois cousines, et sa présence dans le sitemap avec les entrées xhtml:link. Une fois ce trio en place, vous dormez tranquille.
Mais attention : hreflang ne remplace pas une traduction réelle. Si votre version "allemande" est un Google Translate non relu, le contenu restera mauvais, quel que soit le signal technique. Ne l'oubliez pas.
Le cas de la cannibalisation multilingue
Quand fr-fr, fr-be et fr-ca présentent des pages quasi identiques avec les mêmes mots-clés, Google peut en ignorer certaines. Le remède : différencier le contenu sur au moins un axe significatif (devise, disponibilité produit, exemples locaux). À défaut, regrouper sous un seul fr et laisser le sélecteur de langue faire le tri côté utilisateur.
Un de mes clients avait trois versions "françaises" qui se positionnaient chacune sur des requêtes légèrement différentes. On a consolidé en une seule version fr avec redirections 301. Résultat : trafic français consolidé en hausse de 40 % sur trois mois, parce que les signaux dispersés ne se neutralisaient plus entre eux.
Le vrai piège, c'est de croire que hreflang est une solution miracle. Ce n'est qu'un filtre. Si le contenu derrière est du copier-coller, aucune balise au monde ne vous sauvera.
La checklist que je déroule à chaque projet
Ce que vous devez vérifier avant de considérer votre implémentation terminée :
- Chaque page multilingue contient un bloc hreflang complet (toutes les variantes + autopointage).
- Les codes langue sont en minuscules, avec tiret, pas de souligné.
- Les URL sont absolues (https://…), pas relatives.
- La canonical de chaque page pointe vers elle-même.
- La réciprocité est vérifiée sur un échantillon de pages (au moins 20 %).
- Une valeur x-default existe si vous ciblez plusieurs marchés.
- La Search Console ne remonte aucune erreur dans "Ciblage international".
Et une dernière chose : documentez votre implémentation. Sur un projet à trois développeurs qui se relaient, la règle de réciprocité sera oubliée par le troisième. J'ai perdu une migration entière comme ça. Un fichier README avec le bloc type et la liste des variantes, c'est trente minutes d'écriture pour éviter trois semaines de casse silencieuse.
Hreflang n'est pas une balise excitante. Elle ne génère pas de trafic par magie. Mais elle garantit que chaque visiteur atterrit sur la bonne version de votre site — et quand on gère dix marchés, ça change tout. La vraie question n'est pas "faut-il l'utiliser", mais "combien de temps votre équipe tiendra-t-elle sans règles écrites". La réponse, en général, ne plaide pas en votre faveur.