静的サイトで記事ページが孤立する典型原因(ページネーション・JS 描画一覧・クエリ付き URL)
サイトマップに載っていても、静的 HTML に `<a href>` が無ければ Google には孤立ページに見える。一覧のページネーションで古い記事が押し出される、アーカイブの記事リンクを JS で描画している、`?tag=` のクエリ URL が重複を生む、の 3 つが典型。アーカイブを静的に全記事リンク化し、記事末尾に関連記事を置くことで解消する。
調査時点: 2026-06。Astro 製ブログ(Cloudflare Pages 配信)での観察から一般化した内容。
症状の形
- サイトマップには全 URL があるのに、登録済みはトップと一覧の一部、記事はごく少数
- URL 検査で「検出 - インデックス未登録」「参照元ページ: 検出されませんでした」「前回のクロール: 該当なし」
- 手動でインデックス登録をリクエストしても、登録済み・未登録のどちらのリストにも現れない
原因 1: ページネーションによる押し出し
トップ / は静的 HTML で記事へリンクしているが、一覧が /, /2/, /3/ とページネーションされていると、新記事が増えるたびに古い記事は後ろのページへ押し出され、最終的にどのページからもリンクされなくなる。「全記事への恒久的なリンクハブ」が別に必要になる。
原因 2: アーカイブ一覧を JS で描画している
/archive/ のようなハブページで、記事一覧やタグ絞り込みをクライアント側 JavaScript で描画していると、静的 HTML にはタグ・カテゴリのリンクしか無く、記事への <a> が一本も出ない。Google から見ると中身の空いたアーカイブで、記事はリンクグラフ上で孤立する。
対処は、ビルド時(getCollection('posts') など)に全記事リンクを静的 HTML として出力し、JS は絞り込みの表示 / 非表示トグルだけを担当させる。document.write 等で後から差し込む構造は避ける。
検証はビルド成果物で行う。
grep -c '/posts/' dist/archive/index.html全記事分の <a> が出ていること、JS 無効でも全記事に辿れることを確認する。
原因 3: クエリ付き URL の重複
/archive/?tag=Go のような絞り込み URL がクロールされると、/archive/ の重複として「重複 - ユーザーが正規 URL を選択していません」に分類され、クロール枠を消費する。次のどちらかに統一する。
<meta name="robots" content="noindex, follow">を付ける<link rel="canonical" href="https://example.com/archive/">を出す
いずれにしても、絞り込み結果を別 URL としてクロールさせない。
補強策
| 優先 | 対策 |
|---|---|
| 高 | アーカイブをビルド時に全記事リンク化する |
| 中 | 各記事末尾に関連記事(同タグ上位 3〜5 本)か最近の記事(直近 5 本)を静的に置く。パンくずも静的 <a> で |
| 中 | 被リンクを数本作る(X / Zenn へのクロス投稿、canonical はブログ側) |
| 低 | @astrojs/sitemap の serialize で各エントリに lastmod を付け、サイトマップを再送信する |
| 低 | 全ページに自己参照 canonical(<link rel="canonical" href={Astro.url.href}> 相当、正規化した URL で)を出す |
| 任意 | RSS に全記事が含まれているか確認し、フッターに「最近の投稿」を全ページ共通で静的に置く |
デプロイ後の確認
- ハブページ(
/archive/)とトップを URL 検査から再リクエストし、リンクグラフを更新させる - 1〜2 週間後に代表記事を再検査し、「参照元ページ」が「検出されませんでした」から実ページに変わったか見る
- 「検出 - 未登録」「クロール済み - 未登録」の記事数が時間とともに減ることを確認する
関連
更新履歴
- 2026-06-16: 初版(ローカル調査ノート)
- 2026-10-17: Wiki へ移植、概念ページとして再構成