HugoのSEO

Hugoはビルド時に静的HTMLを出力し、初回取得のraw HTMLにコンテンツを含めます。ただしCore Web Vitalsやランキングは自動的に保証されず、canonical、taxonomyの重複、aliasesと301の違い、baseURLのプレビュードメイン問題を設定する必要があります。

初回公開:2026年6月26日 · 最終更新:2026年8月20日 · Advanced
言語
このページには証拠シグナルが1件あります

HugoはMarkdownをビルド時に完成した静的HTMLへ変換するため、最初の取得時点でコンテンツがraw HTMLにあり、JavaScriptレンダリングキューを待ちません。ただし静的出力だけでCWV、canonical、クロール可能性、インデックス登録、ランキングは保証されません。Hugoの作業はcanonical、taxonomy、aliases、schema.html、baseURL、sitemap、robots.txt、hreflang、デプロイ後の出力を確認することです。

TL;DR — Hugo(現行文書はv0.164.xを対象)は、ビルド時にすべてのルートを静的HTMLへ事前レンダリングするため、最初のクローラーリクエストより前にレスポンスへコンテンツが入ります。Web Rendering ServiceもWave 2の遅延もありません。これでリスクの大きな分類を1つ除けますが、良好なCore Web Vitals、正しいcanonical、クロール可能性、インデックス登録、ランキングが自動的に保証されるわけではありません。テンプレート、ホスティング、コンテンツに依存するため、デプロイ後の出力を確認してください。SALT.agencyの5 000 URLのベンチマーク(第三者研究で、このパスでは独立再検証していません)では、Hugoサイトの53,50 %にcanonicalタグがなく90,96 %にhreflangがありませんでした。どちらも見落としやすいという実態と方向性が一致します。Hugoの大きな落とし穴はtaxonomyページ(自動生成され、問題かどうかは自分で判断する)、aliases(meta refreshで、301ではないため移行の危険要因。実際のホスト応答を確認)、schema.html partial(JSON-LDではなくmicrodata)、そしてすべてのcanonicalを誤ったホストへ向け得る baseURLのプレビュー用ドメインバグ です。これは別のURL書き換え設定である canonifyURLs と混同しないでください。Sitemapと robots.txt は組み込みですが、デフォルトと、ビルド対象を決める buildDrafts/buildFuture/buildExpired フラグは明示的に調整する必要があります。<head> とビルド設定を正しくすれば、Hugoは出荷しやすい低リスクのアーキテクチャの1つです。

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

Hugoが先行できる理由:レンダリングキューがない

Hugoはビルド時にMarkdownとGoテンプレートを純粋な静的HTML、CSS、JSへ変換します。データベースも、リクエストごとのサーバーサイドレンダリングも、コンテンツを表示するためのクライアント側JavaScriptもありません。 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 そのためHugoは、JSレンダリングのSPA(React、Vue)やサーバーレンダリングのCMS(WordPress、Drupal)とは異なる、完全事前レンダリングのカテゴリーに入ります。以下はHugo v0.164.xの文書に基づきます。テンプレート関数、デフォルト、設定オプションはバージョンで変わるため、実際に実行するバイナリで再確認してください。生成とデプロイも別手順です。ビルドはディスク上に出力を作りますが、実際にデプロイされるまで訪問者には届きません。Hugo Pipesやリモートリソースを使う場合は、キャッシュキーと maxAge の設定により、デプロイ後も古いアセットが配信されることがあります。hugo --gc またはキャッシュバスターの削除で、意図的にキャッシュを更新してください。

Googleに限って言えば、Hugoサイトはレンダリングキューを完全に回避します。Googleの処理はcrawl → render → indexで、JavaScriptのレンダリングは別のキュー処理です。“the page may stay on this queue for a few seconds, but it can take longer than that.” (翻訳)「ページはこのキューに数秒とどまることがありますが、それより長くかかる場合があります」。Hugoページはそのキューに入りません。コンテンツはWave 1のraw HTML取得に存在します。Googleは動的レンダリングを回避策として明示的に廃止し、現在は “server-side rendering, static rendering, or hydration” (翻訳)「サーバーサイドレンダリング、静的レンダリング、またはハイドレーション」を推奨しています。HugoはGoogleが直接挙げる静的レンダリングを生成します。

この性能も同じ性質から生まれます。最新のCDN(Cloudflare Pages、Netlify)では、HugoのTTFBは約50 ms未満になり得るため、LCPの下限を低くできます。SALT.agencyの5 000 Hugo URLのベンチマーク(第三者研究で、このパスでは独立再検証していません)では、モバイルPageSpeedの中央値は94で、50未満は1,10 %だけでした。高速CDN上の静的HTMLはCore Web Vitalsが悪化する一般的な原因を1つ除きますが、アーキテクチャだけで良好なCWV、正しいcanonical/status code、クロール可能性、インデックス登録、ランキングを保証するわけではありません。テンプレート、ホスティング設定、コンテンツに依存するため、フレームワークがやってくれたと決めつけずデプロイ後の出力を確認してください。

Hugoが提供するものと、自分で構築するもの

組み込み(設定は必要)追加するもの
sitemap.xml(デフォルトでは changefreq/priority を省略)canonicalタグ(多くのテーマは省略)
robots.txt テンプレート(または /static/robots.txtJSON-LD構造化データ
Open Graph + Twitter Card partial(呼び出しが必要taxonomyのnoindex/無効化戦略
schema.html partial — microdataであり、JSON-LDではないhreflang(多言語サイトでも必要)
画像処理(resize、WebP、EXIF除去)ページ分割ページの自己canonical
多言語モード + 言語別sitemap本物の301リダイレクト(aliasesではない)

この表のパターンは明快です。Hugoは発見のための仕組みを標準で解決しますが、canonical化と構造化データは自分に残します。ベンチマークがエコシステムの失敗を示すのは、まさにそこです。

Canonicalタグ — エコシステム最大の空白

最も一般的で、最も直しやすいHugo SEOの失敗は、SALT.agencyによる5 000 URLの調査で、Hugoサイトの53,50 %にcanonicalタグがまったくなかったことです。第三者研究で、このパスでは独立再検証していないため、数字は権威ある確定値ではなく方向性として扱ってください。それでも実際の傾向とは一致します。人気のスターターテーマの多くはcanonical partialを出力しないため、どちらかを想定せず自分のテーマのレンダリング済み <head> を確認してください。

あなたの <head> partialに置く標準的な実装:

<link rel="canonical" href="{{ .Permalink }}" />

個別ページが別の場所を指せるよう、front matterで上書きする場合:

{{- if isset .Params "canonical" -}}
  <link rel="canonical" href="{{ .Params.canonical }}" />
{{- else -}}
  <link rel="canonical" href="{{ .Permalink }}" />
{{- end }}

すべてのcanonicalを静かに壊す baseURL バグ

ここが落とし穴です。ローカルではすべて正常に見えるため、厄介です。.PermalinkbaseURL 設定から作られます。Cloudflare Pages、Netlifyなどのプラットフォームは、デプロイごとに固有のプレビューURLabc123.yourproject.pages.dev)を割り当てます。本番ビルドがそのプレビューURLを baseURL として実行されると、サイト上のすべてのcanonicalタグが誤ったドメインを指します。Open Graph URLとsitemapのエントリーも同じです。

修正は、ビルド時に必ず本番ドメインを渡すことです:

hugo --minify --baseURL "https://yourdomain.com/"

Cloudflare Pagesでは、自動検出に任せずビルドコマンドを明示するか、環境変数に HUGO_BASEURL を設定します。設定を変えるたびにデプロイ後の <head> ソースを抜き打ち確認してください。この種のバグは数週間隠れます。

これを canonifyURLs と混同しないでください。 この設定オプションは、生成時に対象となる相対URLを絶対URLへ書き換えるものです。URL書き換えの設定であり、canonicalタグの方針ではありません。オン・オフを切り替えても <link rel="canonical"> が存在するか、正しいかは変わりません。canonicalタグそのものが存在し正しいことを確認する唯一の方法は、<head> の出力を監査することです。

Taxonomyページ — Hugo最大のSEO落とし穴

Hugoは設定されたtaxonomy用語ごとにページを自動生成します。/tags/hugo//categories/seo/、さらに各用語の一覧ページです。生成は自動ですが、結果が問題かどうかは自動では決まりません。taxonomyページのインデックス可能性とsitemap掲載はテンプレートと設定が決めることで、重複コンテンツの自動失敗ではありません。実際には、使い捨てタグの長い末尾が薄い類似ページになり、クロールバジェットを薄めることがあります。デフォルトを放置せず明示的に決める価値があります。選択肢は3つです:

  1. ランディングページとして使わないなら完全に無効化する:
    disableKinds: ['taxonomy', 'term']
  2. ナビゲーション用に残しつつ、用語ページをnoindexにする:
    {{ if .Data.Singular }}
      <meta name="robots" content="noindex">
    {{ end }}
  3. 本物のランディングページとして投資する。 _index.md で本文を追加し、実際の検索需要がある用語(例:/categories/technical-seo/)を役立つハブにする。

重要な後続作業が1つあります。noindexにしたページはsitemapから自動削除されません。 Hugoは同期してくれないため、taxonomyページをnoindexにするならsitemapからも除外してください(ページ単位の sitemap: { disable: true })。そうしないと、インデックスしないよう指示しながら同じURLを送信することになります。

Sitemapとrobots.txtのデフォルト

Hugoはプロトコルv0.9に準拠した sitemap.xml を自動生成します。単一言語サイトには1ファイル、多言語サイトには言語別sitemapとルートの sitemapindex.xml があります。 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 ただし、デフォルトでは期待されるフィールドが省略されますchangeFreq は空で、priority-1 であり、設定しない限り出力から落ちます。さらに重要なのは、Hugoがコンテンツの日付から lastmod を出力することです。正確な日付にしてください。正直な lastmod は、Googleが再クロールのスケジュールに実際に使う数少ないsitemapシグナルの1つです。

robots.txt を使うには enableRobotsTXT: true を設定します(デフォルト出力は許可的で、User-agent: * とdisallowなしです)。Hugoのテンプレート言語でテンプレート化できますが、robots.txtテンプレートはsitemap変数にアクセスできません。sitemap URLをハードコードする必要があります。代替は、プレーンな /static/robots.txt ファイルを置き、enableRobotsTXT: false を設定する方法です。

Sitemapとrobotsの出力は、その実行でHugoが実際にビルドしたコンテンツだけを反映します。何がビルドされるかは、draft、将来日付、期限切れコンテンツを含めるかどうかを個別に決める buildDraftsbuildFuturebuildExpired フラグで制御されます。プレビューまたはCI設定を本番ビルドが誤って引き継ぐと、意図しないURLを公開したり、逆に省略したりします。ローカルやプレビューのデフォルトに頼らず、本番ビルドでフラグを明示し、設定変更後は言語とページ種別ごとに生成されたsitemapとrobots出力を確認してください。組み込みテンプレートがサイトの必要なケースをすべて扱うとは限りません。

Open Graph、Twitter Cards、構造化データ

Hugoには、{{ partial "name.html" . }} で呼び出す3つの組み込みpartialがあります。opengraph.htmltwitter_cards.htmlschema.html です。知っておくべき点は2つあります:

  • テーマが呼び出さない限り、partialは呼び出されません。 多くのテーマは3つの一部だけを接続しています。baseof.html に不足しているものを追加してください。特にTwitter Cardsには絶対URLが必要なので、absURL を使い、relURL は使わないでください。

  • schema.html はSchema.orgのmicrodataを出力し、JSON-LDではありません。 これはHugo SEOで最も一般的な誤解です。JSON-LDはGoogleが推奨する形式であり、custom partialとして自分で構築する必要があります:

    <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>

    (ユーザー由来の文字列には jsonify を使い、引用符や特殊文字がJSONを壊さないようにします。)

URL、aliases、移行の危険

Hugoは末尾スラッシュ付きの「きれいなURL」(/about/)をデフォルトにします。紛らわしい名前の uglyURLs: true/about.html 型のパスを生成します。これは美観ではなくファイル構造の設定です。どちらか1つを選んで一貫させ、両方の形式を解決させないでください。

実際に人を困らせるのは、Hugoのaliasesが301リダイレクトではないことです。front matterの aliases フィールドは、<meta http-equiv="refresh"> タグを含むHTMLファイルを生成します。これはクライアント側の移動であり、サーバー側の301ではありません。日常的な見栄えのよいURLなら問題ありませんが、URLを移動しリンク評価を確実に渡す必要があるサイト移行ではmeta refreshは不適切です。代わりにプラットフォーム側のリダイレクト(Netlify/Cloudflare Pagesの _redirects、またはホストのリダイレクト規則)を使い、Hugoが競合するmeta-refreshファイルも生成しないよう disableAliases: true を設定します。Hugoが制御するのは生成だけで、訪問者やクローラーが受け取る実際のHTTP応答はホストに依存します。front matterを信じるだけでなく、デプロイ済みURLへ curl -I でリクエストして実際の動作を確認してください(正しい移行の全体像はサイト移行を参照)。

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

多言語とhreflang

Hugoは本格的な多言語サポートを備えています。言語サフィックス付きファイル(about.en.md / about.fr.md)と、別のコンテンツディレクトリという2つの翻訳方法があり、hreflang用に .AllTranslations.IsTranslated を公開します。それでも同じ(未検証の第三者)SALT.agencyの数字では、Hugoサイトの90,96 %にhreflangがありません。多言語サイトも含まれており、デフォルトでは誰も接続しない手動作業だという実態と一致します。実装は短いものです。何を生成しても、デプロイ後の出力で実際のalternate、canonical、sitemapの関係も検証してください。多言語設定は構造を作るだけで、タグが正しい証明にはなりません:

{{ range .AllTranslations }}
  <link rel="alternate" hreflang="{{ .Lang }}" href="{{ .Permalink }}">
{{ end }}

メイン言語で既知の多言語sitemap canonical競合にも注意してください。正しいと決めつけず、ビルド後に生成されたすべてのsitemapを確認します。

ページネーション

Hugoのデフォルトのページネーションはcanonicalを調整しません。ページ分割された各ページが1ページ目をcanonicalにしてしまい、深いページのコンテンツがインデックスから外れる可能性があります。ページ分割された一覧で自己参照canonicalを設定するには:

{{ if gt $paginator.PageNumber 1 }}
  <link rel="canonical" href="{{ .Permalink }}page/{{ $paginator.PageNumber }}/" />
{{ else }}
  <link rel="canonical" href="{{ .Permalink }}" />
{{ end }}

Googleは2019年頃に rel="prev"/rel="next" を廃止しましたが、Bingは今も使っています。別の検索エンジンにも対応するため、ページネーションの発見用に追加する価値があります:

{{ if .Paginator.HasPrev }}
  <link rel="prev" href="{{ .Paginator.Prev.URL | absURL }}" />
{{ end }}
{{ if .Paginator.HasNext }}
  <link rel="next" href="{{ .Paginator.Next.URL | absURL }}" />
{{ end }}

画像と性能

Hugoの組み込み画像処理はAVIF、BMP、GIF、JPEG、PNG、TIFF、WebPを扱います(WebP出力はv0.83.0以降)。Resize、Crop、Fill、Fit、Filterの各メソッドがあり、ビルド時にレスポンシブな srcset を生成するには十分です。ただし、変換時にEXIFメタデータが削除されます。altテキストやキャプションは画像に埋め込まれたデータではなく、必ずテンプレート属性から与えてください。

性能はHugoの本当の強みですが、簡単に取り戻されます。ベンチマークを悪化させるのは、すべてビルド後に追加したものです。第三者スクリプト、最適化されていない画像、minificationの省略が該当します。hugo --minify または設定の [minify] minifyOutput = true でminificationを有効にし、追加したanalytics/embedスクリプトを監査してください。静的サイトのスコアを落とすのはHugoではなく、それらです。

SEOのためのテーマ選び

テーマに大きく依存するため、採用前に監査してください。PaperModはOpen Graph、Twitter Cards、Schema.orgを備え、Congoもよく保守されている選択肢です。HugoMods SEO moduleは、不足しているテーマへSEO partialを補完できます。テーマを評価するときは、実際の記事のレンダリング済みソースを見て、自己参照canonical、meta description、Open Graphタグ、taxonomyページのnoindex(または無効化)戦略、JSON-LDを確認します。欠けていれば、53,50 %問題を引き継ぐことになります。

このページの位置付け

HugoはStatic Site Generatorsハブで扱う6つのジェネレーターの1つです。最も近い仲間はJekyllとEleventy(いずれもJavaScript不要)で、Gatsby/Astroはコンポーネントベースです。GoogleがJavaScriptをどう扱うか、静的出力がなぜ低リスク側なのかという広いレンダリングの文脈は、親のJavaScript SEOハブを参照してください。

Add an expert note

Pin an expert quote

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