Next.js SEOガイド
Next.jsサイトをクロール可能、インデックス登録可能、検索で評価される状態にする方法を解説します。2つのルーター、SSG・SSR・ISR・Server Components、App RouterのMetadata API、sitemap.ts、robots.ts、next/image、next/link、静かにSEOを壊すミスを扱います。
言語
Next.jsは、適切に使えばJavaScript SEOの難しい問題を解決します。App RouterのServer ComponentsとSSG/ISRはコンテンツをHTMLに置き、ネイティブMetadata APIはサーバー上でタイトル、canonical、Open Graphを解決します。sitemap.tsとrobots.tsはファイル規約です。フレームワークはインフラを提供しますがタグは書きません。metadataBaseの欠落、LCP画像のpriority忘れ、Client Componentからのmetadata export、404ビューが200を返す問題に注意してください。
TL;DR — Next.jsは、正しく使えばSEOに非常に強いフレームワークです。 ページをブラウザだけで作らず、サーバーまたはビルド時に生成し、各ページに 固有のタイトル、説明、canonicalを設定してください。組み込みの
next/imageとnext/linkも使いましょう。Next.jsは必要な道具をすべて提供しますが、SEOタグを 自動で書いてくれるわけではありません。
Next.js SEOとは
Next.jsは、ウェブサイトやウェブアプリを作るための、Reactを基盤とした人気のフレームワークです。 Reactを内部で使うため、ページの多くをJavaScriptで生成できますが、そこからSEOの問題が生まれます。 Next.js SEOとは、検索エンジンがNext.jsサイトをクロール、レンダリング、インデックス登録できるようにし、 フレームワークの組み込み機能を適切に使う実践です。
良い点は、Next.jsがページを事前に、またはサーバー上で生成できることです。そのため検索エンジンは完成したHTMLをすぐ受け取れます。これはJavaScriptサイト最大のリスク、つまりスクリプト実行後にしか現れないコンテンツを避けます。全体像はJavaScript SEOを参照してください。
最大の判断:ページをどこで生成するか
誰か、あるいはGooglebotがページを要求したとき、完成したHTMLはどこから来るのでしょうか? Next.jsにはいくつかの選択肢があります。
- ビルド時(Static / SSG) — ページをあらかじめ通常のHTMLファイルに生成します。高速で、検索エンジンはすぐにすべてを取得できます。
- リクエストごとのサーバー(SSR) — サーバーが毎回ページ全体を生成します。検索にも適しており、常に最新です。
- 組み合わせ(ISR) — タイマーで更新する静的ページです。多くのコンテンツで良いデフォルトになります。
- ブラウザ内(Client-Side / CSR) — サーバーがほぼ空のシェルを送り、JavaScriptが埋めます。SEOにはリスクがあるため、主要コンテンツでは避けてください。
現在のApp RouterはデフォルトでServer Componentsを使うため、コンテンツが自動的にHTMLに入ります。 SEOの出発点として優れています。
簡単なチェックリスト
- 各ページに固有のタイトルと説明を付ける。
- 各ページにcanonical URLを設定する。
- 画像には**
next/image**コンポーネントを使う(画像の読み込み時のレイアウト移動を抑え、サイズも小さくできます)。 - 内部リンクには**
next/link**を使う(Googleがたどれる実際のリンクを作ります)。 - 主要コンテンツをクライアントサイドレンダリングの背後に置かない。
- sitemapとrobots.txtを作る(Next.jsにはどちらにも簡単なファイルベースの方法があります)。 Evidence for this claim Next.js App Router supports special metadata files for sitemap and robots output. Scope: Next.js App Router file conventions. Confidence: high · Verified: Next.js: Metadata files
よくある誤解
「Next.jsがSEOを自動処理する」。重要な部分は自動ではありません。Next.jsはメタデータシステム、sitemapとrobotsの規約、画像コンポーネントという仕組みを提供しますが、タイトル、説明、canonicalは自分で書く必要があります。 Evidence for this claim Next.js provides metadata APIs, but developers supply page-specific metadata values. Scope: Next.js App Router metadata and generateMetadata APIs. Confidence: high · Verified: Next.js: Metadata and OG images 各ページに固有の設定が必要です。すべてのページが同じタイトルだったりcanonicalがなかったりするサイトは、Next.jsビルドの性能を落とす最も一般的な原因です。 “Next.js handles SEO automatically.”(原文引用を保持)
2つのルーター、Metadata API、metadataBase、LCP画像の工夫、インデックス登録を静かに壊すミスまで詳しく知りたいですか?Advancedタブに切り替えてください。
TL;DR — Next.jsは、正しく使えばJavaScript SEOの難しい問題をデフォルトで解決します。App RouterはServer Componentsをデフォルトにし、SSG/SSR/ISRをサポートします。いずれもレンダリング済みHTMLを送るため、レンダリングキューの待ち時間がありません。ネイティブのMetadata API(
metadata/generateMetadata)でメタデータを設定し、metadataBaseがないとcanonicalとOG画像が相対URLになることを覚えておきましょう。app/sitemap.tsとapp/robots.tsを使い、動的ルートはgenerateStaticParamsで事前生成し、LCP画像にはpriorityを設定し、リンクは実際のnext/linkアンカーにします。Pages Routerもnext/headでSEOに対応できます。失敗は予測可能で、多くはNext.jsのせいではなく実装のせいです。
Next.jsの位置づけ
Next.jsはReactフレームワークなので、JavaScript SEOの内容はすべて当てはまります。専用ガイドにする価値があるのは、Next.jsがJavaScript SEOの多くの問題に、サーバーレンダリング、静的生成、メタデータシステム、sitemap/robots規約という主要な解決策を用意しているからです。難しいのはGoogleが読めるかどうかではありません。Googleは長年JavaScriptをレンダリングしています。適切なレンダリング方式を選び、SEOの基本を未設定のままにしないことが重要です。これはヘッドレスCMS SEOの特殊例でもあります。CMSより、フロントエンドのレンダリング判断が結果を左右します。
「Next.jsサイトである」というだけでは、個々のURLがどう配信されるかは分かりません。レンダリングモード、キャッシュ、Server/Client Componentの境界はルート単位(場合によってはセグメント単位)で決まります。1つのプロジェクトに、静的なマーケティングページ、SSRの商品ページ、Client Componentのダッシュボードを混在させられます。1つのルートの挙動を「アプリ全体」に一般化せず、対象URLをテストしてください。
2つのルーター、2種類の仕組み
Next.jsには2つのルーターがあり、SEOの扱いが異なります。
- Pages Router(旧モデル) —
getStaticProps/getServerSidePropsでデータを取得し、next/headの<Head>(またはnext-seoパッケージ)でメタデータを設定します。Server Componentsはありません。 - App Router(v13以降、現在推奨) — React Server Componentsがデフォルトで、ネイティブのMetadata API(
metadataexport /generateMetadata)を使います。app/sitemap.tsとapp/robots.tsのファイル規約、動的ルート用のgenerateStaticParamsがあります。 Evidence for this claim The App Router uses Server Components and supports generateStaticParams plus metadata file conventions. Scope: Current Next.js App Router behavior; route rendering can become dynamic based on APIs used. Confidence: high · Verified: Next.js: Server and Client Components Next.js: generateStaticParams
どちらでも十分に順位を得られます。App Routerは、next/headを調整する必要のない統合的なメタデータシステムと、最初から使えるServer Componentsを提供するため、新規ビルドならこちらを選びます。ただし「App RouterでなければSEOできない」は神話です。Pages Routerのサイトも数多く正常に順位を得ています。
レンダリングモードとSEO上の意味
GoogleのJavaScript処理は、クロール、遅れて行われるレンダリング、インデックス登録という3段階です。Googleは “All pages with a 200 HTTP status code are sent to the rendering queue.” (翻訳) 「HTTPステータスが200のすべてのページはレンダリングキューへ送られます」と説明しています。Next.jsでは、その処理を待つ前にコンテンツがHTMLへ入る方式を選ぶことが重要です。 Evidence for this claim Google crawls, renders, and indexes JavaScript pages, and successful pages can enter the rendering queue. Scope: Google Search processing, not a promise that a URL will be indexed. Confidence: high · Verified: Google: JavaScript SEO basics
- Static Site Generation(SSG) — ビルド時に事前レンダリングするため、HTMLをすぐ利用でき、レンダリングキューのリスクがありません。毎分変わらないコンテンツに最適です。
generateStaticParams()(App Router)/getStaticPaths()(Pages Router)が事前生成する動的ルートを決めます。 - Incremental Static Regeneration(ISR) — 一定間隔後に再検証する静的ページです(
export const revalidate = 3600)。クローラーはTTFBの低い静的HTMLを受け取り、内容も新しく保てます。ただし、期間が切れた直後の次のリクエスト(Googlebotの場合もあります)にはまだstaleページが返り、更新版はその次のリクエストで配信されます。価格や在庫のような変動の大きいデータにはSSRが安全です。 - Server-Side Rendering(SSR) — リクエストごとにHTMLをレンダリングします。クローラーは完成したHTMLをすぐ受け取れますが、サーバー遅延が代償なのでTTFBとLCPを監視します。
export const dynamic = 'force-dynamic'、またはリクエスト時API(cookies、headers)を使うとルートはSSRになります。 - React Server Components(App Routerのデフォルト) — サーバーでレンダリングしてHTMLを送り、コンポーネント自身のJavaScriptは送信しません。コンテンツはハイドレーションの空白なく初期レスポンスに入ります。SEOの最良のデフォルトです。インタラクティブ性は
'use client'を付けたClient Componentsに置きます。 - Client-Side Rendering(CSR) — ブラウザで完全にレンダリングします。Googlebotはレンダリングの波の後にインデックス登録できます(中央値は約10秒ですが、90パーセンタイルは数時間に及びます)。Bingbot、AIボット、ソーシャルプレビューボットなどは空ページを受け取ることがあります。App Routerでは
'use client'で明示的に選び、Pages Routerでは主要コンテンツをuseEffectで取得するのを避けます。順位を得たいコンテンツには使わないでください。
覚えておきたいことがあります。「Googlebotがレンダリングできる」と「Googlebotにレンダリングさせるべき」は同じではありません。レンダリングは高コストで遅延し、すべてのクローラーに共通するわけでもありません。
Metadata API(App Router)
Metadata APIはServer Component専用です。ページのレンダリング前にサーバーでメタデータを解決するため、初期HTMLに入ります。layout.jsまたはpage.jsからmetadataをexportします。
export const metadata: Metadata = {
title: 'My Page',
description: 'Page description',
}タグが取得データに依存する場合は、generateMetadata()を使います。
export async function generateMetadata({ params }) {
const post = await getPost(params.slug)
return { title: post.title, description: post.description }
}SEOで重要なフィールド:
title— 文字列、テンプレート('%s | Brand')、デフォルト値、絶対値の上書きを使えます。ルートレイアウトでテンプレートを一度設定すれば、各ページのタイトルが継承します。description、alternates.canonical(App Routerでcanonicalを設定する正しい方法)、openGraph(画像は絶対URLに解決する必要があります)、twitter(LinkedInとSlackのプレビューにも使われます)、robots(index/followと、max-snippetやmax-image-previewなどのgoogleBot固有指示)。metadataBase— canonicalとOG画像のURLを正しく解決するため必須です。これを忘れるのがNext.jsメタデータの最も一般的なバグで、相対URLがcanonicalとOpen Graphタグに漏れ、ソーシャルプレビューを壊しcanonicalシグナルを曖昧にします。
タイトルテンプレートの例:
// app/layout.tsx
export const metadata: Metadata = {
metadataBase: new URL('https://example.com'),
title: { template: '%s | Brand Name', default: 'Brand Name' },
}
// app/blog/page.tsx
export const metadata: Metadata = { title: 'My Blog Post' }
// Output: <title>My Blog Post | Brand Name</title>2つの注意点。 1つ目は、メタデータがレイアウトからページへ浅くマージされることです。子セグメントでopenGraphのようなネストしたオブジェクトを定義すると親全体を置き換えるため、ページレベルのopenGraph: { title: 'Home' }はレイアウトに設定したopenGraph.imagesを静かに落とします。2つ目は、metadataがServer Componentsでしか機能しないことです。'use client'ファイルからexportすると何も起きません。
ストリーミングメタデータ。 動的レンダリングのページでは、generateMetadataが初期HTMLの後からメタデータをストリームできます。GooglebotはJavaScriptを実行して完全なDOMを調べるため、Googleでは機能します。一方Next.jsは「HTML制限ボット」である Bingbot、Twitterbot、Slackbot、facebookexternalhit を検出し、<head>内にブロッキングメタデータを送ります。Next.js文書は “streaming metadata is disabled for bots and crawlers that expect metadata to be in the <head> tag.” (翻訳) 「メタデータが <head> タグ内にあることを期待するボットとクローラーでは、ストリーミングメタデータが無効になります」と説明しています。これは自動で、設定は不要です。事前レンダリングページではビルド時にメタデータが解決されるため、ストリーム自体がありません。この挙動はNext.js 16.2.10時点のバージョン固有です。更新時にはgenerateMetadata文書を再確認してください。配信経路は入口で異なるため、本番への直接リクエスト(curl -IまたはView Source)と、同じルートへのクライアント遷移の両方でメタデータを検証します。
next/headによるメタデータ(Pages Router)
Pages Routerでは、メタデータはnext/headの<Head>に置きます。
import Head from 'next/head'
export default function Page() {
return (
<>
<Head>
<title>My Page | Brand</title>
<meta name="description" content="Description" />
<link rel="canonical" href="https://example.com/my-page" />
</Head>
{/* page content */}
</>
)
}タイトルと説明は_app.jsだけでなくページごとに設定し、ページ分割の各バリエーションを含むすべてのページにcanonicalを置きます。next-seoパッケージは、<NextSeo>コンポーネントと構造化データヘルパーでこれを標準化します。App Routerへ移行する主な意味は、next/headとnext-seoからネイティブのmetadata exportへ移ることです。
next-seoパッケージは必要ですか? これはNext.js自体の一部ではないサードパーティプラグインで、執筆時点のv7.2.0は積極的に保守され、アーカイブされていません。文書は用途を明確にしています。App Routerの標準metaタグには、READMEは<NextSeo>ではなくNext.js組み込みのgenerateMetadata/metadata exportを推奨します。Pages Routerでは<NextSeo>はnext/headの便利な抽象化として合理的です。App Routerで残る用途はJSON-LDヘルパー(ArticleJsonLd、FAQPageJsonLdなど、useAppDir付き)で、手作業の<script type="application/ld+json">より好むチームもあります。新しいApp RouterではまずネイティブMetadata APIを使ってください。パッケージは任意であり、必須ではありません。
サイトマップ
App Routerでは、app/sitemap.tsというファイル規約が/sitemap.xmlを出力します。
import type { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
return [
{ url: 'https://acme.com', lastModified: new Date(), priority: 1 },
{ url: 'https://acme.com/blog', lastModified: new Date(), priority: 0.8 },
]
}大規模サイトではgenerateSitemaps()が複数ファイルに分割します(Googleの上限はサイトマップ1つあたり50 000 URL)。各ファイルは/.../sitemap/[id].xmlで配信されます。出力は画像サイトマップ、動画サイトマップ、ローカライズされたalternates.languagesにも対応します。Pages Routerではnext-sitemapを使うか、getServerSidePropsでpages/sitemap.xml.jsを生成します。
robots.txt
app/robots.tsはrobotsファイルをプログラムで生成します。
export default function robots(): MetadataRoute.Robots {
return {
rules: [{ userAgent: '*', allow: '/', disallow: '/private/' }],
sitemap: 'https://acme.com/sitemap.xml',
}
}ユーザーエージェントごとのルールと複数のサイトマップに対応しています。Pages Routerでは静的なpublic/robots.txtを使います。どちらのルーターでも絶対に間違えてはいけないルールは、JavaScriptやCSSをdisallowしないことです。Googleはブロックされたファイルからレンダリングできず、JavaScriptフレームワークではページ全体が空になる可能性があります。
next/imageとCore Web Vitals
next/imageはSEOでこのフレームワークを使う強い理由の1つです。画面下部の画像を遅延読み込みし、width/height(またはfill)を要求して空間を確保し、レイアウトシフト / CLSを防ぎます。WebP/AVIFを自動配信し、sizes propから適切なsrcsetを出力します。最も重要なCWV最適化は、ヒーロー画像または画面上部画像のpriority propです。これをpreloadしてLCPを速くします。
<Image src="/hero.jpg" width={1200} height={630} priority alt="Hero" />LCP画像でpriorityを忘れるのは、Next.jsのCWVで最も一般的なミスです。実際のNext.jsサイトではCWV問題が広く見られます(Salt AgencyのデータはStatsタブを参照)。altは必須で、装飾画像では空にし、内容を伝える画像では説明的にします。
next/linkと内部リンク
next/linkはHTMLに標準の<a href>アンカーを出力するため、Googleは通常どおりたどれます。本番ではクライアントサイド遷移を追加し、ビューポート内リンクをバックグラウンドでprefetchします。SEOのルールは単純です。内部リンクにはnext/linkを使い、実際のアンカーを生成しないonClickハンドラーやJavaScript遷移で置き換えないこと。そうしたリンクはクロールできません。低価値リンクで帯域を節約するならprefetch={false}を使います。
動的ルートとgenerateStaticParams
generateStaticParams()は、ビルド時にどの動的ルートを事前レンダリングするかをNext.jsに伝えます。
// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map((post) => ({ slug: post.slug }))
}この方法で生成したページは完全な静的HTMLで、SEOに最適です。これがない動的ルートはデフォルトでオンデマンド(SSR)レンダリングになり、問題はありませんがサーバー遅延が再び発生します。定期更新するコンテンツにはrevalidate(ISR)と組み合わせます。重要な動的URLをすべてgenerateStaticParamsに含め、レンダリングキューを待たせないようにしてください。
構造化データ(JSON-LD)
Metadata APIには構造化データ用フィールドがありません。Server Componentの<script>にJSON-LDを注入し、クライアントバンドルのコストなしでサーバーレンダリングHTMLに残します。
const jsonLd = { '@context': 'https://schema.org', '@type': 'Article', /* … */ }
return <script type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />一般的な型はArticle/BlogPosting、BreadcrumbList、Product、FAQPageです。レンダリングを変更したら、Rich Results Testで検証してください。
Next.js SEOでよくあるミス
実際の監査とここまでのパターンから:
- canonicalがない、または相対URL —
metadataBaseを忘れたことが原因になり、OG画像URLも壊れます。 - LCP画像に
priorityがない — 最大のCWV上の欠落です。 - 404ビューが
200を返す — 組み込みのnotFound()で実際のステータスを返します。ソフト404はNext.jsサイトで頻発します。 - Client Componentから
metadataをexportする — 何も起こりません。Server Component専用です。 - 主要コンテンツをCSRにする — 重要な内容を
useEffectで取得すると、Google以外のクローラーは空ページを受け取ります。 - History APIではなくハッシュ(
#)ルーティングを使う — ビューが別々にクロールできません。 generateStaticParamsをexportしない — 動的ルートが事前生成されずオンデマンドになります。- レイアウト継承で
openGraphを上書きする — 子セグメントはマージせず置き換えます。 - robots.txtまたはGooglebotのヘッドレスChromeがスクリプトを読み込めないContent Security PolicyでJS/CSSをブロックする — URL Inspectionでテストします。
デプロイ時の注意
Next.jsはVercelによって開発され、そこでホスティングすると静的ページとISRページのエッジCDNや良好なTTFBとの統合が得られますが、必須ではありません。next.config.jsのredirects()で恒久リダイレクトを定義し(permanent: trueなら308または301)、クローラーに確実なシグナルを送り、headers()でセキュリティとキャッシュのヘッダーを設定します。ページ単位のrobotsメタデータが扱いにくい場合は、パス単位のnoindexルールにX-Robots-Tagレスポンスヘッダーを使います。
どこで何を確認するか。 キャッシュ状態、ステータスコード、リダイレクト、ストリーミングメタデータは同じテストにすべて現れるわけではありません。あるチェックでは正常に見えても、別のチェックでは壊れていることがあります。
| チェック | 見る場所 | レンダリング結果と違う理由 |
|---|---|---|
| キャッシュ/再検証の経過時間 | 直接リクエスト(curl -I)のレスポンスヘッダー | 期間が切れた直後のリクエストではISRが古いページを返すことがある |
| 直接のHTTPステータス | レンダリングUIではなく本番URLへのcurl -I | notFound()のない「見つからない」ビューも200を返す |
| リダイレクトの挙動 | 実際に発火するコンテキスト(Server Actionのredirect()、Route Handler、またはクライアントのonClick) | ステータスコードとレスポンス経路は遷移先だけでなく呼び出しコンテキストで変わる |
| ストリーミングメタデータ | 直接リクエストと同じルートへのクライアントサイド遷移 | 通常のクライアントはストリームを受け、HTML制限ボットはブロッキングメタデータを受ける |
| クライアントサイド遷移 | アプリ内で遷移してから<head>を再確認 | 初回ロードで正しいルートも、クライアント遷移後にずれることがある |
これらはフレームワークが保証するものではありません。Next.jsはredirects()、notFound()、再検証、ストリーミングという仕組みを提供しますが、キャッシュキー、無効化、プレビュー状態、デプロイ設定を正しく扱い、本番でテストする責任は残ります。ローカルだけで確認してはいけません。
最後に動的レンダリングについて。ボットには事前レンダリングHTMLを、ユーザーにはJavaScriptを配信する方法です。Googleは “dynamic rendering was a workaround and not a long-term solution.” (翻訳) 「動的レンダリングは回避策であり、長期的な解決策ではありませんでした」として、推奨を終了しました。Next.jsではSSR、SSG、ISR、Server Componentsが本来HTMLにコンテンツを入れるため必要ありません。監査で認識できるようにしておき、それを新しい基盤にはしないでください。
理想的な経路は、App Router + Server Components + ISR + Metadata API(metadataBase付き)+ priority付きnext/imageです。これらを正しく設定すれば、Next.js SEOの大部分は処理されます。
AIサマリー
Advanced版を凝縮すると:
- Next.jsはJavaScript SEOの問題の大半を既定で解決する — 適切なレンダリング方式を選び、基本を設定した場合です。フレームワークはインフラを提供しますが、タグ自体は書きません。
- 2つのルーター: App Router(v13以降、推奨)はServer ComponentsとネイティブMetadata APIを使い、Pages Routerは
next/head/next-seoを使います。どちらでも検索評価を得られます。 - レンダリング方式: SSGとServer ComponentsはHTMLをすぐ提供します。ISRは静的速度と更新を両立しますが、再検証後の最初のリクエストには古い内容が返る場合があります。SSRは変動データ向けです。CSRはGoogle以外のクローラーに空ページを返すおそれがあります。
- Metadata API:
metadataexportまたはgenerateMetadata()を使うServer Component専用です。metadataBaseは必須で、canonicalとOG画像が相対URLになるのを防ぎます。子のopenGraphは親を置き換え、'use client'ファイルのmetadataは機能しません。 - ストリーミングメタデータ: Googleでは機能しますが、HTML制限ボットには自動でブロッキングメタデータを送ります。
- ファイル規約:
app/sitemap.ts(5万URL超にはgenerateSitemaps())とapp/robots.tsを使い、.js/.cssを遮断しません。 - 画像とリンク:
next/imageはCLSを防ぎWebP/AVIFを配信します。LCP画像にはpriorityを設定します。next/linkはクロール可能な<a href>を生成します。 - 動的ルート:
generateStaticParamsで事前生成し、ない場合はオンデマンドになります。JSON-LDはServer Componentの<script>で注入します。 - パッケージ:
next-seoは任意です。v7.2.0は保守中で、文書はApp Routerのmetaタグに組み込みgenerateMetadata/metadataを推奨します。<NextSeo>はPages RouterやJSON-LDヘルパーで有用です。 - ルート単位の確認: レンダリング方式はプロジェクト全体ではなくルートごとに確認します。主なミスは
metadataBase欠落、LCPのpriority忘れ、200を返す四〇四ビュー(notFound()を使う)、Client Componentのmetadata、主要コンテンツのCSRです。 - 動的レンダリング: 非推奨です。SSR/SSG/ISR/Server Componentsで対応できます。
公式ドキュメント
Next.jsと検索エンジンの一次資料ドキュメントです。
Next.js
- Metadata and OG Images — App Routerのメタデータシステム、
metadataBase、OG画像の生成。 - generateMetadata API Reference — 静的
metadataとgenerateMetadata、ストリーミングメタデータ、HTML制限ボットの一覧。 - sitemap.xml File Convention —
app/sitemap.ts、generateSitemaps()、画像/動画/ローカライズサイトマップ。 - robots.txt File Convention —
app/robots.ts、ユーザーエージェント別ルール、複数サイトマップ。 - Learn: SEO — Next.js独自のSEO学習パス(導入向けで、一部はApp Router以前の内容)。
- JavaScript SEOの基本 — クロール→レンダリング→インデックスの流れ、200ステータスのレンダリングキュー、SPAのソフト四〇四、canonical、History API。
- 動的レンダリング(非推奨の回避策) — Googleが非推奨にした理由と代替策(SSR、静的レンダリング、ハイドレーション)。
- Google検索の仕組みの詳細 — クロール→インデックス→配信のどこにレンダリングがあるか。
Bing / Microsoft
- IndexNow / indexnow.org — Next.jsの公開/再検証イベントに接続するプッシュプロトコル。
原文からの引用
Google、Next.js、Google関係者による記録された発言です。各リンクは引用箇所へ直接移動します。
Google — JavaScriptページの処理方法
- “All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” (翻訳) 「ページにJavaScriptがあるかどうかにかかわらず、HTTPステータスが200の全ページはレンダリングキューへ送られます」 — Google Search Central文書。 引用箇所へ
Google — 動的レンダリングは非推奨
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (翻訳) 「動的レンダリングは、検索エンジンにおけるJavaScript生成コンテンツの問題に対する回避策であり、長期的な解決策ではありませんでした」 — Google Search Central文書。 引用箇所へ
“…creates additional complexities and resource requirements.” (翻訳) 「追加の複雑さとリソース要件を生じさせます」 — Google Search Central文書。 引用箇所へ
Next.js — ストリーミングメタデータとHTML制限ボット
- “Streaming metadata is disabled for bots and crawlers that expect metadata to be in the
<head>tag (e.g. Twitterbot, Slackbot, Bingbot).” (翻訳) 「メタデータが<head>タグ内にあることを期待するボットやクローラー(Twitterbot、Slackbot、Bingbotなど)では、ストリーミングメタデータが無効になります」 — Next.js文書のgenerateMetadata。 引用箇所へ
GoogleのJohn Mueller(Search Engine Journalの報道経由)
- SEOにおけるJavaScriptの役割拡大について:“You’re going to run into significantly more JavaScript over the next years than in the 2-ish decades in SEO before. If you’re keen on technical SEO, then past HTML you’re going to need to understand JS more and more.” (翻訳) 「今後数年は、それ以前のおよそ20年間のSEOよりもはるかに多くのJavaScriptに直面します。テクニカルSEOに熱心なら、HTMLに加えてJavaScriptへの理解がますます必要になります」 報道を読む
Next.js SEOチェックリスト
Next.jsサイトがクロール可能で、インデックス登録可能で、高速かを簡単に確認します。
- 主要コンテンツが最初のリクエストでHTMLにレンダリングされる(Server Components/SSG/SSR/ISR)。クライアントJavaScriptの後だけに表示されない。
- 重要なページの主要コンテンツがCSRに依存していない。
- すべてのページに固有のタイトルと説明がある(ルートレイアウトでtitle
templateを使う)。 - App Routerのルートレイアウトに**
metadataBase**が設定され、canonicalとOG画像が絶対URLになる。 - App Routerでは
alternates.canonical、Pages Routerでは<link rel="canonical">でページごとのcanonicalを設定する。 -
metadataはServer Componentsからだけexportし、'use client'ファイルではexportしない。 - **
generateStaticParams**が重要な動的ルートをすべてカバーする。 -
app/sitemap.tsまたはnext-sitemapが現在のサイトマップを出力し、generateSitemaps()が5万URL超を分割する。 -
app/robots.ts/public/robots.txtがあり、.jsや.cssをブロックしない。 - 画像が
next/imageとwidth/heightまたはfillを使い、LCP画像にpriorityがあり、すべてにaltがある。 - 内部リンクが
next/link(実際の<a href>)で、onClickだけの遷移ではない。 - 四〇四ビューが
notFound()を呼び、実際の404を返す(ソフト四〇四ではない)。 - JSON-LDがServer Componentの
<head>/bodyに注入され、Rich Results Testに合格する。 - 恒久リダイレクトが
next.config.jsのredirects()にあり(308/permanent)。
メンタルモデル
1. レンダリングモードがプロダクトです。 Next.jsサイトで何かをデバッグする前に、「このルートはどうレンダリングされるか?」に答えます。Server Components / SSG / SSR / ISRはコンテンツをHTMLに入れるため低リスクで、CSRはリスクがあります。Next.js SEO問題のほとんどはここに帰着します。
2. フレームワークはコンテンツではなくインフラを提供します。 Next.jsはMetadata API、sitemap/robotsの規約、Imageコンポーネントを提供しますが、タイトル、説明、canonical、構造化データは何も書きません。「Next.jsがSEOを自動処理する」は最も高くつく神話です。
3. URLの単一の正解。
metadataBaseを一度設定し、そこからcanonical、OG画像、サイトマップのエントリを絶対URLとして(相対ではなく)作ります。1つのベースURLで、相対canonicalと壊れたOG画像の種類のバグをなくせます。
4. Server Componentsをまず使い、Client Componentsは必要な場所だけにする。
デフォルトをServer ComponentsにしてコンテンツとメタデータをHTMLに入れます。インタラクティブ性のためだけに'use client'を使い、metadataはClient Componentから提供できないことを覚えておきます。
5. レンダリングの判断ルール。 ほぼ静的(ブログ、ドキュメント、マーケティング)→ SSG(またはタイマー付きISR)。常に最新/変動するもの(価格、在庫)→ SSR。毎時/毎日変わり、静的速度が欲しい→ ISR(最初のリクエストが古くなる罠に注意)。インタラクティブ、ログイン後、インデックス不要→ CSRで問題ありません。順位を得たい公開コンテンツではCSRを使いません。
Next.js SEO — チートシート
レンダリングモード
| モード | HTMLを作る場所 | SEO | 適するもの | 注意点 |
|---|---|---|---|---|
| SSG | ビルド時→静的 | ✅ 最良 | ほぼ静的なコンテンツ | 再ビルドまで古い |
| Server Components | サーバー(App Routerのデフォルト) | ✅ 最良 | ほとんどのコンテンツ | インタラクティブ性にはClient Componentsが必要 |
| ISR | 静的+時間指定の再生成 | ✅ 良好 | 毎時/毎日のコンテンツ | 再検証直後の最初のリクエストは古い |
| SSR | サーバー、リクエストごと | ✅ 良好 | 常に最新のデータ | TTFB/インフラコストが高い |
| CSR | ブラウザ内 | ⚠️ リスクあり | ログイン後のダッシュボード | Google以外のクローラーには空ページ |
App RouterとPages Router
| 機能 | App Router | Pages Router |
|---|---|---|
| メタデータ | metadata / generateMetadata | next/head + next-seo |
| Server Components | デフォルト | 利用不可 |
| ストリーミングメタデータ(ボット対応) | あり | なし |
| サイトマップ | app/sitemap.ts | next-sitemap / 手動 |
| Robots | app/robots.ts | public/robots.txt |
| Canonical | alternates.canonical | <link rel="canonical"> in <Head> |
| データ取得 | async Server Components | getStaticProps / getServerSideProps |
早見ルール
- **
metadataBase**を設定しないとcanonical/OG画像が相対URLになる。 metadataはServer Component専用で、'use client'のexportは機能しない。- 子セグメントの
openGraphは親を置き換える(マージしない)。 - LCP画像の**
priority**は最大のCWV改善。 - 内部リンクは**
next/link**(実際の<a href>)。onClickだけの遷移は使わない。 - 四〇四では**
notFound()**を呼ぶ(ソフト四〇四ではなく実際の404)。 - 決して
.js/.cssを遮断しない。 - ストリーミングメタデータはBingbot、Twitterbot、Slackbot、facebookexternalhitにはブロッキング。
- 動的レンダリングは非推奨。SSR/SSG/ISR/Server Componentsを使う。
Next.jsビルドのクイックチェック
本格的なクローラーを使う前に行えるコマンドラインチェックです。
コンテンツは生のHTMLに入っているか(JS実行後だけではないか)?
macOS / Linux:
# Raw HTML as the server sends it — the "first fetch", before any client JS
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your headline actually in the raw HTML? (empty result = CSR / JS-dependent)
grep -o "Your headline text" raw.html
# Did metadataBase do its job? Canonical and OG URLs should be absolute, not relative
grep -iE 'rel="canonical"|og:(url|image)' raw.htmlWindows (PowerShell):
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"
Select-String -Path raw.html -Pattern 'rel="canonical"','og:url','og:image'raw.htmlに見出しがなくブラウザには表示されるなら、そのルートはクライアントレンダリングです。canonicalまたはOG画像URLが相対URLなら、metadataBaseを忘れています。
JS/CSS(Next.jsの_nextディレクトリを含む)をブロックしていないか確認する
macOS / Linux:
curl -sL https://example.com/robots.txt | \
grep -iE "disallow.*\.(js|css)|Disallow:\s*/_next"Windows (PowerShell):
(Invoke-WebRequest "https://example.com/robots.txt").Content |
Select-String -Pattern "Disallow.*\.(js|css)","Disallow:\s*/_next"ここで何かに一致するなら、ほぼ常にミスです。Googleはブロックされたファイルからレンダリングできません。通常のcurlはJavaScriptを実行しないため、レンダリング済みDOMはURL Inspectionの「View Crawled Page → rendered HTML」で確認します。
Next.jsサイトを監査するツール
- URL Inspection(Google Search Console) — 正解の情報源です。live testを実行し、rendered HTML、screenshot、page resources(読み込まれたものとブロックされたもの)を確認して、CSRの欠落やブロックされた
_nextリソースを見つけます。 - Rich Results Test — レンダリングを変更した後、JSON-LDがレンダリング出力に入ったことを確認します。
- Lighthouse / Chrome DevTools — LCP、CLS、INPを測定し、ヒーロー画像がpreloadされているか(
priority)を確認します。 - Ahrefs Site Audit — JavaScriptレンダリングでクロールし、フロントエンド全体の欠落/相対canonical、壊れたメタデータ、リダイレクトチェーン、インデックス可否を見つけます。
- Screaming Frog SEO Spider — JSレンダリングのオン/オフでクロールし、生HTMLとレンダリングHTMLを比較して移行前後の比較を作ります。
- Bing Webmaster Tools — BingのURL InspectionとIndexNowの送信先です。
Next.jsで避けるべきミス
実際のNext.jsビルドでSEOを静かに壊す具体的なパターンです。トラフィックが落ちてからデバッグするのではなく、公開前に防ぎます。
ルートレイアウトにmetadataBaseがないまま公開する
なぜ誤りか: metadataBaseがないとalternates.canonicalとopenGraph.imagesは絶対URLではなく相対パスに解決されます。相対canonicalはcanonical化のシグナルを混乱させ、相対OG画像URLはソーシャルやメッセージアプリのリンクプレビューを壊します。
代わりにすること: app/layout.tsxでmetadataBase: new URL('https://example.com')を一度設定し、すべてのページに継承させます。生HTMLの取得に対してgrep -iE 'rel="canonical"|og:(url|image)'で確認し、URLがhttps://で始まることを確かめます。
子セグメントからレイアウトのopenGraphを上書きする
なぜ誤りか: メタデータはレイアウトからページへ浅くマージされます。ページレベルのopenGraph: { title: 'Home' }はレイアウトのopenGraph.imagesとマージされず、オブジェクト全体を置き換えて画像を静かに落とします。
代わりにすること: 上書きする各レベルで、画像を含む完全なopenGraphオブジェクトを繰り返します。または、変更が必要なトップレベルのメタデータだけを上書きし、レイアウトのデフォルトで問題ない場合はopenGraphに触れません。
Client Componentからmetadataをexportする
なぜ誤りか: Metadata APIはServer Component専用です。metadataもexportするファイルに'use client'を追加すると、exportは何もせず、エラーも警告もないままタイトルや説明のないページになります。
代わりにすること: metadata / generateMetadata exportは、通常のServer Componentファイル('use client'のないpage.tsxまたはlayout.tsx)に置きます。ページにクライアントのインタラクティブ性が必要なら、別の子コンポーネントに置いてimportします。メタデータexportを持つファイルに'use client'を追加しないでください。
useEffectで主要コンテンツを取得する(または完全なCSRに頼る)
なぜ誤りか: ブラウザだけでレンダリングされるコンテンツは初期HTMLにありません。Googleは最終的にはレンダリングしますが、中央値の遅延は現実にあり、90パーセンタイルでは数時間に伸びます。Google以外のクローラー(Bing、ソーシャルプレビューボット、多くのAIクローラー)はJavaScriptを実行しないことが多く、空ページを見ます。
代わりにすること: インデックス登録したいものにはServer Components、SSG、ISR、SSRをデフォルトで使います。'use client'とuseEffectでのデータ取得は、クロール可能でなくてもよいインタラクティブUI(記事本文ではなくフィルターウィジェットなど)に限ります。
「見つからない」ビューに200を返す
なぜ誤りか: notFound()を呼ばずに「見つかりません」というメッセージをレンダリングすると通常の200ステータスになります。これはソフト404です。Googleは空の内容のページを欠落としてではなくインデックス登録でき、ソフト404は現実のNext.js SEOで最も一般的な問題の1つです。
代わりにすること: 組み込みのnotFound()関数を呼び、ルートが実際の404を返すようにします。存在しないURLにcurl -Iを実行して、ブラウザでの表示だけでなくステータスコードを直接確認します。
重要な動的ルートでgenerateStaticParamsを省略する
なぜ誤りか: これがないと動的ルートはオンデマンドレンダリング(SSR)に戻ります。SEOには機能しますが、そのURLへの最初のリクエストごとにサーバー遅延が加わり、Googlebotも例外ではありません。
代わりにすること: 重要なURL(商品ページ、ブログ記事、カテゴリーページ)をgenerateStaticParams()に列挙して事前生成し、公開後に変わるコンテンツにはrevalidate(ISR)を組み合わせます。
自分で確認:Next.js SEO
Next.jsサイトをクロール可能、インデックス登録可能、高速にするための5つの短い質問です。各問に答えてから確認してください。
時間を使う価値のあるリソース
関連する私の記事
- JavaScript SEO完全ガイド — レンダリング、DOMパリティ、JavaScriptのcanonical、サイトマップ、Next.jsが基盤とするレンダリング方式のトレードオフを扱う完全ガイドです。このNext.jsガイドは、その上にあるフレームワーク固有の層です。
- テクニカルSEO初心者ガイド — レンダリングとクロールを大きな全体像の中で説明します。
自分の講演
- JavaScript SEO — Ungagged 2019(SlideShare)— フレームワークがフロントエンドとバックエンドを分ける方法、Googlebotのレンダリングを解説しています。(注:その資料の動的レンダリング推奨は現在古く、Googleは非推奨にしています。)
業界の資料
- Metadata and OG Images(Next.js文書)— App Routerのメタデータシステム、
metadataBase、OG画像生成。 - generateMetadata API Reference(Next.js文書)— 静的/動的メタデータとHTML制限ボット/ストリーミングメタデータの挙動。
- sitemap.xml File Convention(Next.js文書)—
app/sitemap.ts、generateSitemaps()、ローカライズ/画像サイトマップ。 - Next.jsサイトでよくあるSEO問題(Salt Agency)— ソフト四〇四とLCP失敗の実データを含む50サイトの監査研究。
- インデックス処理全体でGoogleがJavaScriptを扱う方法(Vercel)— nextjs.org自身のサーバービーコンによるレンダリング時期データ。
- Next.js SEO完全ガイド(Strapi)— レンダリング方式、メタデータ、構造化データを扱う解説。
- SEOを考慮したApp RouterとPages Routerの比較(Wisp)— SEO視点から2つのルーターを比較。
- r/TechSEO — レンダリングとインデックス問題を扱うコミュニティ。
引用に値する統計
- レンダリングは通常速いが、時に非常に遅い。 Vercelがnextjs.orgの3万7千以上のサーバービーコン対を分析したところ、レンダリング時間の中央値は約10秒、90パーセンタイルは約3時間、99パーセンタイルは約18時間でした。主要コンテンツをレンダリングキュー待ちにしたくない理由です。 Source
- 実際のNext.jsサイトではCWVとソフト四〇四が広く見られる。 Salt Agencyが50サイトを監査したところ、41/50がソフト四〇四(
200ステータスの404ビュー)を返し、LCPのしきい値を満たしたのは3/50だけでした。next/imageにpriorityを付け、正しいステータスコードを返して初めて、フレームワークのCWV上の利点が生きます。 Source
変更履歴
2026年8月13日に更新。
編集概要と記録された変更の詳細。変更の詳細
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
完全な比較は利用できません — この改訂の以前のスナップショットがアーカイブされていません。
2026年7月18日に更新。
編集概要と記録された変更の詳細。変更の詳細
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
完全な比較は利用できません — この改訂の以前のスナップショットがアーカイブされていません。