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-sagan→ 404(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からリンクをたどってプリレンダリングする。しかし:
/blogページが全記事をリストしていないpathフィールドで設定した新URLへのリンクがない- クローラーがそのページを発見できない
- 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-pagehttps://log.eurekapu.com/some-page/
この問題は今回のサイトマップ修正(trailing slash統一)で時間をかけて解消される見込み。
今後の確認事項
- インデックス反映時間: 通常は数分〜数時間で反映。Search Consoleの「URL検査」で即時確認可能
- 重複の解消: canonical URLの統一により、数週間〜数ヶ月で重複が減少する見込み
- 404ページの解消:
/prompts/配下のページがSSGで生成されるようになり、404が減少する見込み
関連ドキュメント
- trailing-slash-duplicate-index - trailing slash重複問題の経緯
- ssg-scalability-challenges - SSGメモリ問題
- url-structure-improvement - URL構造改善計画