同じ URL の静的ファイルを差し替えたときのキャッシュ
一言まとめ
同じ名前で画像を差し替えると、Cloudflare のエッジキャッシュとブラウザキャッシュの 2 段に古い版が残る。エッジは URL 単位のパージで消せるが、ブラウザ側は max-age が切れるか強制再読み込みするまで残る。
古い版が残る 2 つの層
Cloudflare Pages にデプロイしても、同じ URL のファイルは次の 2 か所に古い版が残ることがある。
| 層 | 残る期間 | 消し方 |
|---|---|---|
| Cloudflare のエッジキャッシュ | Cache-Control の max-age まで | ダッシュボードか API でパージする |
| 閲覧者のブラウザキャッシュ | 同じく max-age まで | 閲覧者が強制再読み込みする。サイト側からは消せない |
max-age=604800(7 日)が付いた画像なら、デプロイ後も最大 7 日間は古い画像が表示される。HTML は新しくなっているのに画像だけ古い、という状態になりやすい。
どの層に残っているかを curl で調べる
# 通常の URL。cf-cache-status と age でエッジのキャッシュ状態を見るcurl -sI https://example.com/images/shot.webp | grep -i "content-length\|cf-cache-status\|^age\|cache-control"
# クエリを付けるとエッジのキャッシュキーが変わり、オリジン(デプロイ済みの版)が返るcurl -sI "https://example.com/images/shot.webp?v=$(date +%s)" | grep -i "content-length\|cf-cache-status"
# 中身が新しい版かはハッシュで比べるcurl -s https://example.com/images/shot.webp | md5summd5sum public/images/shot.webp- 通常の URL が
cf-cache-status: HITでageが大きく、クエリ付きの URL だけが新しいサイズなら、エッジに古い版が残っている。 - curl では新しい版が返るのにブラウザで古く見えるなら、ブラウザキャッシュに残っている。
www付きのホストも別の URL として確認する。
エッジキャッシュを URL 単位でパージする
- ダッシュボードでゾーンを開き、Caching → Configuration に進む(直リンク:
https://dash.cloudflare.com/?to=/:account/:zone/caching/configuration)。 - Purge Cache の Custom Purge を選ぶ。
- Purge by で URL を選び、完全な URL を入れる。ワイルドカードは使えない。
- Purge を押す。
パージ後の最初のリクエストは MISS になり、オリジンから取り直した版が再びキャッシュされる。Purge Everything はゾーン全体のキャッシュを消すため、1 ファイルの差し替えでは使わない。
ブラウザ側の確認
- そのページで強制再読み込みする(Ctrl+Shift+R、Mac は Cmd+Shift+R)。
- シークレットウィンドウで開く。
ほかの閲覧者のブラウザに残った古い版は、max-age が切れるまで消えない。
差し替えのたびにパージしないための方法
- ファイル名を変える:
shot-2026-10.webpのように差し替えごとに URL を変える。HTML が新しい名前を参照するので、エッジもブラウザも古い版を使わない。 - パスごとに max-age を短くする: Pages なら
public/_headersで、差し替えるファイルのパスだけCache-Controlを短くする。ほかの静的ファイルの長いキャッシュは変えずに済む。
/images/* Cache-Control: public, max-age=3600関連
更新履歴
- 2026-10-12: 初版