Guide SEO pour Hugo
Hugo génère du HTML statique lors du build, sans file de rendu JavaScript. Guide complet sur canoniques, taxonomies, piège alias-vs-301, baseURL, sitemap, hreflang et JSON-LD.
Langues
1 indice probant sur cette page
- Outil en ligne associéCanonicalization Checker
Hugo compile Markdown en HTML terminé lors du build : le contenu figure dans la première réponse, sans file de rendu JavaScript. Cette architecture réduit les risques sans garantir CWV, exploration, indexation ou classement. Vérifiez canoniques, taxonomies, alias en meta refresh plutôt qu’en redirections serveur permanentes, données structurées, hreflang et fraîcheur du build. Une URL de preview utilisée comme baseURL peut contaminer toutes les canoniques ; imposez le domaine de production et contrôlez la sortie déployée.
TL;DR — Hugo construit tout votre site sous forme de fichiers HTML simples avant la première visite. Quand Google arrive, le contenu est déjà présent : aucun JavaScript à attendre. C’est une excellente base SEO, mais « statique » ne signifie pas « optimisé automatiquement » : il faut encore ajouter les canoniques, surveiller les pages de tags générées et se rappeler que les alias Hugo ne sont pas de véritables redirections 301.
Ce qu’est Hugo
Hugo transforme vos contenus Markdown et vos templates en un dossier de pages HTML terminées. Le build s’exécute à l’avance, sur votre ordinateur ou un serveur, puis vous déployez ces fichiers. Google, Bing et les internautes reçoivent donc un HTML complet dès la première requête. Evidence for this claim Hugo generates a static site from source content and templates. Scope: Hugo build output. Confidence: high · Verified: Hugo: Getting started Génération et déploiement restent deux étapes distinctes : aucune modification du contenu, des données, des templates ou de la configuration n’est publique avant un nouveau build et son déploiement. Ce guide suit la documentation Hugo v0.164.x ; vérifiez les détails dans la version que vous utilisez.
C’est l’inverse d’une application JavaScript classique, où le navigateur doit construire la page après son chargement. Avec Hugo, tout est déjà fait. Le générateur est en outre très rapide : la plupart des sites se construisent en moins d’une seconde, même avec des milliers de pages.
Pourquoi cette architecture favorise le SEO
- Le contenu figure dans le HTML brut. Google n’a aucun JavaScript à exécuter pour voir le texte et les liens ; rien ne peut « rater son rendu ».
- Le site est rapide par défaut sur un hébergement bien configuré. Les fichiers HTML simples éliminent une cause fréquente de mauvais Core Web Vitals, sans pour autant garantir les CWV, l’exploration, l’indexation ou le classement. Un hôte lent, des scripts tiers lourds ou un build cassé peuvent toujours nuire au site : contrôlez le résultat déployé au lieu de faire confiance à l’architecture.
- Il y a moins de points de panne. Ni base de données ni plugin susceptible de tomber pendant le crawl.
Le mythe à abandonner immédiatement
Un site Hugo n’offre pas automatiquement un SEO parfait. Une étude portant sur 5 000 URL Hugo a constaté que plus de la moitié n’avaient aucune balise canonique, souvent parce que le thème n’en produisait pas. La fondation statique est solide, mais les bases du SEO on-page restent à votre charge.
Les trois pièges les plus fréquents pour débuter
- Les balises canoniques. Vérifiez dans la source que le thème produit bien
<link rel="canonical">. Beaucoup ne le font pas ; l’onglet Avancé explique comment l’ajouter. - Les pages de tags et de catégories. Hugo en crée automatiquement pour chaque terme. Leur intérêt relève d’un choix éditorial : 200 tags utilisés une fois donnent probablement 200 pages minces à désindexer ou désactiver ; quelques tags répondant à une vraie demande peuvent devenir de bons hubs.
- Les « redirections » qui n’en sont pas. La fonction
aliasesgénère de petites pages HTML avec meta refresh, pas de véritables 301. Evidence for this claim Hugo aliases generate pages that redirect with meta refresh rather than HTTP 301 responses. Scope: Hugo alias behavior. Confidence: high · Verified: Hugo: Aliases C’est important lors d’une migration : vérifiez la réponse réelle de l’hôte plutôt que de vous fier uniquement au frontmatter.
Le point à ne jamais oublier
Un site Hugo est un instantané du dernier build. Modifier un prix, corriger une faute ou publier un article ne change rien pour Google tant que vous n’avez pas reconstruit et redéployé le site. La discipline essentielle consiste donc à faire déclencher un build frais par chaque modification.
Vous cherchez la version technique complète — bug des canoniques et de baseURL,
taxonomies, hreflang, JSON-LD et configuration du <head> prête à copier ?
Passez à l’onglet Avancé.
Evidence for this claim Hugo renders content and templates to static output during its build. Scope: Hugo static site generation. Confidence: high · Verified: Hugo documentationTL;DR — Hugo — documentation actuelle limitée à v0.164.x — pré-rend chaque route en HTML statique lors du build. Le contenu figure donc dans la réponse à la première requête, sans Web Rendering Service ni délai de Wave 2. Cela supprime une classe de risques, mais ne garantit ni de bons Core Web Vitals, ni des canoniques correctes, ni l’exploration, l’indexation ou le classement : templates, hébergement et contenu restent déterminants. Une étude SALT.agency sur 5 000 URL — recherche tierce non revérifiée ici — indique que 53,50 % des sites Hugo n’ont aucune canonique et que 90,96 % n’ont pas de hreflang. Les principaux pièges sont les taxonomies générées automatiquement, les alias en meta refresh plutôt qu’en 301, le partial
schema.htmlen microdonnées plutôt qu’en JSON-LD et le bug debaseURLqui peut envoyer toutes les canoniques vers un domaine de preview. Ne confondez pas ce réglage aveccanonifyURLs, qui réécrit les URL. Sitemap etrobots.txtsont intégrés, mais leurs valeurs par défaut et les indicateursbuildDrafts/buildFuture/buildExpiredexigent une configuration explicite. Configurez correctement le<head>et le build pour conserver cette architecture à faible risque.
Pourquoi Hugo part avec une longueur d’avance : aucune file de rendu
Hugo compile Markdown et templates Go en HTML, CSS et JavaScript statiques lors du
build. Il n’utilise ni base de données, ni rendu serveur par requête, ni JavaScript
client pour afficher le contenu. Evidence for this claim Hugo renders content and templates to static output during its build. Scope: Hugo static site generation. Confidence: high · Verified: Hugo documentation Il est
donc entièrement pré-rendu, contrairement aux SPA React/Vue et aux CMS rendus
côté serveur. Les détails ci-dessous suivent Hugo v0.164.x ; fonctions, valeurs par
défaut et options évoluent. Génération et déploiement sont séparés, et Hugo Pipes ou
les ressources distantes peuvent encore livrer des assets périmés selon leurs clés
de cache et maxAge. Purgez volontairement le cache avec hugo --gc ou les
mécanismes appropriés.
Pour Google, les sites Hugo contournent entièrement la file de rendu. Le pipeline est crawl → rendu → indexation, et le rendu JavaScript constitue une étape séparée et mise en attente : “the page may stay on this queue for a few seconds, but it can take longer than that.” (traduction) « la page peut rester quelques secondes dans cette file, mais cela peut durer davantage ». Les pages Hugo restent dans la première vague, celle du HTML brut. Google a aussi abandonné le rendu dynamique et recommande désormais “server-side rendering, static rendering, or hydration” (traduction) « le rendu côté serveur, le rendu statique ou l’hydratation » ; Hugo produit précisément du rendu statique.
Les performances découlent de la même propriété. Sur un CDN moderne comme Cloudflare Pages ou Netlify, le TTFB peut rester sous environ 50 ms. L’étude SALT.agency de 5 000 URL — tierce et non revérifiée ici — indique une médiane mobile PageSpeed de 94, avec seulement 1,10 % sous 50. Cela élimine une cause fréquente de mauvais CWV, sans garantir CWV, canoniques, codes d’état, exploration, indexation ou classement. Vérifiez la sortie réellement déployée.
Ce que Hugo fournit et ce que vous devez construire
| Intégré — configuration nécessaire | À ajouter |
|---|---|
sitemap.xml — sans changefreq/priority par défaut | Balises canoniques — souvent absentes des thèmes |
Template robots.txt ou /static/robots.txt | Données structurées JSON-LD |
| Partials Open Graph et Twitter Card — à appeler | Stratégie noindex/désactivation des taxonomies |
Partial schema.html — microdonnées, pas JSON-LD | hreflang, même en multilingue |
| Traitement d’images — redimensionnement, WebP, EXIF retiré | Canoniques autoréférentes pour la pagination |
| Mode multilingue et sitemaps par langue | Véritables redirections 301, pas les alias |
Hugo règle donc la mécanique de découverte, mais vous laisse la canonicalisation et les données structurées. C’est justement là que l’étude observe les lacunes de l’écosystème.
Balises canoniques : la principale lacune de l’écosystème
L’échec SEO le plus courant avec Hugo est aussi le plus simple à corriger : selon
l’étude SALT.agency de 5 000 URL, 53,50 % des sites Hugo n’ont aucune balise
canonique. Cette recherche tierce n’a pas été revérifiée ici ; considérez le
chiffre comme directionnel. Le phénomène est plausible : beaucoup de thèmes de
départ n’appellent aucun partial canonique. Inspectez le <head> rendu.
Implémentation standard dans le partial <head> :
<link rel="canonical" href="{{ .Permalink }}" />Avec une surcharge frontmatter pour les pages qui doivent pointer ailleurs :
{{- if isset .Params "canonical" -}}
<link rel="canonical" href="{{ .Params.canonical }}" />
{{- else -}}
<link rel="canonical" href="{{ .Permalink }}" />
{{- end }}Le bug baseURL qui casse silencieusement toutes les canoniques
Le piège est discret, car tout paraît correct en local. .Permalink dépend de
baseURL. Cloudflare Pages, Netlify et les plateformes similaires attribuent une
URL de preview unique à chaque déploiement, par exemple
abc123.yourproject.pages.dev. Si le build de production l’utilise comme
baseURL, toutes les canoniques pointent vers le mauvais domaine, tout comme
les URL Open Graph et les entrées de sitemap.
Passez toujours le domaine réel lors du build :
hugo --minify --baseURL "https://yourdomain.com/"Sur Cloudflare Pages, définissez explicitement la commande de build ou la variable
HUGO_BASEURL. Après chaque changement de configuration, contrôlez la source du
<head> déployé : ce bug peut rester invisible pendant des semaines.
Ne confondez pas ce problème avec canonifyURLs. Cette option convertit
certaines URL relatives en URL absolues lors de la génération. Elle ne définit pas
la politique canonique et ne crée aucune balise <link rel="canonical">.
L’audit du <head> reste indispensable.
Pages de taxonomie : le grand piège SEO de Hugo
Hugo génère automatiquement une page pour chaque terme de taxonomie :
/tags/hugo/, /categories/seo/ et les pages de liste correspondantes. La
génération est automatique, mais leur caractère problématique ne l’est pas :
indexabilité et inclusion dans le sitemap relèvent de vos templates et de votre
configuration. Une longue traîne de tags uniques produit souvent des pages minces
et quasi dupliquées ; prenez une décision explicite parmi trois options :
- Les désactiver complètement si elles ne servent pas de pages d’arrivée :
disableKinds: ['taxonomy', 'term'] - Mettre les pages de termes en noindex tout en les gardant pour la navigation :
{{ if .Data.Singular }} <meta name="robots" content="noindex"> {{ end }} - En faire de vraies pages d’arrivée, avec du contenu dans
_index.mdpour les termes qui répondent à une demande réelle, par exemple un hub utile à/categories/technical-seo/.
Conséquence essentielle : une page noindex n’est pas retirée automatiquement du
sitemap. Hugo ne synchronise pas ces choix. Excluez-la aussi avec
sitemap: { disable: true }, sinon vous soumettez une URL que vous demandez
simultanément à Google de ne pas indexer.
Valeurs par défaut du sitemap et de robots.txt
Hugo génère un sitemap.xml conforme au protocole v0.9 : un fichier pour les
sites monolingues, des sitemaps par langue et un sitemapindex.xml racine pour
les sites multilingues. Evidence for this claim Hugo generates sitemap files and supports configurable sitemap fields, including multilingual sitemap indexes. Scope: Current Hugo sitemap configuration. Confidence: high · Verified: Hugo: Sitemap templates Les valeurs
par défaut omettent toutefois les champs attendus : changeFreq est vide et
priority vaut -1, donc ils disparaissent de la sortie. Hugo tire aussi
lastmod des dates du contenu ; veillez à leur exactitude, car un lastmod
honnête peut aider Google à planifier un nouveau crawl.
Pour robots.txt, activez enableRobotsTXT: true. La sortie par défaut est
permissive — User-agent: * sans interdiction. Le template robots.txt n’a pas
accès aux variables du sitemap : son URL doit être écrite explicitement. Vous pouvez
aussi servir un simple fichier /static/robots.txt avec
enableRobotsTXT: false.
Le sitemap et robots.txt ne reflètent que ce que le build a réellement produit.
Les options buildDrafts, buildFuture et buildExpired décident séparément
si brouillons, contenus futurs et contenus expirés sont inclus. Une configuration
de preview ou de CI héritée par erreur peut publier ou omettre des URL. Fixez ces
valeurs explicitement en production et contrôlez les sorties par langue et type de
page après chaque changement.
Open Graph, Twitter Cards et données structurées
Hugo fournit trois partials intégrés à appeler avec
{{ partial "name.html" . }} : opengraph.html,
twitter_cards.html et schema.html. Deux points sont essentiels :
-
Ils ne s’exécutent que si le thème les appelle. Beaucoup de thèmes n’en utilisent qu’une partie. Ajoutez les autres à
baseof.html. Les Twitter Cards exigent notamment des URL absolues : utilisezabsURL, pasrelURL. -
schema.htmlproduit des microdonnées Schema.org, pas du JSON-LD. C’est une confusion fréquente. Google recommande JSON-LD, que vous devez créer dans un partial personnalisé :<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": {{ .Title | jsonify }}, "datePublished": "{{ .Date.Format "2006-01-02" }}", "dateModified": "{{ .Lastmod.Format "2006-01-02" }}" } </script>Utilisez
jsonifysur les chaînes saisies par les utilisateurs afin que les guillemets et caractères spéciaux ne cassent pas le JSON.
URL, alias et risque de migration
Hugo utilise par défaut des URL « propres » avec barre oblique finale
(/about/). L’option uglyURLs: true produit des chemins de type
/about.html : elle concerne la structure des fichiers, pas l’esthétique. Choisissez
un format et empêchez les deux versions de répondre.
Le vrai danger est le suivant : les alias Hugo ne sont pas des redirections
301. Le champ frontmatter aliases génère un fichier HTML contenant
<meta http-equiv="refresh">, donc une redirection côté client. Cela peut convenir
à une URL de confort, mais pas à une migration où l’autorité doit être transmise
fiablement. Utilisez les règles de la plateforme — _redirects sur Netlify ou
Cloudflare Pages — et disableAliases: true. Hugo contrôle les fichiers générés,
pas la réponse HTTP finale : vérifiez le site déployé avec curl -I. Voir aussi
Migrations de site.
Multilingue et hreflang
Hugo offre un support multilingue approfondi : fichiers suffixés comme
about.en.md/about.fr.md ou répertoires séparés, ainsi que
.AllTranslations et .IsTranslated pour hreflang. Pourtant, l’étude tierce
SALT.agency indique que 90,96 % des sites Hugo n’ont pas de hreflang, y compris
des sites multilingues. Le chiffre est directionnel et illustre une étape manuelle
souvent oubliée. Validez les alternates, canoniques et relations de sitemap dans la
sortie déployée : la structure multilingue ne prouve pas la correction des balises.
{{ range .AllTranslations }}
<link rel="alternate" hreflang="{{ .Lang }}" href="{{ .Permalink }}">
{{ end }}Un conflit connu entre sitemap multilingue et canonique peut toucher la langue principale. Contrôlez tous les sitemaps générés après le build.
Pagination
La pagination par défaut de Hugo n’ajuste pas les canoniques : chaque page paginée peut pointer vers la page 1 et faire désindexer son contenu plus profond. Utilisez des canoniques autoréférentes pour les listes paginées :
{{ if gt $paginator.PageNumber 1 }}
<link rel="canonical" href="{{ .Permalink }}page/{{ $paginator.PageNumber }}/" />
{{ else }}
<link rel="canonical" href="{{ .Permalink }}" />
{{ end }}Google a abandonné rel="prev"/rel="next" vers 2019, mais Bing les
utilise encore pour découvrir la pagination. Ajoutez-les pour couvrir plusieurs
moteurs :
{{ if .Paginator.HasPrev }}
<link rel="prev" href="{{ .Paginator.Prev.URL | absURL }}" />
{{ end }}
{{ if .Paginator.HasNext }}
<link rel="next" href="{{ .Paginator.Next.URL | absURL }}" />
{{ end }}Images et performances
Le traitement d’images intégré prend en charge AVIF, BMP, GIF, JPEG, PNG, TIFF et
WebP — sortie WebP depuis v0.83.0 — avec Resize, Crop, Fill, Fit et Filter. Il suffit
pour produire un srcset responsive lors du build. Attention : les métadonnées
EXIF sont supprimées pendant la transformation. Le texte alternatif et la légende
doivent donc provenir des attributs du template, jamais des données intégrées.
La performance est un point fort de Hugo, mais les ajouts après le build peuvent
l’annuler : scripts tiers, images non optimisées et absence de minification. Activez
hugo --minify ou [minify] minifyOutput = true, puis auditez les scripts
d’analytics et les embeds : ce sont eux, et non Hugo, qui dégradent souvent les
scores d’un site statique.
Choisir un thème adapté au SEO
Comme le thème porte une grande partie du SEO, auditez-le avant de vous engager. PaperMod fournit Open Graph, Twitter Cards et Schema.org ; Congo est aussi bien maintenu ; le module HugoMods SEO peut ajouter les partials manquants. Dans la source rendue d’un article réel, cherchez une canonique autoréférente, une méta-description, Open Graph, une stratégie noindex ou désactivation des taxonomies et du JSON-LD. Sinon, vous héritez du problème des 53,50 %.
Place de Hugo dans l’écosystème
Hugo fait partie des six générateurs du guide Générateurs de sites statiques. Ses proches voisins sont Jekyll et Eleventy — eux aussi sans JavaScript imposé —, ainsi que Gatsby et Astro, fondés sur des composants. Pour comprendre la manière dont Google traite JavaScript et pourquoi la sortie statique est la solution la moins risquée, consultez le guide parent SEO JavaScript.
Résumé IA
Version condensée de l’onglet Avancé :
- Hugo est un générateur de sites statiques écrit en Go — documentation ici limitée à v0.164.x — qui compile Markdown et templates en HTML terminé lors du build. Le contenu figure dans le HTML brut dès la première requête, sans file de rendu JavaScript ni délai de Wave 2. Google recommande explicitement le rendu statique. Génération et déploiement sont séparés ; les caches de ressources peuvent encore servir des assets périmés.
- La sortie statique ne garantit aucun résultat. Elle supprime une cause de mauvais CWV et d’échec de rendu, mais templates, hébergement et contenu décident encore des canoniques, de l’exploration, de l’indexation et du classement. Une étude SALT.agency de 5 000 URL — tierce, non revérifiée ici — indique une médiane PageSpeed mobile de 94.
- « Statique » ne signifie pas « optimisé ». La même étude rapporte 53,50 % sans canonique et 90,96 % sans hreflang, résultat cohérent avec des thèmes qui omettent ces deux éléments.
- Canoniques : ajoutez
<link rel="canonical" href="{{ .Permalink }}">avec surcharge frontmatter. Une URL de preview utilisée commebaseURLpeut envoyer toutes les canoniques vers le mauvais domaine ; imposez--baseURL https://yourdomain.com/.canonifyURLsne règle pas les canoniques. - Les pages de taxonomie sont générées pour chaque terme : désactivez-les, mettez-les en noindex ou enrichissez-les. Le noindex ne les retire pas du sitemap.
- Les alias sont des meta refresh, pas des 301s. Pour une migration, utilisez les
redirections de la plateforme et
disableAliases: true, puis contrôlez l’hôte. schema.htmlproduit des microdonnées, pas du JSON-LD. Créez un partial.- Sitemap et robots.txt sont intégrés, mais les valeurs par défaut omettent
changefreq/priority. Les optionsbuildDrafts/buildFuture/buildExpireddoivent être explicitées et unlastmodexact doit être défini. - hreflang se génère avec
.AllTranslations, mais validez balises et sitemaps. - La pagination exige des canoniques autoréférentes et
rel=prev/nextpour Bing. - Le piège universel reste la fraîcheur du build : le site reflète le dernier build déployé. Reliez chaque modification à une reconstruction et un déploiement.
Documentation officielle
Documentation de première main de Hugo et des moteurs de recherche.
Hugo
- Template de sitemap et configuration du sitemap — sortie générée et réglage des valeurs par défaut.
- Template robots.txt —
enableRobotsTXT, ordre de recherche et fichier statique. - Templates intégrés — partials
opengraph.html,twitter_cards.htmletschema.html. - Gestion des URL — URL propres ou « ugly » et fonctionnement de
aliasesen meta refresh. - Mode multilingue — méthodes,
.AllTranslationset sitemaps par langue. - Traitement d’images — formats, méthodes, WebP et suppression EXIF.
- Configuration de la minification —
minifyOutputet options par format. - Tous les réglages —
baseURL,canonifyURLset indicateursbuildDrafts/buildFuture/buildExpired. - Taxonomies — configuration et génération des pages.
- Caches de fichiers — clés,
maxAgeet--gc. - Introduction — séparation entre build et déploiement.
- Comprendre les bases du SEO JavaScript — les deux vagues de rendu évitées par Hugo.
- Rendu dynamique — obsolète — recommandation du rendu serveur, statique ou de l’hydratation.
- Core Web Vitals — seuils LCP ≤ 2,5 s, INP ≤ 200ms et CLS ≤ 0,1.
Citations des sources
Déclarations publiques de Google et positionnement de Hugo.
Google — le rendu statique est la voie recommandée
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines… Instead, we recommend that you use server-side rendering, static rendering, or hydration as a solution.” (traduction) « Le rendu dynamique constituait un contournement, pas une solution durable aux problèmes posés par le contenu généré en JavaScript dans les moteurs… Nous recommandons plutôt le rendu côté serveur, le rendu statique ou l’hydratation. » — Google Search Central, documentation sur le rendu dynamique. Hugo produit du rendu statique. Source
Google — la file de rendu évitée par Hugo
- “The page may stay on this queue for a few seconds, but it can take longer than that.” (traduction) « La page peut rester quelques secondes dans cette file, mais cela peut durer davantage. » — Google Search Central, bases du SEO JavaScript. Les pages Hugo pré-rendues n’entrent pas dans cette file. Source
John Mueller, Google Search Relations — un outil statique ne fait pas le SEO à votre place
- “AI tools can build websites fast, but they won’t set up your canonicals, sitemaps, or robots.txt unless you tell them to.” (traduction) « Les outils d’IA peuvent créer rapidement des sites, mais ils ne configureront ni canoniques, ni sitemaps, ni robots.txt sans instruction. » — la même logique vaut pour un thème Hugo : le framework est rapide, mais les canoniques restent à votre charge. Article
Hugo — la vitesse
- Hugo se présente comme “the world’s fastest framework for building websites” (traduction) « le framework le plus rapide au monde pour construire des sites web » : un avantage de vitesse de build important à grande échelle. Source
Erreurs SEO à éviter avec Hugo
Des erreurs concrètes rencontrées lors de la mise en ligne d’un site Hugo, avec leur correction.
Faire confiance au thème pour ajouter une balise canonique
Supposer que « site statique » signifie « SEO pris en charge » est l’erreur Hugo la
plus fréquente. Pourquoi c’est faux : l’étude SALT.agency sur 5 000 URL indique
que 53,50 % des sites Hugo ne produisent aucun <link rel="canonical">, le thème
n’ayant jamais ajouté le partial. Que faire : inspectez la source d’une vraie
page et ajoutez vous-même le partial s’il manque ; le template exact figure dans
l’onglet Avancé.
Déployer la commande de build autodétectée sur une plateforme d’URL de preview
Pourquoi c’est faux : Cloudflare Pages et Netlify attribuent une URL de preview
unique à chaque déploiement. Si la production l’hérite comme baseURL,
.Permalink contamine toutes les canoniques, les URL Open Graph et le sitemap,
alors que hugo server semble correct. Que faire : passez explicitement
--baseURL "https://yourdomain.com/" ou définissez HUGO_BASEURL, puis
contrôlez le <head> déployé après chaque changement.
Utiliser aliases pour une migration de site
Pourquoi c’est faux : aliases génère une page HTML avec
<meta http-equiv="refresh">, pas une 301 serveur. Une migration de centaines
d’URL exige une transmission fiable de l’autorité. Que faire : configurez les
redirections au niveau de la plateforme — _redirects sur Netlify/Cloudflare
Pages ou règles de l’hôte — et activez disableAliases: true pour éviter les
fichiers concurrents.
Supposer que le partial schema.html intégré fournit du JSON-LD
Pourquoi c’est faux : schema.html produit des microdonnées Schema.org,
pas le JSON-LD recommandé par Google. Que faire : créez un petit partial qui
émet <script type="application/ld+json"> et passez les chaînes fournies par
les utilisateurs dans jsonify.
Laisser les pages de taxonomie actives sans stratégie
Pourquoi c’est faux : Hugo crée une page pour chaque tag et catégorie. Une
longue traîne de termes uniques devient un ensemble de pages minces et quasi
dupliquées. Que faire : choisissez dès le départ entre désactivation
(disableKinds: ['taxonomy', 'term']), noindex ou enrichissement des quelques
termes répondant à une vraie demande.
Mettre les taxonomies en noindex tout en les laissant dans le sitemap
Pourquoi c’est faux : Hugo ne synchronise pas ces deux décisions. Une page
noindex peut rester dans sitemap.xml. Que faire : ajoutez aussi
sitemap: { disable: true } à toute taxonomie mise en noindex.
Problèmes SEO courants avec Hugo
Diagnostic par symptôme des problèmes rencontrés après la mise en ligne.
La source ne contient aucune balise canonique
Cause : le thème n’appelle aucun partial canonique dans baseof.html.
Correction : ajoutez <link rel="canonical" href="{{ .Permalink }}" /> avec
une surcharge frontmatter. Vérifiez avec le vérificateur de canonique
ou relancez grep -rL 'rel="canonical"' public --include="*.html" : le résultat
doit être vide.
La canonique existe, mais pointe vers .pages.dev ou localhost
Cause : le build de production a utilisé une URL de preview comme baseURL,
dont dérive .Permalink. Correction : reconstruisez avec
hugo --minify --baseURL "https://yourdomain.com/" ou définissez
HUGO_BASEURL, redéployez, puis contrôlez avec le
vérificateur de canonique ou
grep -rho 'rel="canonical" href="[^"]*"' public | sort | uniq -c que seul
le domaine réel apparaît.
Après une migration, les anciennes URL clignotent au lieu de rediriger proprement
Cause : la migration utilise aliases, qui génère une page meta refresh et
non une 301 serveur. Correction : ajoutez des règles au niveau de la plateforme,
par exemple _redirects, activez disableAliases: true, puis confirmez avec le
vérificateur de redirection : vous cherchez une 301
en un seul saut, pas une réponse 200 avec balise refresh.
Search Console signale des taxonomies dupliquées ou minces
Cause : Hugo a généré une page /tags/… ou /categories/… pour
chaque terme sans stratégie éditoriale. Correction : désactivez le type avec
disableKinds: ['taxonomy', 'term'], gardez
les pages en navigation avec noindex ou enrichissez les quelques termes utiles.
Retirez aussi les URL concernées du sitemap : Hugo ne le fait pas pour vous.
Erreurs hreflang — « aucune balise de retour » ou alternates manquants
Cause : .AllTranslations n’a jamais été relié au partial <head>.
L’étude SALT.agency rapporte 90,96 % de sites Hugo sans hreflang. Correction :
ajoutez {{ range .AllTranslations }}<link rel="alternate" hreflang="{{ .Lang }}" href="{{ .Permalink }}">{{ end }},
reconstruisez et vérifiez les balises de retour dans Search Console.
Les modifications publiées dans Git ou le CMS n’apparaissent jamais en ligne
Cause : Hugo produit un instantané ; rien ne change avant reconstruction et redéploiement. Un webhook CI/CMS cassé laisse les commits fusionnés sans build. Correction : cherchez le commit dans le journal de déploiement, contrôlez le webhook et déclenchez un build manuel pour tester le pipeline.
Checklist SEO pour Hugo
Contrôles essentiels pour un site Hugo ou un thème en cours d’audit :
- Balise canonique présente dans la source rendue de chaque page (
<link rel="canonical">) ; ne présumez pas que le thème l’ajoute. -
baseURLcorrespond au domaine de production dans le build déployé ; cherchez toute fuite.pages.devou preview. - Sitemap généré et soumis dans Google Search Console et Bing Webmaster Tools, avec un
lastmodexact. - robots.txt présent — template ou
/static/— sans blocage du CSS, du JS ou des contenus à indexer. - Stratégie de taxonomie définie : désactivation, noindex ou pages d’arrivée enrichies.
- Pages noindex retirées du sitemap, car Hugo ne synchronise pas automatiquement.
- Partials Open Graph et Twitter Card appelés dans
baseof.htmlavec des URL absolues. - JSON-LD ajouté dans un partial personnalisé ;
schema.htmlne fournit que des microdonnées. - hreflang relié à
.AllTranslationssur les sites multilingues. - Pages paginées autoréférentes, avec
rel=prev/nextpour Bing. - Alias et redirections : véritables 301s de plateforme pour les migrations, avec
disableAliases: true. - Minification active —
--minify— et scripts tiers/images audités pour les CWV. - Chaque modification déclenche build et déploiement ; un site statique ne montre que son dernier build.
Les modèles mentaux
1. Le statique règle le rendu, pas la canonicalisation. Hugo supprime gratuitement le risque de file de rendu, mais ne décide rien pour le contenu dupliqué, les canoniques ou les données structurées. Concentrez l’effort là où le framework n’aide pas.
2. Le thème est votre surface SEO.
Demander si un site Hugo possède canoniques, balises OG ou JSON-LD revient à demander
si le thème les produit. Auditez le <head> rendu d’une vraie page ; le taux de
53,50 % sans canonique est une statistique de thèmes.
3. Temps de build contre temps serveur.
baseURL, canoniques, sitemap et contenu sont figés lors du build pour tout le
monde. Une mauvaise baseURL contamine toutes les URL ; une modification de
contenu n’atteint personne avant le build suivant.
4. « Cela ressemble à une redirection » ne signifie pas « c’est une 301 ». Les alias Hugo sont des pages meta refresh. Ils conviennent à de petites URL de confort, pas à une migration : choisissez des 301 de plateforme pour les déplacements.
5. « Généré automatiquement » ne signifie pas « souhaité ». Pages de termes et champs vides de sitemap apparaissent même sans utilité. Traitez la sortie automatique comme un brouillon à élaguer, pas comme un résultat fini.
Hugo SEO — aide-mémoire
Intégré ou à votre charge
| Sujet | Valeur par défaut de Hugo | Votre action |
|---|---|---|
| Rendu | HTML statique, aucune file JS | Rien : c’est le gain gratuit |
| Sitemap | sitemap.xml automatique, changefreq/priority vides | lastmod exact ; exclusion des URL noindex |
| robots.txt | Permissif avec enableRobotsTXT | Template ou /static/ ; URL du sitemap écrite en dur |
| Canonique | Souvent absente, selon le thème | Ajouter <link rel="canonical" href="{{ .Permalink }}"> |
| Données structurées | schema.html = microdonnées | Construire un partial JSON-LD |
| OG / Twitter | Partials intégrés | Les appeler dans baseof.html avec absURL |
| Taxonomies | Générées pour chaque terme | Désactiver, noindex ou enrichir |
| Redirections | aliases = meta refresh | 301s plateforme + disableAliases: true |
| hreflang | .AllTranslations disponible | Boucler dessus dans le <head> |
| Pagination | Canoniques non ajustées | Autoréférence ; rel=prev/next pour Bing |
Correction de baseURL — à ne pas oublier
hugo --minify --baseURL "https://yourdomain.com/"Une URL de preview *.pages.dev ou Netlify utilisée comme baseURL
contamine silencieusement canoniques, URL OG et sitemap.
Repères de l’étude SALT.agency — 5 000 URL Hugo, recherche tierce non revérifiée ici
- 53,50 % n’ont aucune canonique.
- 90,96 % n’ont pas de hreflang.
- PageSpeed mobile médian : 94 ; seulement 1,10 % sous 50.
- Aucun chiffre ne garantit votre build : vérifiez votre sortie déployée.
Mythe → réalité
- « Hugo offre un SEO parfait » → la moitié des sites n’ont pas de canonique.
- « Les alias sont des 301s » → ce sont des meta refresh.
- «
uglyURLsrend le site laid » → l’option choisit/page.htmlplutôt que/page/. - «
schema.htmlfournit du JSON-LD » → il fournit des microdonnées. - «
rel=prev/nextest mort » → Google l’a abandonné, mais Bing l’utilise encore.
Construire avec la bonne baseURL — correction prioritaire
Le bug SEO le plus dommageable est un build de production utilisant une URL de
preview comme baseURL et contaminant toutes les canoniques. Passez toujours le
domaine réel explicitement.
macOS / Linux
# Production build — minified, correct canonical domain
hugo --minify --baseURL "https://yourdomain.com/"Windows — PowerShell
hugo --minify --baseURL "https://yourdomain.com/"Sur Cloudflare Pages, utilisez cette commande de build ou définissez
HUGO_BASEURL dans l’environnement, plutôt que de dépendre de l’autodétection.
Auditer les canoniques manquantes dans le site construit
Après le build, la sortie se trouve dans public/. Cette recherche liste les
pages HTML sans canonique et détecte localement le problème des 53,50 %.
macOS / Linux
# List built HTML files with NO rel="canonical"
grep -rL 'rel="canonical"' public --include="*.html"Windows — PowerShell
# List built HTML files with NO rel="canonical"
Get-ChildItem -Recurse public -Filter *.html |
Where-Object { -not (Select-String -Path $_.FullName -Pattern 'rel="canonical"' -Quiet) } |
Select-Object -ExpandProperty FullNameConfirmer que les canoniques utilisent le bon hôte
Contrôle rapide pour vérifier qu’aucun domaine de preview n’a fuité.
macOS / Linux
# Show every canonical href and how many times each host appears
grep -rho 'rel="canonical" href="[^"]*"' public | sort | uniq -c | sort -rnWindows — PowerShell
Select-String -Path public\*.html -Pattern 'rel="canonical" href="([^"]*)"' -Recurse |
ForEach-Object { $_.Matches.Groups[1].Value } | Group-Object | Sort-Object Count -DescendingSi la sortie contient *.pages.dev, une preview Netlify ou localhost,
baseURL était incorrecte lors du build. Reconstruisez avec la commande ci-dessus.
Outils pour le SEO avec Hugo
- CLI Hugo —
hugo --minify --baseURL …: contrôle au build de la minification, debaseURLet dedisableKinds. - Afficher la source / inspection d’URL GSC : confirmer canoniques, métadonnées et JSON-LD dans le HTML. Sur un site statique, la source fait foi.
- Google Search Console et Bing Webmaster Tools : soumettre le sitemap, surveiller l’indexation et confirmer la pagination
rel=prev/nextdans Bing. - PageSpeed Insights / CrUX : mesurer l’avantage du CDN statique et les régressions CWV causées par les scripts tiers.
- Crawlers et audits de site : Ahrefs Site Audit ou Screaming Frog pour détecter canoniques manquantes, taxonomies minces et alias meta refresh à grande échelle.
- Module HugoMods SEO : ajouter canoniques, OG et JSON-LD à un thème incomplet.
- Audit
grepde l’onglet Scripts : moyen le plus rapide de bloquer les canoniques manquantes et les mauvaisesbaseURLavant livraison.
Prouver que les corrections Hugo sont réellement en ligne
Tests réussite/échec permettant de confirmer le déploiement d’une correction, pas seulement la modification d’un template.
Les canoniques sont présentes et utilisent le bon domaine
Test : passez les pages clés du domaine de production — accueil, article et
taxonomie — dans le vérificateur de canonique, ou lancez
localement grep -rho 'rel="canonical" href="[^"]*"' public | sort | uniq -c.
Résultat attendu : exactement une canonique autoréférente par page, sur le
domaine réel. Interprétation d’un échec : absence = partial manquant ;
.pages.dev/localhost = mauvaise baseURL. Fenêtre : immédiatement
après chaque déploiement. Déclencheur de rollback : toute canonique hors du
domaine de production signifie que le dernier build utilisait une mauvaise
baseURL et exige un nouveau build avant toute autre action.
Le sitemap est valide et ne contient aucune URL noindex
Test : soumettez sitemap.xml au
validateur de sitemap après chaque changement de
taxonomie ou de noindex. Résultat attendu : XML valide et URL toutes indexables,
sans noindex.
Interprétation d’un échec : une URL noindex dans le sitemap signifie que
sitemap: { disable: true } a été oublié. Fenêtre : immédiatement après le
build, puis chaque semaine pendant l’élagage. Déclencheur de rollback : toute
URL noindex encore soumise.
Les anciennes URL renvoient une vraie 301, pas un meta refresh
Test : utilisez le vérificateur de redirection
ou curl -I <old-url> sur un échantillon d’anciennes URL. Résultat attendu :
une réponse 301 ou 308 en un saut vers la nouvelle URL, sans page 200
intermédiaire. Interprétation d’un échec : un 200 avec redirection indique que la
migration dépend encore de aliases. Fenêtre : à la bascule, puis environ une
semaine plus tard. Déclencheur de rollback : toute ancienne URL encore servie en
200/meta refresh.
Le JSON-LD est valide — si vous avez ajouté le partial personnalisé
Test : passez une page rendue dans le test des résultats enrichis de Google ou
le validateur de schéma. Résultat attendu : le type
visé, par exemple Article, se parse sans erreur de champ obligatoire.
Interprétation d’un échec : les erreurs viennent souvent d’une valeur non échappée
qui n’est pas passée dans jsonify ou d’une mauvaise variable Hugo. Fenêtre :
immédiatement, puis après chaque mise à jour du thème ou du <head>.
Déclencheur de rollback : apparition d’erreurs de schéma jusque-là absentes.
Testez vos connaissances : SEO avec Hugo
Cinq questions rapides sur ce que Hugo prend en charge et ce qui reste à votre charge. Choisissez une réponse, puis vérifiez.
Ressources utiles
Mes articles connexes
- SEO JavaScript : guide définitif — rendu, parité du DOM et raison pour laquelle le pré-rendu statique est la solution la moins risquée.
- Guide du SEO technique pour débutants — place de l’architecture de rendu et de la canonicalisation.
Mes conférences
- Fonctionnement de la recherche sur SlideShare — parcours du crawl, du rendu, de l’indexation et du classement. Avertissement habituel : “This is my understanding of systems… not going to be 100% complete or accurate.” (traduction) « Il s’agit de ma compréhension des systèmes ; elle ne sera pas complète ni exacte à 100 %. »
Ailleurs dans le secteur
- Documentation Hugo — référence canonique sur sitemap, robots.txt, partials, multilingue et images.
- SALT.agency — données de benchmark SEO Hugo — étude de 5 000 URL à l’origine des chiffres 53,50 % et 90,96 %.
- CloudCannon — bonnes pratiques SEO Hugo — guide sous forme de checklist.
- Module HugoMods SEO — partials canoniques, OG et JSON-LD pour les thèmes incomplets.
- Google Search Central — bases du SEO JavaScript — processus de rendu en deux vagues évité par Hugo.
- Mueller sur le code assisté par IA et les bases SEO — un outil rapide ne configure pas canoniques, sitemaps et robots.txt à votre place.
Journal des modifications
Mis à jour le 21 août 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.