CLAUDE LABEN
2.1.273 — 接続まわりがまとめて整理されました。LLM ゲートウェイ向けの 5 ヘッダが opt-in で追加され、MCP が再接続を諦めたときにも通知が出ます09/29 — 廃止予定表にある claude-sonnet-4-5 の日付は残り 12 日ですが、これは「最も早い場合」の暫定日です。現在も Active で、公開モデルの廃止は最低 60 日前に告知されますMCP — セッションを畳まずに繋ぎ直したい、という要望が続いています。切断の通知は出るようになりましたが、再接続そのものはまだ手元の操作に委ねられていますNEW — 定期タスクが動く日と動かない日があったのは、フォルダを1つしか指定していなかったからでしたWINDOWS — Cowork が最初のタスクから失敗するときは、原因を探す前に開発者モードとセットアップの状態を確認しますHANDOFF — 会話が重くなった原稿を次のチャットへ渡すとき、要約に必ず残しておく項目を先に 3 つ決めておきます2.1.273 — 接続まわりがまとめて整理されました。LLM ゲートウェイ向けの 5 ヘッダが opt-in で追加され、MCP が再接続を諦めたときにも通知が出ます09/29 — 廃止予定表にある claude-sonnet-4-5 の日付は残り 12 日ですが、これは「最も早い場合」の暫定日です。現在も Active で、公開モデルの廃止は最低 60 日前に告知されますMCP — セッションを畳まずに繋ぎ直したい、という要望が続いています。切断の通知は出るようになりましたが、再接続そのものはまだ手元の操作に委ねられていますNEW — 定期タスクが動く日と動かない日があったのは、フォルダを1つしか指定していなかったからでしたWINDOWS — Cowork が最初のタスクから失敗するときは、原因を探す前に開発者モードとセットアップの状態を確認しますHANDOFF — 会話が重くなった原稿を次のチャットへ渡すとき、要約に必ず残しておく項目を先に 3 つ決めておきます
記事一覧/Claude Code
Claude Code/2026-08-19中級

一度キャッシュに載った500ページは、直しても消えません

修正をデプロイしたのに壊れたページが出続けたことがあります。原因はコードではなくエッジキャッシュでした。ステータスコードだけを見る保存判定が、200で返る壊れたHTMLを通していたのです。本文の完全性で保存可否を決めるガードの実装と、運用で調整した誤検知の線引きを、実際に踏んだ経緯とともに書きました。

Claude Code254Cloudflare Workers16エッジキャッシュNext.js8運用設計26

プレミアム記事

朝、記事ページの表示崩れを直して push しました。ビルドは通り、デプロイも成功しています。手元で確認すると正しく表示されます。

それなのに、別の端末で開くと崩れたままでした。

シークレットウィンドウでも同じです。もう一度デプロイしても変わりません。コードを何度読み返しても、直っているはずのものが直っていない。この時点で私は、まだキャッシュを疑っていませんでした。ステータスは 200 だったからです。

原因はエッジキャッシュでした。壊れた HTML が正常な応答として保存され、そのまま配信され続けていたのです。修正版のコードは、そのキャッシュの後ろで誰にも読まれずに待っていました。

200 で返る壊れたページ、という盲点

キャッシュの保存判定を書くとき、多くの実装はステータスコードを見ます。私もそうしていました。2xx なら保存し、4xx / 5xx なら保存しない。素直で、たいていの場合は正しく動きます。

問題は、アプリケーションが壊れているのに 200 を返す経路があることでした。

Next.js の App Router では、レンダリング中に例外が起きるとエラー境界(error.tsx / global-error.tsx)が代わりの UI を返します。この応答は「エラー画面を正常に返した」ものなので、HTTP としては 200 です。同じことは、記事本文の読み込みだけが失敗して枠だけが描画された場合にも起きます。ページとしては成立しているのに、中身が空です。

つまりステータスコードは、そのページが読者にとって意味のある内容かどうかを何も語っていません。

応答の状態HTTP ステータスステータス基準の保存判定読者にとって
正常なページ200保存する問題なし
エラー境界が返した画面200保存する壊れている
本文が空のまま描画された枠200保存する壊れている
途中で切れた HTML200保存する壊れている
サーバーエラー500保存しない壊れているが再取得される

表の2行目から4行目が、私が踏んだ穴です。これらは一度保存されると、TTL が切れるまで、あるいは明示的に無効化するまで残り続けます。原因が数分で解決していても、配信は何時間も壊れたままになります。

ここで一番厄介なのは、障害が「継続している」のではなく「固定されている」ことです。ログを見ても、その瞬間のエラーはとっくに収まっています。再現しようとしても再現しません。それでも読者には壊れたページが届きます。デプロイのたびに首を傾げていた朝の正体は、これでした。

事故の起点は、たいてい一瞬の失敗です

なぜ壊れた HTML が生まれたのかも書いておきます。

個人開発で運用している4サイトは、Next.js を Cloudflare Workers に載せています。記事の本文 HTML は JSON のメタデータとは分けて配置し、静的アセットのバインディング経由で読み出す構成です。Worker のサイズ上限に収めるための設計で、その経緯は別の記事に書きました(Cloudflare Workers の 62 MiB 制限とコンテンツ分割アーキテクチャ)。

この構成では、本文の取得は「アセットを読む」という一手が挟まります。デプロイ直後の数秒間、あるいは瞬間的な失敗で、この読み取りが空を返すことがありました。頻度としては稀です。1日に何度も起きるものではありません。

ただ、稀であることは救いになりませんでした。キャッシュは、稀な失敗を恒久的な状態に変える装置だからです。1万リクエストのうち1回だけ失敗しても、その1回がキャッシュに載れば、残りの9,999人はその失敗を見ます。

確率の低さで安心していると、この非対称性を見落とします。私自身、稀にしか起きないのだから急がなくてよいと考えていて、実際には毎日誰かが同じ壊れたページを見ていました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
キャッシュに保存してよい応答かどうかを、ステータスコードではなく本文の完全性で判定できるようになります
壊れたページが配信され続ける事故を、キャッシュへ書き込む一箇所のガードで未然に止められるようになります
修正を出しても直らないとき、コードとキャッシュのどちらを疑うかを最初の数分で切り分けられるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

Claude Code2026-04-21
Claude Code で Next.js × Cloudflare Workers の本番運用を乗り越える — バンドルサイズ危機からエッジキャッシュ設計まで、実際に詰まった場所と解決策を全公開
Next.js アプリを Cloudflare Workers で運用するとき、Claude Code は単なるコード補完ツール以上の存在になります。62 MiB バンドル制限・エッジキャッシュ設計・Content Split Architecture など、実運用で詰まった問題と解決策を完全公開。
Claude Code2026-04-06
Claude Code × Next.js 15 App Router 本番開発:RSC・Server Actions・認証・テスト・デプロイまで
Claude CodeとNext.js 15 App Routerを組み合わせた本番開発の完全ガイド。RSC設計・Server Actions・データフェッチング戦略・Auth.js v5認証・Vitestテスト・Cloudflareデプロイまで、実務で使える実装パターンを網羅します。
Claude Code2026-09-01
MCPサーバが十数個を超えてから、起動直後の一覧を信用しなくなりました
起動直後に「接続できません」と並ぶサーバのうち、こちらから手を打てるものは一部だけです。応答なし・起動失敗・プロトコル拒否を分けて返すプローブを実装し、14台構成で逐次22.03秒が並列5.09秒まで縮むところ、待ち時間を詰めると健全なサーバが失敗に化けるところを実測で残しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます