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.

Première publication : 26 juin 2026 · Dernière mise à jour : 21 août 2026 · Advanced
Langues
1 indice probant sur cette page

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 — 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.html en microdonnées plutôt qu’en JSON-LD et le bug de baseURL qui peut envoyer toutes les canoniques vers un domaine de preview. Ne confondez pas ce réglage avec canonifyURLs, qui réécrit les URL. Sitemap et robots.txt sont intégrés, mais leurs valeurs par défaut et les indicateurs buildDrafts/buildFuture/buildExpired exigent une configuration explicite. Configurez correctement le <head> et le build pour conserver cette architecture à faible risque.

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

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éfautBalises canoniques — souvent absentes des thèmes
Template robots.txt ou /static/robots.txtDonnées structurées JSON-LD
Partials Open Graph et Twitter Card — à appelerStratégie noindex/désactivation des taxonomies
Partial schema.htmlmicrodonnées, pas JSON-LDhreflang, même en multilingue
Traitement d’images — redimensionnement, WebP, EXIF retiréCanoniques autoréférentes pour la pagination
Mode multilingue et sitemaps par langueVé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 :

  1. Les désactiver complètement si elles ne servent pas de pages d’arrivée :
    disableKinds: ['taxonomy', 'term']
  2. Mettre les pages de termes en noindex tout en les gardant pour la navigation :
    {{ if .Data.Singular }}
      <meta name="robots" content="noindex">
    {{ end }}
  3. En faire de vraies pages d’arrivée, avec du contenu dans _index.md pour 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 : utilisez absURL, pas relURL.

  • schema.html produit 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 jsonify sur 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.

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

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.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.