📖 11分で読める

【Git #4】ブログ記事を消したのにまだ見える!—— Cloudflare Pages の落とし穴


💡 この記事について AIアシスタント(OpenClaw/スピカ)との会話を元にした学習記録です。 内容は変更される可能性があるため、実際の開発では公式ドキュメントを確認の上、ご自身の判断でお願いします。


この記事で分かること:

  • ブログ記事を削除してもサイトに表示され続けるケースがあること
  • CDNキャッシュの基本的な仕組み
  • 全部試してダメだった時の力技(上書き+リダイレクト)
  • 「まだ分かっていないこと」の正直な共有

「消したはずなのに、まだいる」

セブ
セブ
スピカ、ちょっと困ったことが起きた。ブログの記事を1本、非公開にしたくてGitHubのリポジトリから削除したんだよね。デプロイも成功した。なのに……まだ本番サイトに表示されてるんだけど。
スピカ
スピカ AI
え、デプロイ成功してるのに? ちょっと確認してみよう。まずプレビューURLの方は見た?
セブ
セブ
あ、そっか。Cloudflare PagesってデプロイごとにプレビューURLが発行されるんだよね。見てみよう。

プレビューでは消えてるのに、本番だけ残ってる

セブ
セブ
プレビューURL(最新デプロイ)の方を確認したら……消えてた!ちゃんとホームにリダイレクトされてる。でも本番ドメインの方は、まだ記事が丸ごと表示されてる。
スピカ
スピカ AI
ということは、最新のデプロイには記事が含まれていないのに、本番ドメインでは古い内容が配信されてるってことだね。
セブ
セブ
そうそう。プレビュー → OK。本番 → まだ見える。この差って何なの?
スピカ
スピカ AI
一番ありそうなのはCDNキャッシュだね。Cloudflare Pagesの仕組みをおさらいしてみよう。

CDNキャッシュの仕組み

スピカ
スピカ AI
まず、ブログの記事が読者に届くまでの流れはこうなってるよ。
flowchart LR
  A["🏠 オリジン\nPages本体"] --> B["🌐 CDN\n世界中のキャッシュ"]
  B --> C["💻 ブラウザ\nユーザー"]
スピカ
スピカ AI
オリジンはCloudflare Pagesの本体。デプロイしたファイルが置いてある場所。CDNは、そのコピーを世界中のサーバーに配っておく仕組み。読者がアクセスすると、自分に一番近いCDNサーバーからコピーが返される。だから速いんだよね。
セブ
セブ
つまりオリジンは最新なのに、CDNに古いコピーが残ってるから「消したのに見える」と。
スピカ
スピカ AI
そう。理屈としてはそうなるはず。じゃあ、CDNキャッシュを消してみよう。

試したこと、全部ダメだった

セブ
セブ
ここから怒涛の試行錯誤が始まるんだけど……結論から言うと、全部ダメだった
#試したこと結果
1Cloudflare「Purge Everything」(全キャッシュ削除)❌ まだ見える
2対象URLだけ個別パージ(Custom Purge)❌ まだ見える
3デプロイをリトライ(Retry deployment)❌ まだ見える
4開発モードをON(CDN完全バイパス)❌ まだ見える
スピカ
スピカ AI
……4番目、見た?
セブ
セブ
見た。開発モードってCDNを完全にスキップして、オリジンに直接つなぐんだよね?
スピカ
スピカ AI
そう。こういう仕組みだよ。
flowchart TD
  A["🔄 通常モード"] --> B["ユーザー → CDN → 表示"]
  C["🛠️ 開発モード"] --> D["ユーザー → オリジン直接 → 表示"]
スピカ
スピカ AI
開発モードにすると、CDNのキャッシュを完全に飛ばして、Pages本体から直接レスポンスが返る。これでも表示されるということは……CDNキャッシュが原因じゃない可能性がある。

「CDNキャッシュじゃない?」—— 想定外の展開

セブ
セブ
正直、ここで詰まった。CDNキャッシュが犯人だと思ってたのに、開発モードでも消えないってどういうこと?
スピカ
スピカ AI
いくつか仮説は立てられるけど、正直に言うと確定的な原因は分からなかった
セブ
セブ
仮説としてはどんなものがある?
スピカ
スピカ AI
たとえば――
  • Cloudflare Pagesのアセット保持: Pagesは過去のデプロイのファイルを一定期間保持する仕様があるのかもしれない
  • カスタムドメインの紐付け: プレビューURLと本番ドメインで、配信元が微妙に異なる可能性
  • エッジの伝播遅延: パージ命令が全世界のエッジに伝播するまでのタイムラグ
スピカ
スピカ AI
ただ、どれも「開発モードでも表示され続ける」理由の決定的な説明にはならないんだよね。
セブ
セブ
うーん。原因を突き止めたい気持ちはあるけど、今はまず記事を見えなくするのが優先だよね。力技で行こう。

力技で解決:消せないなら上書きする

スピカ
スピカ AI
OK。「削除」がうまくいかないなら、上書きすればいい。3段階で潰していこう。

ステップ1:記事の中身を上書き

セブ
セブ
まず、同じURLで記事ファイルを再作成して、中身を別の内容に置き換えた。これでデプロイすると、古い内容が新しい内容で上書きされるよね。

ステップ2:リダイレクト設定

スピカ
スピカ AI
次に、プロジェクトの public/ フォルダに _redirects ファイルを作って、該当URLをブログ一覧にリダイレクトさせるよ。
/blog/対象記事のパス/* /blog/ 301
/blog/対象記事のパス/ /blog/ 301
スピカ
スピカ AI
301 は「恒久的な移動」を意味するステータスコード。検索エンジンにも「このURLはもうここに移動したよ」と伝わるから、SEO的にも安心だよ。

ステップ3:draft: true で一覧からも非表示

セブ
セブ
さらに、記事のフロントマターに draft: true を追加した。Astroはビルド時にdraftの記事をスキップするから、ブログ一覧にも表示されなくなるんだよね。
---
title: '記事タイトル'
description: '...'
pubDate: 'Feb 07 2026'
tags: ['tag1', 'tag2']
draft: true
---
スピカ
スピカ AI
つまり3重のブロックだね。
対策効果
中身を上書き仮にページが表示されても、古い情報は見えない
_redirectsそもそもページにたどり着く前にリダイレクトされる
draft: trueブログ一覧にも表示されない
セブ
セブ
ベルトとサスペンダーどころか、ベルトとサスペンダーとガムテープみたいな……
スピカ
スピカ AI
まあ、消えない相手には多段防御が正義だよ。

分かったこと・分からなかったこと

✅ 分かったこと

項目内容
プレビューと本番は別最新デプロイはプレビューURLで確認できる。本番と一致するとは限らない
CDNパージだけでは不十分「全削除」しても即座に反映されないケースがある
削除より上書きが確実同じパスで新しいファイルをデプロイすれば確実に内容が変わる
多段防御は有効上書き + リダイレクト + draft:true の3層で万全に

❓ まだ分からないこと

  • 開発モード(CDN完全バイパス)でもなぜ表示されたのか
  • Cloudflare Pages の古いアセット保持の正確な仕組み
  • 「ファイルを削除してデプロイ」で完全に404にする正式な方法

まとめ:「消す」は想像以上に難しかった

セブ
セブ
今回の一番の学びは、静的サイトで「消す」は、思ったほど簡単じゃないということかもしれないね。
スピカ
スピカ AI
そうだね。ファイルをサーバーに「置く」のは簡単だけど、一度CDNで世界中に「配った」コンテンツを「完全に消す」のは、全然違う問題なんだよね。
セブ
セブ
手紙を出すのは簡単だけど、出した手紙を回収するのは大変、みたいな話だね。
スピカ
スピカ AI
うまい例えだね。結局、なぜ開発モードでも表示され続けたのかはまだ分かっていないから、引き続き調査していきたいと思ってるよ。分かったらまた記事にします。

シリーズ目次

  1. 【Git #1】Antigravityとgit commit & pushを覚えた日
  2. 【Git #2】git pushしたらブログが公開される仕組み
  3. 【Git #3】ブランチとプルリクエスト — 「下書き」で安全に試す仕組み
  4. 【Git #4】ブログ記事を消したのにまだ見える! ← 今ここ

📝 補足 この記事はAIアシスタント(OpenClaw/スピカ)との会話を元にした学習記録です。内容は変更される可能性があるため、実際の開発では公式ドキュメントを確認の上、ご自身の判断でお願いします。