画像配信のCache-ControlとCDN無効化 2025 — 早く・壊さず・確実に刷新

公開: 2025年9月23日 · 読了目安: 3 · 著者: Unified Image Tools 編集部

TL;DR

  • ファイル名バージョニングが最強。CDNパージは最終手段に
  • immutable + 長寿命 or 短命 + SWR のいずれかで方針統一
  • 変わるHTML・変わらない画像の役割分担を明確に

内部リンク: INP中心の画像配信最適化 2025 — decode/priority/スクリプト協調で体感を守る, 2025年のレスポンシブ画像設計 — srcset/sizes 実践ガイド, P3 画像配信ガイド 2025 — sRGB フォールバックと実機確認の手順, CDNエッジリサイズの落とし穴 2025 — アップスケール/キャッシュ/画質の三角形

キャッシュモデル(3つの型)

  1. immutable 長寿命 + バージョニング(推奨)

    • Cache-Control: public, max-age=31536000, immutable
    • 変更はファイル名ハッシュで表現(例 logo.abcd1234.png
    • CDNパージは事故時のみ。HTMLから新URLへ参照を更新
  2. 短命 + stale-while-revalidate(SWR)

    • Cache-Control: public, max-age=60, stale-while-revalidate=86400
    • 初回は即時提供、裏で更新。ニュース系や頻繁に更新されるサムネに適合
  3. 検証型(ETag/Last-Modified 中心)

    • 更新頻度は低いがバージョニングが難しい場合に限定。304 多用はヘッダ往復がコスト

実装ポイント

  • Cache-Control: public, max-age=31536000, immutable + ファイル名ハッシュ
  • SWRは初回即時描画/裏で更新が適合する静的画像で

ETag/Last-Modified の使い分け:

  • immutable運用では原則不要(URLが変われば常に新鮮)
  • SWR/短命では帯域節約のため ETag を併用可。ただし生成コスト/分散の整合を考慮

バージョニング戦略

  • コンテンツアドレス(ハッシュ)でURLを不変化 → CDNのパージ頻度を最小化
  • 変わるHTMLと変わらない画像の役割分担を明確化
  • フォーマット交渉は Vary: Accept のみに限定し、DPRはURLパラメータで

ハッシュの粒度

  • 全画像共通のビルドIDではなく、ファイル単位の内容ハッシュを推奨(誤パージ/過剰無効化を防止)
  • 動的変換(リサイズ/フォーマット)を行う場合は、リクエストパラメータ(w, q, fmt, dpr)を順序規範化してキャッシュキーに含める

体系的なパージ

  • エンティティごとのサロゲートキーを採用し、変更時はマニフェストで一括指定
  • パージ後はバックグラウンドでウォームアップ(代表サイズを先読み)

サロゲートキー例

  • sk:article:12345(記事IDに紐づく全サムネ)
  • sk:logo(ブランドロゴ全サイズ)
  • マニフェスト: article:12345 -> [/thumbs/a1.., /thumbs/a2..]

ウォームアップ

失敗しやすいポイント

  • HTML は更新したが、古い URL をどこかが参照→ キャッシュ残存。検索/置換の自動化 + パージの冪等実行
  • 変換URLのパラメータ順序がバラバラ → キャッシュ断片化。サーバ側で正規化
  • Vary を増やしすぎる → キャッシュ効果が消失。Accept のみで十分、DPR は URL へ

FAQ(運用判断)

  • Q. すべて immutable にすべき?
    • A. ほとんどの静的画像は YES。頻繁に更新するサムネ/動的生成は SWR + 短命も有効
  • Q. CDN のパージが遅い/効かない
    • A. サロゲートキー運用とウォームアップを組み合わせる。最悪ケースはファイル名変更で確実に切替
  • Q. 画像CDNで『自動変換』を使うとキャッシュキーが肥大化
    • A. 許可パラメータを限定し丸める。w は固定バケット、q はプリセットのみに

チェックリスト

  • [ ] 不変URL/バージョン付与を徹底
  • [ ] パージはマニフェスト駆動、手動都度は最小化
  • [ ] ウォーマー/監視が稼働

追加チェック:

  • [ ] 変換パラメータの正規化(順序/範囲/丸め)
  • [ ] VaryAccept のみに固定、DPR は URL に
  • [ ] ハッシュは内容ベース、共通ビルドIDは避ける

関連記事