Next.jsのGoogleインデックス:App RouterとPages Routerの完全ガイド
SSG、SSR、ISR、クライアントコンポーネントを使いこなし、すべてのルートをGoogleに発見してもらいましょう
このガイドの内容
Next.jsは本番アプリ向けに最も人気のあるReactフレームワークであり、そのSSG、SSR、ISR、クライアントサイドレンダリングにまたがるレンダリングモデルは、強力な可能性と微妙なインデックスの落とし穴の両方を生み出します。初回リクエストで完璧なHTMLを返すルートもあれば、JavaScriptの実行を要求する空のシェルを返すルートもあります。
本ガイドでは、App RouterとPages Routerの両方について、Metadata API、generateStaticParams、sitemap.tsによるプログラマティックなsitemap、robots.tsの設定、構造化データ、そしてNext.jsページがGooglebotに空白に見える原因となる特定の落とし穴を解説します。
レンダリング戦略とインデックスへの影響
Next.jsには4つのレンダリング戦略があり、それぞれがGooglebotがコンテンツをどのように(あるいは見えるかどうか)見るかに異なる影響を持ちます。
Static Site Generation(SSG)はインデックスのゴールドスタンダードです。ページはビルド時に完全なHTMLにレンダリングされ、静的ファイルとして配信されます。Googlebotは完全なHTMLをすぐに受け取り、JavaScriptの実行は不要です。App Routerでは、動的関数(cookies()、headers()、searchParamsなど)を呼び出さないServer Componentはデフォルトで静的にレンダリングされます。Pages Routerでは、getStaticPropsをエクスポートすることでSSGを実現します。
Server-Side Rendering(SSR)はリクエストごとにHTMLを生成します。GooglebotはSSGと同じく完全なHTMLを受け取りますが、ページはキャッシュされません(キャッシュヘッダーを追加しない限り)。SSRはApp Routerでは、動的関数の使用、またはルートセグメントでexport const dynamic = "force-dynamic"を設定することでトリガーされます。Pages RouterではgetServerSidePropsを使用します。SSRはインデックスにとって信頼性が高いですが、クロールリクエストごとに完全なレンダリングがトリガーされるため、SSGより遅くなります。
Incremental Static Regeneration(ISR)はハイブリッドです。ページはビルド時に静的に生成され、キャッシュから配信され、設定可能な時間間隔の後にバックグラウンドで再生成されます。App Routerでは、ページまたはレイアウトでexport const revalidate = 3600(秒)を設定することでISRを実現します。Pages Routerでは、getStaticPropsの戻り値にrevalidateを追加します。ISRはインデックスに優れています — Googlebotは高速な静的HTMLを取得し、コンテンツは適度に新鮮さを保ちます。
クライアントサイドレンダリング(CSR)はインデックスの問題が発生する場所です。コンポーネントに"use client"が付いており、useEffectフックでデータをフェッチする場合、ブラウザ(およびGooglebot)に送信される初期HTMLにはローディング状態以外何も含まれていません。Googlebotはある程度JavaScriptを実行できますが、JavaScriptは数時間または数日後に行われる可能性のある二次インデックスパスで処理されます。そして複雑なクライアントサイドのデータフェッチは、Googleのレンダリング環境でしばしば静かに失敗します。
ルール: インデックスさせたいコンテンツは、ハイドレーション後にクライアントサイドJavaScriptで読み込まれるのではなく、初期のサーバーレンダリングHTMLに存在しなければなりません。
Metadata API:generateMetadataと静的メタデータ
App Routerは、Pages Routerの古い<Head>コンポーネントを置き換える強力なMetadata APIを導入しました。メタデータを定義する方法は2つあります:静的エクスポートと動的なgenerateMetadata関数です。
静的メタデータの場合、任意のpage.tsxまたはlayout.tsxファイルからmetadataオブジェクトをエクスポートします。これは既知の固定メタデータを持つページに適しています。
メタデータがデータに依存する動的ルート(ブログ記事のスラッグなど)の場合は、generateMetadataを使用します。この非同期関数はルートパラメータを受け取り、データをフェッチしてメタデータを動的に構築できます。
重要なポイント: generateMetadataはサーバー上で実行されるため、Googlebotリクエストに対して常に実行されます。代わりに"use client"コンポーネントでdocument.titleやサードパーティのヘッドマネージャーを使用してメタデータを設定すると、Googlebotは初期HTMLパース時にそれを拾わない可能性があります。常にサーバーサイドのMetadata APIを通じてメタデータを定義してください。
Metadata APIはメタタグの全範囲をサポートします:
titleとdescription- ソーシャル共有用の
openGraphとtwitter - インデックス制御用の
robots - hreflangとcanonical URL用の
alternates - Google Search Console用の
verification - ファビコン用の
icons
canonical URLには、alternates.canonicalフィールドを使用します。言語バリアントを持つページの場合、alternates.languagesにロケールコードとURLのマップを設定します。
Pages Routerでは、"next/head"からHeadをインポートし、コンポーネント内のそれにメタタグを配置することでメタデータを処理します。これは依然として機能しますが、制限があります:Headコンテンツはレンダリング後にのみ処理され、複雑にネストしたHeadコンポーネントはタグの重複を引き起こす可能性があります。新規プロジェクトを始める場合は、App RouterのMetadata APIを使用してください。
sitemap.tsとsitemap.xmlでsitemapを生成する
Next.js App Routerは、appディレクトリに配置された特別なsitemap.ts(またはsitemap.xml/route.ts)ファイルを通じて、プログラマティックなsitemap生成をサポートします。最もシンプルなアプローチは、sitemapエントリの配列を返すデフォルト関数をエクスポートするapp/sitemap.tsを作成することです。
これにより、/sitemap.xmlが自動的に生成されます。関数は開発時にはリクエスト時に、本番時にはビルド時(静的エクスポートの場合)または各リクエスト時(動的レンダリングの場合)に実行されます。
50,000を超えるURLを持つ大規模サイトの場合は、sitemapインデックスパターンを使用します。app/sitemap.tsを作成して、複数のサブsitemapを指すsitemapインデックスを返し、各サブsitemapに対して個別のルートハンドラ(例:app/sitemaps/[id]/route.ts)を作成します。Googleのsitemap仕様は、1つのsitemapファイルあたり最大50,000のURL、インデックス内に最大500のsitemapファイルを許可しています。
開発者が犯す致命的なミスは、動的ルートをsitemapに含めるのを忘れることです。アプリに/blog/[slug]のようなルートがある場合、sitemap関数はデータベースまたはCMSにクエリして、すべての有効なスラッグを取得し、それぞれに対してURLを生成する必要があります。sitemapに単に/blog/[slug]をリストするのは意味がありません — Googleは実際の解決済みURLを必要としています。
Pages Routerには、組み込みのsitemap生成はありません。2つの選択肢があります:
next-sitemapnpmパッケージを使用する(pagesディレクトリとgetStaticPathsの出力を読み取ることでビルド時にsitemapを生成)pages/api/sitemap.tsにカスタムAPIルートを作成して、XMLを動的に生成する
next-sitemapパッケージが最も一般的な選択であり、サーバーサイドsitemap、robotsTxt生成、複数sitemapの分割をサポートします。
動的ルート:generateStaticParamsとフォールバック動作
動的ルート(app/blog/[slug]/page.tsx)は、Next.jsアプリケーションで最も一般的なインデックスのギャップの原因です。適切な設定がないと、動的ルートはビルド時にプリレンダリングされない可能性があり、Googlebotは最初の訪問時に404またはローディング状態に遭遇します。
App Routerでは、動的ページからgenerateStaticParams関数をエクスポートして、ビルド時に特定のパスをプリレンダリングします。この関数によって返されるすべてのスラッグは、静的に生成されたページになります。
しかし、generateStaticParamsに存在しないスラッグはどうなるのでしょうか?これはdynamicParamsエクスポートによって制御されます:
- `dynamicParams = true`(デフォルト) — Next.jsは一致しないスラッグをオンデマンドでサーバーレンダリングを試み、結果をキャッシュします
- `dynamicParams = false` — 一致しないスラッグは404を返します
SEOの観点では、デフォルト(true)が通常正しい選択です。なぜなら、新しく公開されたコンテンツが完全な再ビルドなしでレンダリングできるからです。
Pages Routerでの同等の設定はfallbackパラメータを持つgetStaticPathsです:
- `fallback: false` — 不明なパスに対して404を返します
- `fallback: true` — 最初のリクエストでローディングページをレンダリングします(Googlebotにはローディング状態が表示され、インデックスにとっては最悪です)
- `fallback: "blocking"` — ページが完全にレンダリングされるまでレスポンスをブロックし、その後キャッシュします
SEOの観点では、Pages Routerでは常に`fallback: "blocking"`を使用してください。
generateStaticParamsとISRの相互作用は重要です。動的ページでrevalidateを設定すると、プリレンダリングされたページは再検証期間後にバックグラウンドで再生成されます。generateStaticParamsにない新しいスラッグは、最初のリクエスト時にレンダリングされ(dynamicParamsがtrueの場合)、その後ISRでキャッシュされます。この組み合わせは両方の長所を提供します:既知のページに対する高速な静的配信と、新しいコンテンツに対するオンデマンドレンダリングです。
robots.ts、noindexルール、クロール制御
App Routerは、/robots.txtをプログラマティックに生成するapp/robots.tsファイルをサポートしています。
robots.txtのNext.js固有の重要な考慮事項:
/api/ルートを常にブロック(JSONを返し、HTMLではない)/_next/data/をブロック(クライアントサイドナビゲーション用のJSONデータで、スタンドアロンページとしてインデックスされるべきではない)- 認証済みダッシュボードのルートをブロック
/_next/static/をブロックしないでください — これにはGooglebotがページを適切にレンダリングするために必要なCSSとJSファイルが含まれています
ページレベルのnoindex制御には、Metadata APIのrobotsフィールドを使用します。検索結果から除外したいページのメタデータエクスポートでrobots: { index: false }を設定します。これは以下に適しています:
- 認証ページ(
/login、/register) - ユーザーダッシュボード
- 認証背後のAPIドキュメント
- パーソナライズされたコンテンツを持つあらゆるページ
ミドルウェア(プロジェクトルートのmiddleware.ts)もインデックスに影響を与える可能性があります。ミドルウェアが認証またはロケール検出のためにリダイレクトを実行する場合、Googlebotがリダイレクトループに陥らないようにしてください。
一般的に安全なパターンは、認証されていないユーザーを/dashboardから/loginにリダイレクトするミドルウェアです — これは問題ありません。なぜなら、/dashboardはとにかくnoindexにしたいからです。しかし、地理位置に基づいてリダイレクトするミドルウェアは、Googlebot(米国ベースのIPからクロール)を常に米国版にトラップし、他のロケールバージョンがインデックスされないようにする可能性があります。
Google Search ConsoleのURL検査ツールでミドルウェアの動作をテストし、Googlebotが実際に何に遭遇しているかを確認してください。
リッチな検索結果のための構造化データとOpen Graph
構造化データ(JSON-LD)は、Googleでリッチリザルトを獲得するために重要です:星評価、FAQアコーディオン、パンくず、記事の公開日など。App Routerでは、最もクリーンなアプローチは、<script type="application/ld+json">タグをレンダリングするJsonLd Server Componentを作成することです。
このコンポーネントは、Schema.orgタイプ(Article、FAQPage、Product、BreadcrumbList、Organization)に一致する型付きpropsを受け入れ、それらをscriptタグにシリアル化する必要があります。これはServer Componentなので、JSON-LDはGooglebotが受信する初期HTMLに存在します — クライアントサイドの実行は不要です。
Open Graphタグの場合は、Metadata APIエクスポートのopenGraphフィールドを使用します。以下を含めます:
og:titleとog:descriptionog:image(寸法付き)og:url、og:type、og:locale
Twitter Cardsには、twitterフィールドを使用します。これらのタグはHTMLの<head>に存在しなければならず、Metadata APIが自動的に処理します。
Next.jsアプリケーションでの一般的なミスは、クライアント側で構造化データを生成することです。"use client"コンポーネントを使用して商品レビューをフェッチし、その後集計評価を含むJSON-LDブロックを生成すると、Googlebotの初期HTMLパースには構造化データが含まれない可能性があります。常にServer Componentまたは`generateMetadata`で構造化データを生成してください。 GoogleのRich Results Testツールを使用すると、特定のURLをテストして構造化データがクローラーに見えるかどうかを確認できます。
パンくず構造化データは、ネストされたルートを持つNext.jsアプリにとって特に価値があります。アプリの構造が/blog/category/post-slugである場合、Home、Blog、カテゴリーページ、現在の記事のアイテムを含むBreadcrumbListスキーマを生成します。これにより、Googleに明示的なナビゲーション階層情報が提供され、検索結果に生のURLではなくパンくず表示が表示される可能性があります。
ステップバイステップガイド
ルートごとのレンダリング戦略を監査する
next.config.tsでグローバル出力設定を確認します。各page.tsxをレビューして分類します:動的関数 = SSR、revalidateエクスポート = ISR、generateStaticParams = プリレンダリング、useEffectでデータフェッチする"use client" = CSR(インデックスのリスク)。各ルート、その戦略、重要なコンテンツが初期HTMLに表示されるかどうかのスプレッドシートを構築してください。
すべてのルートにMetadata APIを実装する
App Routerの各page.tsxとlayout.tsxに、静的なメタデータエクスポートまたはgenerateMetadata関数を追加します。最低でも、すべてのページに固有のtitleとdescriptionが必要です。
- ルートレイアウト(
app/layout.tsx)には、title.templateフィールドを使用してデフォルトメタデータを設定します(例:title: { template: "%s | YourApp", default: "YourApp" }) /blog/[slug]のような動的ルートには、コンテンツをフェッチしてページ固有のメタデータを返すgenerateMetadataを実装します- canonical URLを明示的に定義するため、すべてのページに
alternates.canonicalを追加します - アプリが複数言語をサポートする場合は、
alternates.languagesを設定します
"use client"コンポーネントでメタデータを設定しないでください — 常にサーバーサイドのメタデータエクスポートを使用してください。
sitemap.tsとrobots.tsを作成する
sitemapエントリの配列を返すデフォルトのasync関数をエクスポートするapp/sitemap.tsを作成します。すべての動的コンテンツ(ブログ記事、商品ページ、カテゴリーページ)についてデータベースまたはCMSにクエリし、それぞれに対して完全なURLを生成します。
優先度の値を設定します:
- ホームページに1.0
- 主要なランディングページに0.8〜0.9
- 通常のコンテンツに0.5〜0.7
各エントリにlastModified日付を含めます。
/api/、/_next/data/、/admin/、認証済みルートをブロックし、それ以外のすべてを許可し、sitemap URLを指定するルールを返すapp/robots.tsを作成します。
デプロイし、ブラウザで/sitemap.xmlが有効なXMLを返し、/robots.txtが有効なディレクティブを返すことを確認してください。
generateStaticParamsで動的ルートをプリレンダリングする
すべての動的ルートからgenerateStaticParamsをエクスポートして、ビルド時に有効なパスをプリレンダリングします。dynamicParams: trueとrevalidateを組み合わせて、新しいコンテンツが最初のリクエストでサーバーレンダリングされ、ISR経由でキャッシュされるようにします。Pages Routerでは、Googlebotにローディング状態を提供しないように、fallback: trueの代わりにfallback: "blocking"を使用してください。
重要なコンテンツをクライアントコンポーネントから移動する
インデックスさせたいコンテンツを表示する各"use client"コンポーネントをレビューします。コンポーネントがuseEffect、useSWR、またはReact Queryを使用してデータをフェッチし、クライアントサイドでレンダリングする場合、Googlebotはそのコンテンツを見ない可能性があります。
リファクタリングパターン: データフェッチをServer Componentの親に移動し、クライアントコンポーネントにpropsとしてデータを渡します。クライアントコンポーネントはインタラクティビティ(クリックハンドラ、状態)を処理できますが、初期コンテンツはサーバーレンダリングされたHTMLに存在する必要があります。
テスト: ブラウザでJavaScriptを無効にして各ページをロードします。JavaScriptなしで見えるものが、Googlebotが初期HTMLパースで見るものとほぼ同じです。
リッチリザルトのために構造化データを追加する
JSON-LD構造化データ用の再利用可能なServer Componentを作成します。適切なスキーマタイプを追加します:
- ブログ記事 —
headline、author、datePublished、dateModified、imageを含むArticleスキーマ - 商品ページ —
name、description、price、aggregateRatingを含むProductスキーマ - すべてのネストされたページ — ナビゲーション階層用の
BreadcrumbListスキーマ - ホームページ —
Organizationスキーマ
ライブURLを入力して、GoogleのRich Results Testを使用して、すべての構造化データの実装を検証します。次に進む前に、エラーや警告をすべて修正してください。
忘れないでください: すべての構造化データは初期HTMLに表示されるように、Server Componentに配置する必要があります。
IndexBoltで重要なURLを送信して監視する
IndexBoltを通じて、ホームページ、主要なランディングページ、優先度の高いコンテンツを送信します。新しいアプリの場合、20〜50のURLでGoogleの理解を数日早めることができます。Search ConsoleのURL検査で監視します — ページフェッチが完全なHTMLを表示し、ローディング状態ではないことを確認します。「検出 — インデックス未登録」のルートがあればレンダリングの問題を調査してください。
よくある問題と解決方法
ページがGooglebotに空白コンテンツやローディングスピナーを表示する
原因: コンテンツが"use client"コンポーネント内でuseEffectまたはクライアントサイドデータフェッチライブラリを使用してフェッチされています。初期サーバーレンダリングHTMLにはローディング状態(スピナー、スケルトン、空のdiv)のみが含まれます。Googlebotの初期HTMLパースはコンテンツを見ず、その二次JavaScriptレンダリングパスはAPI認証、CORSの問題、レンダリングタイムアウトによって失敗する可能性があります。
解決方法: データフェッチをServer Componentに移動するか、静的生成とgenerateStaticParamsを使用します。インタラクティビティが必要なクライアントコンポーネントにpropsとしてデータを渡します。Pages Routerでは、クライアントサイドフェッチの代わりにgetStaticPropsまたはgetServerSidePropsを使用します。DevToolsのレンダリングされたDOMではなくページソースを表示してテストしてください — ソースには実際のコンテンツテキストが含まれているはずです。
generateStaticParamsにないページに対して動的ルートが404を返す
原因: 動的ルートにexport const dynamicParams = falseが設定されており、generateStaticParamsで返されないスラッグは404を生成します。Pages Routerでは、fallback: falseを持つgetStaticPathsも同じように動作します。ビルド時に存在しなかった新しく公開されたコンテンツには到達できません。
解決方法: dynamicParamsをtrue(デフォルト)に設定し、新しく生成されたページがISR経由でキャッシュされるようにrevalidate期間を追加します。Pages Routerでは、fallback: falseからfallback: "blocking"に切り替えます。次に、sitemap.tsがすべての現在のコンテンツを動的にクエリして、ビルド時にプリレンダリングされていなくても新しいページがsitemapに表示されるようにしてください。
動的に生成されたページがsitemapに含まれていない
原因: sitemap.tsファイルが静的なURLリストで書かれており、動的コンテンツのためにデータベースやCMSにクエリしません。または、ビルド時にnext-sitemapを使用してsitemapが生成されましたが、新しいコンテンツが公開された後にビルドが再実行されませんでした。新しいブログ記事、商品ページ、カテゴリーページがsitemapから欠落しています。
解決方法: sitemap.tsを書き直して、リクエストされるたびにコンテンツソース(データベース、ヘッドレスCMS API、ファイルシステム)を動的にクエリするようにします。ISRベースのサイトの場合、定期的に再生成されるようにsitemapルートにrevalidateを設定します。Pages Routerでnext-sitemapを使用している場合、サーバーサイドsitemap生成を設定するか、コンテンツが変更されたときにリビルドをトリガーするcronジョブを設定してください。
ミドルウェアのリダイレクトがGooglebotのロケール固有ページへのアクセスを妨げる
原因: ロケール検出ミドルウェアはAccept-Languageヘッダーを読み取るか、IPベースのジオロケーションを使用して訪問者をロケール固有のパス(例:/en-us/、/fr/)にリダイレクトします。Googlebotは主に英語ヘッダーで米国ベースのIPからクロールするため、常に米国英語版にリダイレクトされます。他のロケールのページは決してクロールまたはインデックスされません。
解決方法: ジオロケーションまたはAccept-Languageに基づいてGooglebotをリダイレクトしないでください。代わりに、デフォルトロケールのコンテンツを提供し、ロケールバリアントについてGoogleに伝えるためにhreflangタグ(Metadata APIのalternates.languages経由で設定)に依存してください。ミドルウェアで、User-AgentでGooglebotをチェックしてロケールリダイレクトをスキップするか、さらに良いのは、主要なロケールシグナルとしてhreflangを使用し、ミドルウェアリダイレクトは実際のユーザーの利便性としてのみ使用することです。
loading.tsxファイルがプレースホルダーコンテンツを表示してインデックスされる
原因: Next.js App Routerは、ページがレンダリングされている間にReact Suspenseを介して即時ロードUIを表示するためにloading.tsxを使用します。ページがSSR(動的レンダリング)を使用する場合、Googlebotの初期リクエストは実際のページの代わりにloading.tsxのコンテンツを受け取る可能性があります。これは特に、遅いデータフェッチを持つページで起こりやすいです。
解決方法: 重要なSEOコンテンツを持つページには、動的レンダリングよりも静的生成またはISRを優先してください。動的レンダリングが必要な場合は、ストリーミングレスポンスがGooglebotのタイムアウト前に実際のコンテンツを配信するように、データフェッチがすばやく(5秒未満で)完了することを確認してください。重要なサーバーレンダリングコンテンツがすでに存在した後にページを強化するクライアントコンポーネントに、重いデータフェッチを移動することを検討してください。
Next.jsのImageコンポーネントがクロールバジェットを使い切るURLを生成する
原因: Next.jsのImageコンポーネントは、/_next/image?url=...&w=...&q=...パスを介して画像を最適化します。各幅と品質の組み合わせは固有のURLを生成します。これらのURLがrobots.txtでブロックされていない場合、Googlebotは実際のページコンテンツではなく画像最適化エンドポイントのフェッチにクロールバジェットを費やす可能性があります。
解決方法: Disallow: /_next/imageをrobots.tsファイルに追加して、Googlebotが画像最適化URLを直接クロールするのを防ぎます。ページの<img>タグで参照される実際の画像は、ページのHTMLを通じて発見可能でインデックス可能なままです。これにより、画像を多用するサイトで大幅なクロールバジェットが節約されます。
プロのヒント
よくある質問
GooglebotはNext.jsアプリケーションでJavaScriptを実行しますか?+
はい、Googlebotには最新版のChromiumに基づくJavaScriptレンダリングエンジンがあります。ただし、JavaScriptレンダリングは、初期HTMLクロールから数時間または数日後に行われる可能性のある二次インデックスパスで発生します。これは、JavaScript実行後にのみ表示されるコンテンツが遅延してインデックスされることを意味します — そして複雑なクライアントサイドデータフェッチ(特に認証されたAPIへのもの)は、Googleのレンダリング環境で完全に失敗する可能性があります。信頼性のあるインデックスのために、Server Component、getStaticProps、getServerSidePropsを使用して、すべての重要なコンテンツが初期サーバーレンダリングHTMLに存在することを確認してください。
SEOのためにApp RouterとPages Routerのどちらを使うべきですか?+
App Routerは、組み込みのMetadata API、sitemap.ts、robots.ts、デフォルトでコンテンツをサーバーサイドでレンダリングするServer Componentを含む、優れたSEOツールを備えています。Pages RouterはSEOに対しては問題なく機能しますが、より多くの手作業が必要です:メタデータにnext/headコンポーネント、sitemapにnext-sitemapのようなサードパーティパッケージ、サーバーレンダリングにgetStaticProps/getServerSidePropsが必要です。新規プロジェクトには、App Routerが明確な選択肢です。既存のPages Routerプロジェクトには、移行の緊急の必要はありません — 適切なgetStaticProps/getServerSidePropsと機能するsitemapが用意されていることを確認することに焦点を当ててください。
ISRはGoogleインデックスにどのように影響しますか?+
Incremental Static Regenerationはインデックスに優れています。Googlebotは静的にキャッシュされたHTMLを即座に受け取り(応答時間の速さがクロール効率を向上させます)、コンテンツは新鮮さを保つためにバックグラウンドで再生成されます。唯一の考慮事項は再検証期間です:revalidateを3600(1時間)に設定すると、コンテンツの変更がキャッシュされたページに反映されるまで最大1時間かかる可能性があります。時間に敏感なコンテンツについては、より短い再検証期間を使用するか、ウェブフック経由でオンデマンド再検証をトリガーしてください。Googleの観点から、ISRページは静的ページと同じように動作します — 高速で、完全にレンダリングされ、信頼性があります。
Next.jsページがSearch Consoleで「検出 — インデックス未登録」と表示されるのはなぜですか?+
このステータスは、Googleが(sitemapまたは内部リンクを通じて)URLを見つけたが、まだレンダリングしてインデックス化していないことを意味します。Next.jsアプリでは、これは一般的に次のような場合に発生します:(1)ページがクライアントサイドレンダリングを使用しており、Googlebotの初期HTMLクロールがコンテンツを見つけなかったため、ページの優先順位を下げた;(2)ページがGoogleが価値が低いと考える薄いコンテンツを持っている;(3)サイトが新しく、Googleがまだ十分なクロールバジェットを割り当てていない;(4)ページに別の場所を指すcanonicalタグがある。URL検査ツールを使用してGooglebotとしてページをフェッチし、レンダリングされたHTMLを確認してください。それが空であるか、ローディング状態を表示している場合は、修正すべきレンダリングの問題があります。
Next.jsでクエリパラメータを持つページのcanonical URLをどのように扱いますか?+
App RouterのMetadata APIでは、クエリパラメータなしでalternates: { canonical: "https://yourdomain.com/page" }を設定します。これにより、追加されたトラッキングパラメータ、ページネーション、フィルタパラメータに関係なく、基本URLがcanonicalバージョンであることをGoogleに伝えます。クエリパラメータが意味のある異なるコンテンツを作成するページ(ページネーションされた検索結果など)では、各ページに固有のcanonical URLを生成するか(alternates: { canonical: "https://yourdomain.com/search?page=2" })、ページ1を指す単一のcanonicalを使用し、Googleが後続のページを発見するために内部リンクに依存してください。
IndexBoltをNext.jsで使用して新しいページのインデックスを高速化できますか?+
もちろんです。多くのNext.jsサイトがISRまたはオンデマンドレンダリングを使用しており、Googleが従来のクロールで発見する静的URLを持たないため、IndexBoltはNext.jsアプリケーションにとって特に価値があります。新しいコンテンツを公開した後、IndexBolt APIまたはダッシュボードを使用してURLをGoogleのインデックスパイプラインに直接送信します。これは特に、オンデマンドで生成されるeコマース商品ページ、ヘッドレスCMSセットアップでの新しいブログ記事、機能ローンチの一部としてデプロイされるランディングページに効果的です。ノーマルモードは定期的なコンテンツに、Instantモードは商品ローンチや時間に敏感なページに使用してください。