measurement error
被リンクの数え方を誤り、存在しない問題を直しかけた記録
「内部リンクが1本も無いページが31本ある。リンク枠の無いページが181本あるから、枠を追加する改修をしよう」——ここまで計画を立ててから、数えていたのは相対パスのリンクだけで、このサイト群は絶対URLでもリンクしていたことに気づきました。2026年8月の測定エラーの記録です。
このサイトはAnthropicの公式サイトではありません。Claude Codeの機能・料金・提供範囲は変わる可能性があるため、重要な判断の前には公式のドキュメントと自分のアカウント設定を確認してください。
先に結論:測定器は、指示を作る前に1件の実物で検算する
この失敗の教訓は数え方の細部ではありません。測定結果から作業計画を作る前に、測定結果のうち1件を実物で開いて確かめる。これだけで防げました。
「被リンク0本」と出たページを1つ開いてソースを見ていれば、https://ドメイン/パス/形式のリンクが13本並んでいるのが見えたはずです。実際には計画を立て、改修方針を報告した後で開きました。順番が逆でした。
測定→計画→検算ではなく、測定→検算→計画。特に「ゼロ」「全部」「1本も無い」のような極端な数字が出たときほど、測定器の側を先に疑う価値があります。
何を数え落としたか
被リンクの集計は、各ページのHTMLから内部リンクを抜き出して数えます。使っていたパターンは相対パス形式だけでした。
// 数えていた形(相対パス)
// リンク先の指定が「スラッシュ始まりのパス」のもの
// 数え落とした形(絶対URL)
// リンク先の指定が「https:// 自分のドメイン + パス」のもの
この2つはブラウザにとって同じ行き先ですが、正規表現にとっては別の文字列です。書いた本人は相対パスに統一したつもりでも、過去のテンプレートや別の生成処理が絶対URLで書いていれば、サイトには両方が混ざります。混ざっているかどうかは、測る前には分かりません。
全1,194ページを調べ直すと、1,193ページが絶対URL形式でも内部リンクを張っていました。テンプレートの世代によって書式が違っていたためです。両方を数えると、50ページで被リンク数が変わりました。「0本」と判定していたページの実際の値は7本、といった具合です。
| 誤った測定での判定 | 実際 |
|---|---|
| リンクゼロの行き止まり:31ページ | 絶対URLでリンクされていた。行き止まりではない |
| リンク枠の無いページ:181ページ | 枠が無いのは設計上の別テンプレートで、本文中にリンクを持つ。欠陥ではない |
危なかったのは、修正が「成功」してしまうこと
このエラーの怖さは、間違った計画を実行してもエラーが出ないことです。181ページにリンク枠を追加する改修は、技術的には問題なく完了します。差分もきれいで、検査も通ります。ただ、直している問題が存在しないだけです。
存在しない問題の修正には、実害が2つあります。
- 本来のリンク構造と重複したリンクブロックが181ページに増える。増えた後で「これは要らなかった」と気づいても、取り除く作業は追加するより難しい
- その作業時間で、実在する問題(このときは被リンクとGSC表示の突き合わせで見つかる別の取りこぼし)が後回しになる
実測で言うと、誤った基準では「3本以下が328ページ」、正しい基準では301ページでした。数字の差は1割弱でも、「どのページを直すか」のリストは大きく入れ替わりました。合計がおおむね合っていることは、個々の判定が合っていることを保証しません。
検算は1ページ・1分で足りる
「測定器を検算する」というと大掛かりに聞こえますが、実際にやったのは次のことだけです。
- 集計結果から「被リンク0本」と出たページを1つ選ぶ
- サイト内検索やgrepで、そのページのパスを含むページを探す
- 1件でも見つかったら、測定器がそのリンクをなぜ数えなかったかを調べる
grep -rl "対象ページのパス" --include="*.html" . | head
このgrepはhref属性の書式を問わず、パス文字列そのものを探します。測定器と違う方法で数えるから、測定器の癖が見えるわけです。同じ正規表現で数え直しても検算になりません。
実測では、grepが7ファイルを返した時点で「0本」の判定が誤りだと確定しました。ここまで1分です。181ページの改修計画を作ってから気づくのと、計画の前に気づくのとでは、失う時間が2桁違います。
数え直した後の基準
測定器を直した後、被リンクの集計は次の形にしています。
- 相対パスと絶対URLの両方を抜き出し、パスに正規化してから集合にする(同じリンクを二重に数えない)
- 自分自身へのリンクは除外する
- 集計の前に、任意の1ページで「実物のソースのリンク数」と「集計値」が一致することを確かめる
// 相対パスと絶対URLの両方を抜き出し、パスへ正規化してから集合に入れる
// パターン: 相対 …「スラッシュ始まりのパス」 / 絶対 …「https:// 自ドメイン + パス」
const rel = 抜き出す(html, 相対パスの形);
const abs = 抜き出す(html, 絶対URLの形).map(パスへ正規化);
const links = new Set([...rel, ...abs]); // 重複はここで消える
links.delete(自分のパス);
3つ目が本題です。正規表現をどれだけ丁寧に書いても、テンプレートの書式は将来また変わります。集計のたびに1件だけ実物と突き合わせる1行の手間が、181ページぶんの無駄な改修より安い。これがこの記録の要点です。
よくある質問
31ページが行き止まりでないなら、なぜ検索に出ていなかったのですか?
被リンクはあってもクロールの優先度が低い、ページ自体の主題が弱いなど、別の原因でした。測定を直した後にGSCの表示実績と突き合わせ、実在する弱いページだけを対象にやり直しました。「原因の候補が消えた」ことも測定を直した成果のうちです。
絶対URLと相対パス、どちらに統一すべきですか?
このサイト群では統一していません。統一の書き換え自体がリスクを持つ規模だからです。統一より「測定が両方を数えること」を優先しました。