SEO international et hreflang en pratique
Lancez des sites multilingues et multirégionaux qui se classent sur chaque marché — avec un hreflang bien posé.
On bascule vers le SEO international dès l’instant où le contenu cesse de servir un seul public. Deux déclencheurs forcent la question. Le premier, c’est la langue : vous traduisez le site en allemand, en japonais ou en espagnol, et chaque traduction doit remonter pour les gens qui lisent cette langue. Le second, c’est la région : la langue est la même mais le marché diffère — une boutique américaine et une boutique britannique, toutes deux en anglais, avec des prix, une livraison, une orthographe et des mentions légales distinctes. Souvent, les deux se cumulent : anglais pour les États-Unis, anglais pour le Royaume-Uni, allemand pour l’Allemagne, allemand pour l’Autriche.
Les moteurs de recherche ne savent pas automatiquement que votre page /de/produkt est l’équivalent allemand de /en/product. Livrés à eux-mêmes, ils se trompent, et le coût est concret :
- Classement sur la mauvaise région. Votre page de prix en dollars américains se classe pour les internautes britanniques, qui rebondissent dès qu’ils tombent sur un paiement dans la mauvaise devise.
- Auto-cannibalisation. Deux pages anglaises quasi identiques se disputent la même requête. Google en choisit une presque au hasard, dilue vos signaux, et aucune ne se classe aussi bien qu’une page unique l’aurait fait.
- Dilution par contenu dupliqué. Les passages non traduits et les gabarits partagés entre locales ressemblent à du contenu mince et répétitif, ce qui plombe l’ensemble du cluster.
hreflang est le mécanisme qui corrige cela. C’est un jeu d’annotations qui indiquent aux moteurs : « cette URL est la version langue X, région Y de cette page, et voici tous ses équivalents ». Bien fait, il dirige chaque internaute vers la page conçue pour lui. Mal fait — et c’est très facile à rater — il ne fait silencieusement rien, ou pire, oriente les crawlers vers les mauvaises pages. Ce guide est la version du praticien : la structure d’abord, puis l’implémentation, puis les modes de défaillance qui dévorent des heures.
Structure des URL — la fondation sur laquelle repose hreflang
Avant toute annotation, vous choisissez comment les locales se projettent sur les URL. Cette décision est difficile à revenir en arrière (elle change chaque URL du site), alors pesez-la soigneusement. Il y a trois schémas viables.
| Approche | Exemple | Autorité SEO | Signal géographique vers Google | Coût et mise en place | Maintenance |
|---|---|---|---|---|---|
| ccTLD (domaine de premier niveau national) | example.de, example.co.uk | Fractionnée — chaque domaine bâtit son autorité de zéro | Le plus fort — .de est un signal Allemagne sans équivoque | Élevé — acheter/défendre de nombreux domaines, hébergement et certificats séparés | Élevée — chaque domaine est sa propre propriété SEO |
| Sous-répertoire | example.com/de/, example.com/en-gb/ | Consolidée — toutes les locales partagent l’autorité d’un seul domaine | Modéré — défini via hreflang + contenu | Faible — un domaine, un certificat, un déploiement | Faible — base de code unique, propriété unique |
| Sous-domaine | de.example.com, uk.example.com | Plutôt fractionnée — Google traite les sous-domaines comme semi-séparés | Modéré | Moyen — DNS + certificat par sous-domaine | Moyenne |
Recommandation pour la plupart des sites : les sous-répertoires. Ils permettent à chaque locale d’hériter de l’autorité déjà acquise par votre domaine principal, au lieu de forcer chaque marché à repartir de zéro. Ce sont les moins coûteux à exploiter — un dépôt, un pipeline de déploiement, un certificat TLS, une propriété à surveiller. Et c’est exactement ce que les générateurs de sites statiques produisent naturellement.
Réservez les ccTLD aux cas où le signal géographique vaut son coût : vous êtes une grande marque disposant des ressources pour bâtir une autorité dans chaque pays indépendamment, la confiance locale compte énormément (finance, santé, secteurs proches du gouvernement), ou un régulateur impose de fait un domaine local. Les sous-domaines sont une option intermédiaire, choisie en général pour des raisons d’infrastructure (une pile distincte par région) plutôt que SEO — Google affirme les gérer sans problème, mais en pratique la consolidation de l’autorité est moins propre qu’avec les sous-répertoires.
💡 Astuce : le segment de locale se place en premier dans le chemin —
/de/blog/post, pas/blog/de/post. Un préfixe de premier niveau est sans ambiguïté, facile à router, et permet d’appliquer la logique de locale (devise, en-têtes de langue) sur une seule branche de l’arbre de routage.
🧑💻 Point de vue développeur : quel que soit votre choix, faites de la locale une source unique de vérité dans le code — un objet de config unique faisant correspondre
locale -> { hreflang, currency, path prefix }. Tout le reste (sitemap, balises hreflang, sélecteur de langue, analytics) doit lire à cet endroit unique. Le jour où vous ajoutezfr-CA, vous voulez éditer un seul fichier, pas sept.
Implémentation de hreflang — trois méthodes de livraison
hreflang, ce sont les mêmes données livrées par l’un de trois canaux. Vous choisissez une seule méthode principale par page ; les mélanger sur la même URL invite les contradictions. La règle non négociable qui prime sur tout le reste : les annotations doivent être bidirectionnelles (balises de retour). Si la page A désigne B comme son équivalent allemand, alors B doit désigner A comme son équivalent anglais. S’il manque ne serait-ce qu’un seul lien de retour, Google ignore le cluster entier pour cette page. Voyez cela comme une poignée de main — les deux mains doivent se tendre, sinon pas d’accord.
Méthode 1 — éléments HTML <link>
La méthode la plus courante. Le <head> de chaque page liste tous les équivalents de locale, y compris elle-même (auto-référentiel), plus x-default.
<!-- In the <head> of https://example.com/en/product -->
<link rel="alternate" hreflang="en" href="https://example.com/en/product" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/product" />
<link rel="alternate" hreflang="de" href="https://example.com/de/produkt" />
<link rel="alternate" hreflang="zh-CN" href="https://example.com/zh-cn/product" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/product" />
Chaque page équivalente de cet ensemble doit porter le même bloc (en s’auto-référençant comme l’une des entrées). Cette identité constitue la poignée de main bidirectionnelle.
Méthode 2 — sitemap XML
Idéale pour les grands sites : vous maintenez les annotations dans un seul fichier au lieu de milliers de en-têtes de pages, et une seule entrée de sitemap déclare tout le cluster d’un coup.
<url>
<loc>https://example.com/en/product</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/product"/>
<xhtml:link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/product"/>
<xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/produkt"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/product"/>
</url>
N’oubliez pas l’espace de noms sur l’élément racine : xmlns:xhtml="http://www.w3.org/1999/xhtml". Et la règle de bidirectionnalité s’applique toujours — chaque entrée <url> du cluster a besoin de l’ensemble complet des enfants xhtml:link, pas seulement d’un lien de retour vers un pair.
Méthode 3 — en-tête HTTP Link
La seule option pour les fichiers non HTML comme les PDF, où il n’y a pas de <head> à éditer. Livrée sous forme d’en-tête de réponse.
Link: <https://example.com/en/manual.pdf>; rel="alternate"; hreflang="en",
<https://example.com/de/handbuch.pdf>; rel="alternate"; hreflang="de"
Choisir une méthode
| Méthode | Idéale pour | À surveiller |
|---|---|---|
HTML <link> | Petits/moyens sites, contrôle total du gabarit | Poids des pages ; chaque page éditée à chaque changement de locale |
| Sitemap XML | Grands sites, génération programmatique | Le sitemap doit rester parfaitement synchronisé avec les URL en ligne |
| En-tête HTTP | PDF et autres ressources non HTML | Nécessite une config serveur/edge ; facile à oublier |
Bien renseigner les codes
La valeur est language ou language-REGION :
- Langue seule —
en,de,zh,fr. Cible les locuteurs de cette langue où qu’ils soient. - Langue + région —
en-GB,en-US,zh-CN,pt-BR. Cible cette langue dans ce pays.
Le code de langue est ISO 639-1 (deux lettres). Le code de région est ISO 3166-1 alpha-2 (deux lettres, un pays, pas un continent ni une langue). Le piège classique : le code pays du Royaume-Uni est GB, pas UK. Et x-default est le panier de repli — la page montrée à quiconque dont vous ne couvrez pas explicitement la langue/région (on y revient juste après). La casse n’est pas imposée, mais la forme conventionnelle est langue en minuscules, région en majuscules : zh-CN, en-GB.
Erreurs courantes — les modes de défaillance qui coûtent des heures
hreflang échoue silencieusement. Il n’y a pas de page d’erreur ; les balises sont simplement ignorées et vos locales dérivent dans le classement. Voici les causes récurrentes.
-
Balises de retour manquantes. La page A pointe vers B, mais B ne pointe pas vers A. La défaillance la plus fréquente — et elle invalide le cluster entier, pas seulement le lien cassé. Rendez toujours l’ensemble complet et symétrique sur chaque page.
-
Codes erronés ou invalides.
en-UKau lieu deen-GB. Inventer des codes de région (en-EU— il n’existe aucun paysEU). Utiliser une langue là où une région est attendue. Une seule entrée invalide peut annuler tout l’ensemble. Validez par rapport aux listes ISO. -
URL relatives. hreflang exige des URL absolues avec protocole et hôte —
https://example.com/de/produkt, jamais/de/produkt. Les URL relatives sont ignorées. -
Le canonical qui combat hreflang. C’est le tueur subtil. Le canonical de chaque page de locale doit être auto-référentiel —
/de/produktse canonise vers/de/produkt. Si chaque locale se canonise plutôt vers la version anglaise, vous dites à Google « ce sont des doublons, n’indexe que l’anglaise », ce qui contredit directement le « ce sont des équivalents de locale distincts » de hreflang. Le canonical l’emporte, et vos traductions disparaissent de l’index. Règle : canonical auto-référentiel + ensemble hreflang, sur chaque page. -
x-defaultmanquant. Pas strictement requis, mais sans lui Google n’a aucun repli déclaré pour les utilisateurs non couverts. Incluez toujours unx-default— pointant en général vers une page de sélection de langue ou votre version la plus générale / par défaut. -
Annoter des URL qui redirigent ou ne renvoient pas 200. Chaque URL de l’ensemble doit renvoyer
200 OKet être indexable. Pointer hreflang vers une URL qui fait une redirection 301 ou un 404 casse ce nœud du cluster. -
Mélanger les méthodes de livraison de façon incohérente. Le sitemap dit une chose, le head HTML en dit une autre. Choisissez une seule source de vérité.
⚠️ Attention : hreflang est un indice de regroupement et de routage, pas un boost de classement. Il ne fera pas remonter une page faible. Bien fait, il garantit que la bonne page déjà classée est celle montrée à chaque internaute. Attendez-vous à « les utilisateurs arrivent maintenant sur la bonne locale », pas à « le trafic a doublé ».
Ciblage par langue ou par région — ne vous faites pas concurrence à vous-même
Le choix stratégique le plus difficile est le niveau de granularité. Plus de pages de locale, ce n’est pas mieux ; cela multiplie la maintenance et risque l’auto-concurrence.
Ciblez par langue seule (en, de, fr) quand le contenu est réellement identique pour tous les locuteurs de cette langue quel que soit le pays — même produit, mêmes prix, même texte. Une page allemande unique servant l’Allemagne, l’Autriche et la Suisse est plus simple et concentre les signaux sur une seule URL.
Ciblez par langue + région (en-US, en-GB) quand la même langue nécessite un contenu différent par marché : prix ou devise différents, livraison ou disponibilité différentes, mentions légales spécifiques à la région, ou différences d’orthographe/d’idiome qui justifient la séparation (color/colour, fall/autumn).
La zone de danger, c’est même langue, plusieurs régions au contenu quasi identique — des pages en-US et en-GB qui ne diffèrent que par une chaîne de prix. Pour Google, elles ressemblent à des doublons en concurrence sur les mêmes requêtes, le piège classique de l’auto-cannibalisation. Deux issues :
- Différenciez assez pour justifier la séparation — tarifs distincts, exemples locaux, sections propres au marché — et câblez un hreflang correct pour que Google route par région au lieu de choisir à votre place.
- Ou repliez-vous sur la langue seule (
enavecx-default) si les marchés ne diffèrent vraiment pas. Une page forte vaut mieux que deux jumelles faibles.
💡 Astuce : un test utile — si un visiteur américain et un visiteur britannique étaient aussi bien servis par la même page, vous n’avez pas besoin de pages régionales séparées. Ne séparez que lorsque l’expérience diverge réellement.
Outillage et validation
hreflang est trop sujet aux erreurs pour être vérifié à l’œil à grande échelle. Intégrez-le à votre workflow.
- Google Search Console. Les rapports International Targeting / Page indexing font remonter les erreurs hreflang (« pas de balises de retour », « code de langue inconnu ») directement issues du parse de Google. C’est la vérité terrain — Google vous disant ce qu’il voit. Vérifiez-le après chaque déploiement de locale.
- Validateurs hreflang. Les vérificateurs dédiés (l’outil de test des balises hreflang de Merkle, TechnicalSEO.com, le générateur d’Aleyda Solis) prennent une URL et vérifient la réciprocité, la validité des codes et le caractère absolu des URL. Utilisez le générateur pour produire un premier ensemble correct, puis un validateur pour confirmer les pages en ligne.
- Crawlers. Screaming Frog, Sitebliss ou l’audit de site d’Ahrefs parcourent tout le site et signalent les balises de retour manquantes, les équivalents non-200 et les conflits canonical/hreflang sur des milliers d’URL d’un coup — le seul moyen réaliste d’auditer un grand site.
curlpour les en-têtes et un contrôle rapide du head. Pour une vérification ponctuelle du hreflang en en-tête HTTP ou du head d’une page :
# Inspect HTTP Link-header hreflang (e.g. on a PDF)
curl -sI https://example.com/en/manual.pdf | grep -i '^link:'
# Pull every hreflang link from a rendered page
curl -s https://example.com/en/product | grep -o 'hreflang="[^"]*"'
🧑💻 Point de vue développeur : ajoutez un contrôle en CI. Crawlez votre sortie buildée, parsez l’ensemble hreflang de chaque page, et vérifiez la réciprocité, les URL absolues et les canonicals auto-référentiels avant le déploiement. Un script de 30 lignes dans votre pipeline attrape le bug de la balise de retour manquante au moment de la PR, au lieu de trois semaines plus tard dans Search Console.
🧑💻 Ce site comme exemple concret
Ce site est lui-même bilingue (anglais et chinois), il vit donc selon ces règles. Il est construit avec le support i18n d’Astro : chaque guide existe sous les préfixes de chemin /en/ et /zh/ (sous-répertoires — la recommandation ci-dessus), piloté par une config de locale unique qui fait correspondre chaque locale à sa valeur hreflang et à son préfixe de chemin. Cette config est la source unique de vérité de l’astuce « point de vue développeur » — le sélecteur de langue, le routage et les balises hreflang lisent tous à cet endroit.
Les annotations hreflang sont générées automatiquement par l’intégration sitemap d’Astro plutôt qu’écrites à la main dans chaque head de page. Lors du build du site, l’intégration parcourt la config de locale, émet le cluster xhtml:link bidirectionnel complet pour chaque page traduite (y compris x-default), et écrit un seul sitemap. Ajouter une nouvelle locale, c’est une édition de config, pas une passe à travers des centaines de fichiers — et la réciprocité est garantie par construction, car le générateur émet l’ensemble symétrique à chaque fois.
C’est la Couche 7 (Avancé et extensions) du framework en action — le SEO international est une préoccupation avancée que l’on superpose une fois les fondamentaux solides. Mais il est implémenté tout en bas, dans la Couche 2 (la couche de build) : le routage i18n et la génération du sitemap sont câblés dans la fondation du site, pas greffés après coup. Si vous voulez la mécanique de la façon dont la sortie statique et le sitemap sont produits, les guides Edge SEO et de la couche de build couvrent le pipeline de déploiement et de génération qui rend tout cela automatique.
Points clés à retenir
- ✅ Par défaut, optez pour les sous-répertoires (
/de/,/en-gb/) — ils consolident l’autorité, coûtent le moins cher, et c’est ce que les générateurs statiques produisent naturellement. Réservez les ccTLD aux fortes exigences de confiance géographique. - ✅ Rendez chaque ensemble hreflang bidirectionnel et auto-référentiel, avec des URL absolues et un
x-default— une seule balise de retour cassée annule tout le cluster. - ✅ Gardez les canonicals auto-référentiels sur chaque locale ; ne canonisez jamais les traductions vers la langue par défaut, sinon elles disparaissent de l’index.
- ✅ Utilisez les codes ISO correctement — la langue est ISO 639-1, la région est ISO 3166-1 (
en-GB, pasen-UK). - ✅ Séparez par région uniquement quand le contenu diffère réellement ; sinon ciblez par langue pour éviter l’auto-cannibalisation.
- ✅ Validez en continu — Search Console + un crawler + un contrôle de réciprocité en CI, car hreflang échoue silencieusement.