• #SEO
  • #Google Search Console
  • #sitemap
  • #Nuxt
  • #SSG
完了

Google Search Consoleでインデックス率が低い問題の調査

問題の状況

Google Search Consoleで以下の状況が確認された。

  • サイトマップ送信: 343ページ
  • インデックス登録済み: 76ページ(約22%)
  • 未登録: 24ページ
    • 「見つかりませんでした(404)」: 11ページ
    • 「クロール済み・インデックス未登録」: 13ページ

初期の仮説(誤り)

仮説1: trailing slashの不一致

サイトマップのURL:

https://log.eurekapu.com/animation-demo

実際にアクセスすると308リダイレクト:

Location: /animation-demo/

「Googleはリダイレクトが発生するURLを正規URLではないと判断し、インデックスを避ける」と仮説を立てた。

仮説2: lastmodが全て同じ日付

<lastmod>2026-01-03</lastmod>

すべてのURLで同じ日付だと、Googleがlastmodを信頼しなくなると考えた。

これらの仮説の問題点

技術的には正しい指摘だが、根本原因ではなかった

trailing slashの問題は以前から認識されており、Cloudflareでリダイレクト設定済み。根本的な解決策としてcanonicalタグで対応していた(詳細: trailing-slash-duplicate-index)。

真の根本原因: SSGプリレンダリングの問題

調査で判明した事実

「クロール済み・インデックス未登録」のURLを確認:

# 例: /2025-12-19/node-process-termination-rules/
curl -sI "https://log.eurekapu.com/2025-12-19/node-process-termination-rules"
# → 301リダイレクト → /node-process-termination-rules

curl -s "https://log.eurekapu.com/node-process-termination-rules/" -o /dev/null -w "%{http_code}"
# → 404

リダイレクト先が404を返している

再現確認: ブログからの遷移 vs 直接アクセス

操作結果
/blogからリンクをクリックページが表示される(Vue Routerのクライアントサイドナビゲーション)
そのページをリロード(F5)404 Page Not Found

DevToolsのNetworkタブで確認:

  • prompt-sagan → 301(リダイレクト)
  • prompt-sagan404(document)

なぜブラウザでは見えるのにGoogleには404なのか

404ページのHTMLを確認:

<meta name="robots" content="noindex, nofollow" />
...
<script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false">
  • HTTPステータス: 404
  • robots: noindex, nofollow
  • data-ssr: false(クライアントサイドレンダリング)

つまり:

観点動作
ユーザー(ブラウザ)JavaScriptが実行され、Vue Routerがクライアントサイドでページを表示 → 見える
Google(クローラー)404ステータス + noindex → インデックスしない

これはSPA fallbackの動作。SSGで生成されていないURLにアクセスすると、Nuxtはクライアントサイドでルーティングするが、サーバーは404を返す。

なぜSSGで生成されていないのか

Nuxtの設定:

nitro: {
  prerender: {
    crawlLinks: true,
    routes: ['/blog', '/'],
  }
}

crawlLinks: true//blogからリンクをたどってプリレンダリングする。しかし:

  1. /blogページが全記事をリストしていない
  2. pathフィールドで設定した新URLへのリンクがない
  3. クローラーがそのページを発見できない
  4. SSGでHTMLが生成されない

調査結果の訂正

当初「/blogページが全記事をリストしていない」と分析したが、誤りだった

実際の原因: /prompts/ディレクトリがSSGから意図的に除外されていた

// nuxt.config.ts (2026-01-01時点)
ignore: [/\?/, /\/prompts\//],

これはOOMエラー対策として設定されたものだが、リロード時に404になる副作用があった。

対策(実施済み)

  • /prompts/の除外を解除(nuxt.config.ts修正)
  • サイトマップのtrailing slash修正をデプロイ
  • lastmod正確化の修正をデプロイ
  • ビルド&デプロイして確認(2026-01-04完了)

サイトマップの修正(実施済み)

初期仮説に基づいて実施した修正。根本原因ではないが、SEOのベストプラクティスとして有効。

1. trailing slashを追加

// generate-sitemap.mjs
const canonicalUrl = route === '/' ? route : `${route}/`

2. lastmodを実際のファイル更新日時に変更

const stats = statSync(fullPath)
const mtime = stats.mtime.toISOString().split('T')[0]

追加の発見: 重複インデックス問題

Google検索でsite:log.eurekapu.comを実行すると399件の結果が表示された。サイトマップには343ページしかないため、約56件が重複してインデックスされている。

原因: trailing slashの有無による重複

  • https://log.eurekapu.com/some-page
  • https://log.eurekapu.com/some-page/

この問題は今回のサイトマップ修正(trailing slash統一)で時間をかけて解消される見込み。

今後の確認事項

  1. インデックス反映時間: 通常は数分〜数時間で反映。Search Consoleの「URL検査」で即時確認可能
  2. 重複の解消: canonical URLの統一により、数週間〜数ヶ月で重複が減少する見込み
  3. 404ページの解消: /prompts/配下のページがSSGで生成されるようになり、404が減少する見込み

関連ドキュメント