[Hugo] GSCで“取得できませんでした”を解決するまで──sitemap.xmlがHTMLを返す罠

はじめに

ブログ開設して記事も相当数たまりましたが、Goole Search Consoleにずっと登録してなかったので、 いまさらながら登録したのですが、思いのほかハマったのでメモも含めて記事にします。

pingを送る方法もあるようです。

1. 現象と症状

Google Search Consoleで /sitemap.xml を送信すると、ステータスが「取得できませんでした」のまま。 ブラウザでは問題なく開け、curl でも HTTP/2 200content-type: application/xml が返る。 ファイルサイズも正常(約260KB)。──なのに、GSCは拒否する。

❯ curl -I https://humanxai.info/sitemap.xml -H "User-Agent: Googlebot"
HTTP/2 200
content-type: application/xml; charset=utf-8
content-length: 266544

この時点では、サーバやキャッシュ、XML構造の問題を疑っていた。


2. 疑わしい原因を洗い出す

1. URLの整合性

sitemap.xml 内のURLを抽出し、ホストの一致を確認。

curl -s https://humanxai.info/sitemap.xml -H "User-Agent: Googlebot" \
| awk -F'[<>]' '/<loc>/{print $3}' \
| sed -E 's#^https?://([^/]+)/.*#\1#' \
| sort | uniq -c

結果:

1320 humanxai.info

→ 全URLが humanxai.info に統一されており、ドメインの不整合はなし。


2. 相対URL・未エスケープ文字

& の未エスケープや <loc> の相対パスを確認。 結果はいずれも正常。


3. 多言語設定の影響

Hugoの defaultContentLanguageInSubdir = true 設定があるため、 /ja/sitemap.xml が実体になっている可能性を確認。

ブラウザでアクセスしたところ──

トップページ(HTML)が表示された。


3. 原因の確定:SPAルールの巻き込み

Netlifyの _redirects に記載されていたルール:

/admin/*    /admin/index.html   200
/*          /index.html         200

この /* /index.html 200最優先でマッチし、 sitemap.xml/ja/sitemap.xml までもHTMLルーティングされていた。


4. 修正方法

_redirects を以下の順序で書き換え、 sitemap.xmlrobots.txt をSPA対象から除外。

/sitemap.xml      /sitemap.xml      200
/ja/sitemap.xml   /ja/sitemap.xml   200
/robots.txt       /robots.txt       200
/ja/robots.txt    /ja/robots.txt    200
/admin/*          /admin/index.html 200
/*                /index.html       200

再デプロイ後:

  • https://humanxai.info/sitemap.xml → XMLが直接表示
  • https://humanxai.info/ja/sitemap.xml → XMLが直接表示
  • curl -I でも application/xml 確認済み
  • GSC再送信 → 取得成功 ✅

5. 教訓

  1. SPA構成では、sitemap.xmlとrobots.txtの明示除外が必須。
  2. curl で200でも、実体がHTMLならGSCは弾く
  3. Hugo+Netlifyの多言語構成では、/ja/ 側のファイルも確認すべし。
  4. コメントと再現ログを残すことで、後から自分を助けられる。

公式/フォーラム情報

1. Hugo の公式フォーラム:Custom sitemap 設定

「Custom sitemap.xml」のトピックで、Hugo テンプレートや設定で sitemap をカスタマイズしようとしたがエラーになる、という議論。
(特に XML 宣言の位置、空白行、テンプレートの衝突など)
→ デフォルトの sitemap が生成されず、空ドキュメントになるケースも報告。
(HUGO)

2. Hugo Issues:content/sitemap/ に folder を置くと不具合

Issue #12183:Hugo バージョン 0.123 系で、content/sitemap/layouts/sitemap/ フォルダを使ってカスタム sitemap ページを持つと、デフォルトの public/sitemap.xml が生成されないバグ。
→ この報告では、Hugo 0.123.7 で修正されたとある。
(GitHub)

また、この問題は Hugo フォーラム内の “Don’t name a folder ‘sitemap’” トピックでも扱われている。
(HUGO)

3. Hugo フォーラム:_redirects を Hugo が参照すべきか

Hugo respects _redirects files: desirable feature?” という議論があり、
Hugo の開発サーバー (hugo serve) は _redirects を無視する仕様で、Netlify 側がリダイレクトを処理する、という理解が示されている。
(HUGO)

つまり、ローカルでリダイレクトが反映されないのは仕様範囲という見方。

4. Netlify フォーラム:Netlify + Hugo でリダイレクト問題

「Issues with Redirects」フォーラムで、Hugo + Netlify の _redirectsnetlify.toml を使ったリダイレクトが期待通り動かない事例。
静的サイト生成時のファイル位置問題や、リダイレクトファイルの置き場所に関する議論あり。
(Netlify Support Forums)

また、Netlify 側で HTML観点では正しいが、Googlebot やリダイレクト解釈で HTML が返されてしまうという文脈も。
(Netlify Support Forums)