記事のリンク切れをまとめて点検する|テンプレートのリンク健診スキル

配布しているテンプレートのリンク健診スキル(link-audit)で、このサイトの記事26本と固定ページ6本の外部リンク147件・内部リンク121件を点検しました。使い方と、403やリダイレクトの読み方を実際の結果で説明します。

AI(Claude)が書き、運営者が確認して公開した記事です。分担と確かめたもの →

目次

記事に貼った公式ページのリンクは、相手のサイトの模様替えで知らないうちに切れたり、別のページへ飛ばされるようになったりします。記事が10本を超えると、全部を手で開いて回るのは続きません。

このサイトで配っている「アリス編集室」テンプレートの Lv.3 には、リンクをまとめて点検する link-audit(リンク健診)スキルが入っています。2026年10月12日にこのサイトの記事26本と固定ページ6本を点検したところ、外部リンク147件のうち直す候補は12件でした。点検と集計、記事の作成は AI(Claude)が行いました。

先に結論: 本当に直すべきリンクは、機械の判定より少なかった

  • 外部リンク147件のうち、そのまま開けたのは105件。 残り42件は「切れ」「リダイレクト」「要目視」に分かれた
  • 「切れ(404)」の2件は、記事のリンクではなかった。 ページの頭に入っているフォントの事前接続の指定で、直す必要はない
  • 「要目視(403)」の22件は、切れとは限らない。 AI(Claude)がブラウザで開いた3件はすべて開けた。ボットとして断られた可能性が高い
  • 直す候補は12件。 移動先へ直リンクにするものが11件、料金ページが無くなってトップページへ送られるものが1件
  • 内部リンク121件に切れは無かった。 ただし、画像とページ内の位置(# のあと)はこのスクリプトでは調べていない
  • 点検の目安は月1回。 大きな書き直しの前と、収益が急に落ちたときにも回す

点検の全結果は report.md に置きました。

表: link-audit で使うファイル
ファイル 役割
.claude/skills/link-audit/SKILL.md 点検の手順、結果の仕分けの基準、広告リンクの扱いを書いた指示書
scripts/link_check.py 点検の本体。公開フォルダの HTML からリンクを集め、外部リンクには実際にアクセスし、内部リンクはファイルがあるかを見る
config.yaml 公開フォルダの場所、サイトのドメイン、広告・計測のドメインの一覧を読む

スキルは Lv.3 に入っています。scripts/link_check.py は Python の標準の機能だけで外部にアクセスし、--root と --base-url を渡せば config.yaml が無くても動く作りです(今回は config.yaml を使って動かしました)。ファイルはテンプレートのページから読めます。

いちばん大事な決まり: 広告のリンクには触らない

link-audit は、広告や計測のリンク(アフィリエイトのリンクなど)には HTTP でアクセスしません。中身を見るためのアクセスでも、広告サービスの側では自分でクリックしたように数えられる恐れがあります。広告サービスによっては、自分の広告を自分でクリックすることを規約で禁じています(このサイトは広告を使っていないので、各社の規約は確かめていません)。成果の統計も汚れます。

そのため、スクリプトは次のように動きます。

  • config.yaml の metrics.affiliate_domains に書いたドメインと、--deny で渡したドメインには、アクセスしない。件数と、どのページにあるかだけを数える
  • rel="sponsored" が付いたリンクも同じ扱いにする
  • 広告のドメインの一覧が空のままだと、外部リンクの点検を始めずに止まる

このサイトは広告を置いていないので、affiliate_domains は空です。そのまま実行すると、スクリプトは次のように止まりました(実際の出力)。

AIに送る文
中止: DENYLIST が空です。広告・計測ドメインへ誤ってリクエストしないよう、HTTP 実査を始めません。
  - config.yaml の metrics.affiliate_domains にドメインを書く、または --deny で渡す
  - 広告を置いていないサイトなら --deny none を明示する
  - 動作確認だけなら --offline を使う

広告を置いていないサイトだけ、--deny none を付けて「広告は無い」とはっきり伝えます。広告を置いているサイトでは、使っている広告サービスのドメインが一覧にすべて入っているかを、運営者が先に確かめます。広告リンクが生きているかどうかは、各広告サービスの管理画面で確かめます。

使い方

1. 先にサイトをビルドする

スクリプトが読むのは、記事の原稿ではなく、ビルドしたあとの公開フォルダ(このサイトでは public/)の HTML です。原稿を直したあとは、先にビルドします。

2. スキルに頼むか、スクリプトを直接動かす

Claude Code に「リンク切れチェックして」「リンク監査して」のように頼むと、スキルが手順を読み込みます。スキルの手順は、config.yaml を読んでから、次のコマンドを動かすことです。

bash
python -X utf8 scripts/link_check.py --config config.yaml --out reports/link_audit_YYYYMMDD.md

広告を置いていないサイトは、最後に --deny none を足します。主なオプションは次のとおりです。

表: 2. スキルに頼むか、スクリプトを直接動かす
オプション 意味
--deny ドメイン,ドメイン アクセスしないドメインを足す。広告が無いサイトは none
--offline 外部へはアクセスせず、内部リンクと件数だけを見る(動作確認用)
--limit 5 調べる HTML のファイル数を絞る(動作確認用)
--timeout 12 1件を待つ秒数(既定は12秒)
--root・--base-url 公開フォルダとサイトの URL を、config.yaml の値の代わりに指定する

外部リンクには、1件ごとに HEAD(中身を取らない軽い問い合わせ)を1回送り、失敗したときだけ GET を1回送ります。同じドメインへは1秒以上あけます。

3. レポートを仕分ける

レポートには、スクリプトの判定ごとに一覧が出ます。スキルの仕分けの基準は次のとおりです。

表: 3. レポートを仕分ける
区分 状態 すること
dead 404・410・つながらない 直す。公式の新しい URL を探す
moved 別の URL へ移った 移動先へ直接リンクする
要目視 403・405・429・タイムアウト・SSL ブラウザで開いて目で確かめてから判定する
skipped 広告・計測のドメイン アクセスしていない。件数と場所だけ

スキルは点検とレポートまでで、記事は直しません。直すのはライター役で、直したあとは公開前のレビューを通します。

このサイトで点検した条件

表: このサイトで点検した条件
項目 内容
点検した日 2026年10月12日
対象 記事26本(下書きを含む)と固定ページ6本。ビルドした HTML 32ファイル
広告 無し(--deny none)
ブラウザでの確認(AI(Claude)が開いた) 要目視のうち4件と、リダイレクト先の2件

link_check.py は、公開フォルダの HTML を全部調べます。このサイトの公開フォルダには、記事のほかにテンプレートの説明ページや見本のページもあり、全部で93ファイル・ユニークなリンクは376件でした(外部へはアクセスしない --offline で数えた値)。今回は記事と固定ページに絞るため、対象のファイルだけをスクリプトに渡す小さなラッパー(scoped_check.py)を AI(Claude)が書いて、そこから link_check.py を動かしました。点検の中身はスクリプトのままです。

結果の集計

表: 結果の集計
区分 件数(同じ URL は1件と数える)
外部リンク 147
 そのまま開けた(200) 105
 リダイレクト(moved) 17
 要目視(403) 22
 要目視(タイムアウト) 1
 切れ(404) 2
内部リンク 121
 切れ 0

内部リンク121件の内訳は、各ページの正規の URL の指定(canonical)が32件、どのページにも出るナビとスタイルシートが12件、本文などのリンクが77件です。

結果の読み方: 実際に出た例で

404 でも、記事のリンクとは限らない

「切れ」と判定された2件は、https://fonts.googleapis.com と https://fonts.gstatic.com でした。32ページすべてに出ています。

この2件は、記事の中のリンクではありません。ページの頭にある <link rel="preconnect"> という指定で、「あとでフォントを取りに行くので、先にこのドメインにつないでおく」という意味です。ドメインの一番上の URL そのものを開くわけではないので、そこが 404 を返しても表示には影響しません。フォント本体の URL は 200 で開けていました。

スクリプトは、<a> だけでなく href を持つタグを全部集めます。そのため、スタイルシートや事前接続の指定も点検に入ります。全ページに同じ件数(このサイトでは32ページ)で出てくる URL は、記事ではなくページの枠から来ていると考えて、先に見分けると早く済みます。

403 は「切れ」ではなく「断られた」

要目視の22件は、すべて 403(アクセスを断られた)でした。ドメインで分けると次のとおりです。

表: 403 は「切れ」ではなく「断られた」
ドメイン 件数
www.help-note.com(note のヘルプ) 11
chatgpt.com・claude.ai・openai.com・help.openai.com 7
help.x.com 1
note.com 1
support.distrokid.com・support.tunecore.co.jp 2
合計(ほかにタイムアウト1件) 22

このうち3件を AI(Claude)がブラウザで開くと、3件とも開けました。

  • www.help-note.com の記事1件: 開けた。URL の末尾に記事の題名が付いた形に移った
  • openai.com の利用規約: 開けた。日本語版のページに移った
  • note.com/terms(note の利用規約): 開けた。規約のページは別のドメインに移っていた

403 は、ページが無いのではなく、プログラムからのアクセスをサイトが断っていることが多い返事です。help-note.com の11件がそろって 403 で、ブラウザでは開けたことから、11件まとめて「ボットとして断られた」と見るのが自然です。ただし、help-note.com の11件のうち、ブラウザで確かめたのは1件だけです。403 の22件全体では、確かめたのは3件で、残りの19件は確かめていません。

スキルの基準どおり、403 を機械の判定だけで「切れ」として直してはいけません。直す前に、ブラウザで開きます。

開けても、中身が変わっていることがある

note.com/terms を AI(Claude)がブラウザで開くと、規約のページに「4 日前 更新」と出ていました。リンクは生きていますが、規約は新しくなっています。

このサイトの2本の記事(無料で公開する方法とnoteから独自ドメインへ)は、この規約を引いて「アフィリエイトを一般的に禁止する条項は見当たらない」と書いています。リンクの点検では中身の変化までは分かりません。規約や料金を引いているリンクは、開けたかどうかとは別に、書いてある内容を読み直す候補に入れます。

タイムアウトも、まずブラウザで

https://www.icann.org/rdap は、12秒待っても返事が来ませんでした。AI(Claude)がブラウザで開くと、RDAP(ドメインの登録情報を調べる仕組み)の説明ページへ移り、表示されました。リンクは生きているので、移動先へ直接リンクする候補にしました。

リダイレクトは3種類に分ける

moved の17件は、中身を見ると3種類に分かれました。

表: リダイレクトは3種類に分ける
種類 件数 例 すること
言語の振り分けなど 6 claude.com/pricing → claude.com/ja/pricing、Google のドキュメントに ?hl=ja が付く 直さなくてよい
本当に移った 10 github.com/comfyanonymous/ComfyUI → github.com/Comfy-Org/ComfyUI 移動先へ直接リンクする
トップページへ送られる 1 onamae.com/domain/price/ → onamae.com/ 実質のリンク切れ。新しいページを探す

スクリプトは日本語を優先する設定でアクセスするので、言語でページを分けているサイトは、すべてリダイレクトとして出ます。これは直す必要がありません。

注意が要るのは、トップページへ送られるものです。ステータスは最後に 200 で返ってくるので、「開けた」に見えます。お名前.com の料金ページは、ブラウザで開いてもトップページに送られ、料金の表は出ませんでした。ページが無くなったときに、404 ではなくトップへ送るサイトがあります。移動先がトップページになっている行は、リンク切れとして扱います。

本当に移った10件の中にも、中身を確かめ直すものがあります。Cloudflare の Email Routing のドキュメントは、「Cloudflare Email Service」のドキュメントの中へ移っていました。GitHub の QwenLM/Qwen3.5 は QwenLM/Qwen3.8 に移っていて、リンクの文字と移動先のリポジトリの名前が合っているかを見直す必要があります。

内部リンクの「切れ0件」が意味すること

内部リンク121件は、公開フォルダに同じ名前のファイルがあるかで調べ、切れは0件でした。

このスクリプトは、ページの存在だけを見ています。次の2つは調べていません。

  • 画像(<img src>)。src は集める対象に入っていない
  • ページの中の位置(/make/#draw の #draw の部分)。# のあとは見ず、ページがあれば正常にする

画像の抜けや、見出しの名前を変えたときのページ内リンクの切れは、ブラウザで開いて確かめます。

直す候補の一覧

このサイトの記事は、この記事では直していません。直す候補は次の12件と、規約の読み直し1件です。

表: 直す候補の一覧
記事 リンク 直し方
サイト名とドメインの決め方 お名前.com の料金ページ トップへ送られる。今の料金ページを探して替える
サイト名とドメインの決め方 Cloudflare Registrar の製品ページ 移動先 cloudflare.com/domains/ へ替える
サイト名とドメインの決め方 J-Net21 のページ パスが短くなった移動先へ替える
サイト名とドメインの決め方 ICANN の RDAP 移動先の説明ページへ替える
ローカルAIとは? ComfyUI・safetensors の GitHub 持ち主が移った移動先へ替える
ローカルAIとは? Qwen の GitHub 移動先 Qwen3.8 とリンクの文字が合うかを見て替える
無料で公開する方法 Cloudflare Email Routing 移動先へ替え、Free プランで使えるかを確かめ直す
無料で公開する方法・1つの契約で、複数のサイトを動かす ConoHa WING の料金・機能 移動先が同じ内容かを目で確かめてから替える
1つの契約で、複数のサイトを動かす エックスサーバーのドメイン料金 移動先に料金表があるかを確かめてから替える
生成AIで何ができる? Microsoft Copilot の料金ページ 移動先へ替え、料金を確かめ直す
無料で公開する方法・noteから独自ドメインへ note の利用規約 リンクは生きている。更新された規約で本文の記述を読み直す

URL ごとの一覧は report.md にあります。ConoHa とエックスサーバーの移動先の中身、お名前.com の新しい料金ページは、まだ確かめていません。

点検の頻度の目安

スキルに書かれている目安は次のとおりです。

  • 月1回の定期点検
  • 大きな書き直しの前(直すついでに、切れたリンクも一緒に直せる)
  • 収益が急に落ちたとき(広告リンクの切れが原因のことがある。広告リンクは管理画面で確かめる)

今回の点検では、記事が26本で外部リンクが147件でした。同じドメインへの間隔を1秒あけるため、外部リンクが増えるほど時間がかかります。動作だけを確かめたいときは、--offline か --limit で軽く回します。

気をつけること

  • 広告のドメインの一覧を空のままにしない。 広告が無いサイトだけ --deny none を付ける
  • 403 とタイムアウトは、ブラウザで開いてから決める。 機械の判定だけで直さない
  • 移動先がトップページなら、リンク切れとして扱う。 最後が 200 でも安心しない
  • リンクが生きていても、中身は変わる。 規約・料金を引いているリンクは、内容も読み直す
  • スキルは記事を直さない。 直したあとは、公開前のレビューを通す

使ったもの

表: 使ったもの
項目 内容
動かしたAI Claude Code 上の Claude Opus 5.5
テンプレート アリス編集室 Lv.3 のリンク健診(2026年10月12日時点の版)
点検したもの このサイトの記事26本と固定ページ6本(2026年10月12日のビルド)
記録 report.md(点検結果の一覧)・scoped_check.py(対象を絞るラッパー)

この記事の数字は、2026年10月12日にこの1つのサイトを点検した結果です。リンク先のサイトは変わり続けるので、同じ URL でも日によって結果は変わります。

2026年10月21日に、切れていた1件と移動していた20件を差し替えました(この記事の本文は点検時点の記録のままです)。

このサイトは Cloudflare Workers で公開しています → Cloudflare Workers で独自ドメインで公開する

この記事について

この記事でやった人

やったこと誰が
対象を絞るラッパー scoped_check.py を書き、link_check.py で記事26本・固定ページ6本を点検するAI(Claude)
403・タイムアウト・リダイレクト先をブラウザで開いて確かめる(要目視4件・リダイレクト先2件)AI(Claude)(点検を動かしたのと同じ AI)
結果を仕分けて直す候補を決め、記事にするAI(Claude)
公開前の目視確認と公開の判断運営者

料金や仕様は変わることがあります。検証日より後の変更は、各サービスの公式情報で確かめてください。