修正: Next.js (App Router) で Google Search Console が「サイトマップを取得できませんでした」と表示される問題
更新日 2025年10月10日
Google Search Console 向け Next.js サイトマップトラブルシューティングガイド
Next.js プロジェクトで Google Search Console に「Couldn’t fetch sitemap」(サイトマップを取得できませんでした)というエラーが表示されて頭を抱えている方、その悩みはよくあります。このイライラする Google Search Console のサイトマップエラーは、Google がサイトを適切にインデックスするのを妨げ、可視性を損なう可能性があります。Next.js App Router を使用している多くの開発者が、GSC がサイトマップを読み取れないというこの Next.js サイトマップトラブルシューティングの課題に直面しています。ブラウザでは完全にアクセス可能に見えるのに、GSC が失敗するという状況です。
幸いなことに、開発者コミュニティは信頼性の高い解決策を特定しています。このガイドでは、Next.js GitHub issue で共有された有用な発見に基づき、「Couldn’t fetch」エラーを修正するための正確な手順を説明します。
サイトマップがインデックスされ、サイトが正常に動作する状態に戻りましょう。さらに多くの洞察や追加の議論については、GitHub issue での私の返信 もチェックしてください。
問題: なぜ Google はサイトマップを取得できないのか?
問題の核心は、Next.js がルーティングとミドルウェアを処理する方法と、Google Search Console がその取得試行をキャッシュする方法が組み合わさっていることにあるようです。GSC が sitemap.xml にアクセスしようとしたとき、ミドルウェアなどによる干渉に遭遇し、リクエストが失敗することがあります。一度失敗すると、GSC はその特定の URL の失敗結果をキャッシュしているように見えます。 underlying 問題を修正した後でも、単に同じ sitemap.xml URL を再送信するだけでは、新しい試行がトリガーされない可能性があります。
「Couldn’t Fetch」エラーの修正方法
この解決策は、GitHub ユーザー @segabrielcarvalho によるもので、キャッシング、ルーティング、ミドルウェアの競合に対処する実践的なアプローチを、4つの重要なステップで共有しています。
ステップ 1: 末尾のスラッシュを使用して強制的に新しいサイトマップを取得させる
これは最もシンプルですが、最も重要なステップです。Google Search Console は、失敗した取得試行を aggressive にキャッシュしているようです。クリーンな状態から再試行させるために、シンプルなキャッシュバスト法を使用できます。
https://your-site.com/sitemap.xml を送信する代わりに、末尾にスラッシュを追加します。
https://your-site.com/sitemap.xml/
このように少し異なる URL を送信すると、GSC のキャッシュをバイパスし、新しい取得をトリガーします。このシンプルなトリックは、他の修正を実装した後、サイトマップが正常に読み取られるようになるのに十分な場合がよくあります。
ステップ 2: ネストしたルートからサイトマップを提供する
app ディレクトリのルートに sitemap.ts ファイルを配置する代わりに、ネストしたフォルダに移動します。これにより、分離され、競合なしに正しく提供されるようになります。
appディレクトリ内に新しいsitemapフォルダを作成します。sitemap.ts(またはsitemap.js)ファイルをその中に移動します。
新しいファイルパスは次のようになります: app/sitemap/sitemap.ts
これにより、サイトマップの公開 URL が変更されます。新しい URL は次のようになります。
https://your-site.com/sitemap/sitemap.xml
Google Search Console に送信する際は、この新しい URL を使用することを忘れないでください(末尾のスラッシュトリックも忘れずに!)。
ステップ 3: SEO ファイルをミドルウェアから除外する
ミドルウェアは強力ですが、Googlebot がサイトマップや robots.txt などの重要なファイルにアクセスするのを誤ってブロックすることもあります。これを防ぐために、middleware.ts を更新して、これらのファイルを明示的に除外する必要があります。
ミドルウェアファイル内の matcher 設定は、Next.js に対してミドルウェアを実行すべきパスを指示します。ネガティブ lookahead を使用することで、静的アセットや SEO ファイルを除くすべてのパスで実行するように指示できます。
以下は、必要なファイルを正しく除外するだけで、他の処理を行わないミドルウェアの例です。これを既存のミドルウェアに適用できます。
import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";
export default function middleware(req: NextRequest) {
// ここにミドルウェアのロジックを記述できます。
// 他のロジックがない場合は、next() を返すだけです。
void req;
return NextResponse.next();
}
export const config = {
matcher: [
/*
* 以下のもので始まるパスを除くすべてのリクエストパスと一致させる:
* - _next/static (静的ファイル)
* - _next/image (画像最適化ファイル)
* - favicon.ico (favicon ファイル)
* - robots.txt (robots ファイル)
* - sitemap.xml (サイトマップファイル)
* - sitemap/ (ネストしたサイトマップファイル)
* - site.webmanifest (web manifest ファイル)
*/
"/((?!_next/static|_next/image|favicon\\.ico|robots\\.txt|sitemap\\.xml|sitemap/.*|site\\.webmanifest).*)",
],
};
この設定により、robots.txt と両方の潜在的なサイトマップパス(/sitemap.xml と /sitemap/sitemap.xml)がミドルウェアによって処理されなくなり、Googlebot を混乱させる可能性のあるブロックやリダイレクトを回避できます。
ステップ 4: 正しい robots.txt ファイルを作成する
最後に、app ディレクトリにクリーンで正しい robots.txt ファイルがあることを確認します。このファイルは、すべてのユーザーエージェントを明示的に許可し、新しいサイトマップ URL を指す必要があります。public フォルダに robots.txt がある場合は、競合を避けるために削除し、app ディレクトリから生成されるものだけに依存するのが最適です。
app ディレクトリに robots.ts または robots.txt という名前のファイルを作成し、以下の内容を記述します。
import { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: '*',
allow: '/',
},
sitemap: 'https://your-site.com/sitemap/sitemap.xml',
}
}
または、静的ファイルを好む場合:
User-agent: *
Allow: /
Sitemap: https://your-site.com/sitemap/sitemap.xml
https://your-site.com を実際のドメインに置き換えてください。このファイルは、クローラーをサイトマップの新しい場所に指示します。
要点のまとめ
修正を要約すると以下の通りです。
- GSC に送信する際に、キャッシュをバストするためにサイトマップ URL に末尾のスラッシュ (
/) を使用する。 - サイトマップファイルを
app/sitemap/sitemap.tsのようなネストしたルートに移動する。 robots.txtやsitemap.xmlなどの SEO ファイルを除外するようにミドルウェアを更新する。robots.txtを新しいサイトマップ URL にポイントする。
また、サイトマップのソースを 1 つだけにすることを確認することも重要です。 public フォルダに sitemap.xml があり、かつ app ディレクトリからも生成している場合、競合が発生する可能性があります。古いサイトマップファイルは削除し、動的に生成されるものを 1 つだけ使用し続けてください。
これらの手順に従えば、「Couldn’t fetch sitemap」エラーを解決し、Next.js サイトが Google に適切にインデックスされるようになるはずです。Happy shipping