Cache-Control・ETag・304の使い分け|更新を早く届ける公開設計
HTMLは再検証、版付き画像・CSS・JSは長期保存という基本設計を図解。no-cacheとno-storeの違い、304、CDN、公開後の確認手順をまとめます。
この記事でわかること
先に答え:HTMLと版付きファイルを同じ期限にしない
更新を早く反映しながら表示を速くする基本は、役割でキャッシュ方針を分けることです。頻繁に内容が変わり、次に読むCSSや画像のURLを決めるHTMLは再検証しやすくします。一方、内容が変わるたびにファイル名へハッシュや版番号を付けるCSS・JavaScript・画像は、長期間保存できます。
| 対象 | URL例 | 方針の例 | 更新方法 |
|---|---|---|---|
| HTML | /about/ | no-cache と検証子 | 同じURLを再検証 |
| 版付きCSS | /app.a1b2.css | 長い max-age, immutable | 内容変更時にURL変更 |
| 版付きJS | /app.c3d4.js | 長い max-age, immutable | 内容変更時にURL変更 |
| 内容固定画像 | /hero.v2.webp | 長期保存を検討 | 差し替え時にURL変更 |
| 個人別ページ | /account/ | private を含める | 共有キャッシュを避ける |
これは出発点です。CMS、CDN、認証、更新頻度、緊急差し替えの方法に合わせて調整します。
no-cacheは「保存禁止」ではない
名前が紛らわしいため、次の違いを先に押さえます。
no-cache:保存済み応答をそのまま再利用する前に、サーバーへ確認する。no-store:応答をキャッシュへ保存しないよう求める。private:ブラウザー等の私的キャッシュには保存できるが、共有キャッシュには保存させない。max-age=秒:保存した応答を新鮮と扱える期間。immutable:URLの内容が変わらないため、期限中の再検証も不要と示す。
MDNは、最新内容を毎回確認したい場合でも、no-store を広く付けるのではなく、no-cache とETag等の検証子を使う方法を説明しています。個人別の内容は private も必要です。no-store は既に保存済みの古い応答を消す命令ではありません。
ETagと304は「本文を送り直さず確認する」仕組み
サーバーが応答へETagを付けると、ブラウザーは古くなった応答を再利用する前に If-None-Match でその値を送れます。サーバー上の現在版と同じなら、本文のない 304 Not Modified を返し、ブラウザーは保存済み本文を使います。変わっていれば 200 OK と新しい本文・ETagを返します。
# 最初の応答
HTTP/1.1 200 OK
Cache-Control: no-cache
ETag: "page-v12"
# 次の確認リクエスト
If-None-Match: "page-v12"
# 同じ内容なら
HTTP/1.1 304 Not Modified
ETag: "page-v12"304はエラーではありません。「キャッシュしている内容が現行版なので本文を送り直さなくてよい」という応答です。反対に、内容を変えたのにETagが同じままなら、誤って304を返し続ける実装になり得ます。ETagの生成と更新単位を確認します。
キャッシュは一か所ではない
「キャッシュを消したのに直らない」のは、保存場所が複数あるためです。ブラウザー、CDN・リバースプロキシ、WordPress等のページキャッシュ、サービスワーカー、アプリ内キャッシュを分けます。
- オリジンサーバーのファイル・データが新しいか。
- オリジン応答の
Cache-Control、ETag、Age等が意図どおりか。 - CDNがどのルールで保存し、どのURLを消去したか。
- ブラウザーが通常再読み込みと強制再読み込みでどう変わるか。
- Service Workerやアプリが独自に応答を保存していないか。
CDNを消去してもブラウザーの長期キャッシュは残り得ます。逆にブラウザーを消してもCDNが古い応答を返せば直りません。「全部消す」前に、各層の応答ヘッダーとURLを記録します。
版付きURLで長期保存する
MDNは、変わらない静的ファイルはURLへ版番号やハッシュを含め、長い max-age を付けるキャッシュバスティングを紹介しています。内容が変わればURLも変わるため、古いファイルが長期保存されていても新しいHTMLは新URLを参照します。
Cache-Control: public, max-age=31536000, immutable長い期限を同じURLの app.js や style.css に付けたまま中身だけ置き換えると、利用者は期限が切れるまで旧版を使う場合があります。長期保存するファイルは、ビルドやCMSが内容変更時にURLを確実に変えることを確認します。
HTMLへ1年の max-age を設定するような構成は、緊急更新でも中間キャッシュへ到達できず、サーバーから消去できないことがあります。MDNも、長い max-age で保存された中間キャッシュの応答をオリジンから能動的に削除する標準手段はないと説明しています。CDN独自のパージ機能がある場合も、対象URLと範囲を運用票へ残します。
公開前後の確認手順
- HTML、CSS、JavaScript、画像、API、個人別ページに分類する。
- 現在のヘッダーとCDNルールをURL単位で取得する。
- HTMLは再検証、版付き資源は長期保存という方針を決める。
- 個人別・Cookie依存の応答に
privateが必要か確認する。 - 新しい版を公開し、HTMLが新しい版付きURLを参照するか確認する。
- 通常アクセス、再読み込み、別端末、未ログイン、ログイン後を確認する。
- 旧版へ戻す場合も、新しいURLまたは確実なパージ手順を使う。
確認例:
curl -I https://example.com/
curl -I https://example.com/assets/app.a1b2.css
curl -I -H 'If-None-Match: "page-v12"' https://example.com/ヘッダーだけを確認するコマンドでも、CDN・プロキシ・認証によって実際のブラウザーと応答が異なることがあります。対象URL、Cookieの有無、Host、圧縮、地域等の条件をそろえます。
失敗したときの分岐
| 現象 | 最初に確認 | 対応の方向 |
|---|---|---|
| HTMLが古い | HTMLのmax-age、CDN、ETag | 再検証方針・パージ対象を確認 |
| HTMLは新しいが見た目が古い | CSS/JSのURLが変わったか | 内容ハッシュ付きURLへ |
| 一部利用者だけ古い | Age、地域CDN、ブラウザー、Service Worker | 層とURLを分けて再現 |
| 毎回200で転送量が大きい | ETag/Last-Modified、条件付き要求 | 304再検証を実装 |
| 変更していないのに毎回ETagが変わる | 圧縮・生成方法・複数サーバー | 安定した版識別子を設計 |
| ログイン内容が他人へ見える恐れ | private、CDNのCookie扱い、Vary | 共有キャッシュを停止し調査 |
| no-storeへ変えたのに旧版が出る | 既存キャッシュ、別層 | no-storeは既存応答削除ではない |
そのまま使えるキャッシュ設計メモ
対象サイト:https://example.com/
HTML:Cache-Control____/ETag____
版付きCSS・JS:URL命名____/max-age____/immutable有無____
画像:差し替え時にURL変更する/しない
個人別ページ:private有無____
CDN:なし/あり(パージ方法____)
Service Worker:なし/あり(更新方法____)
公開確認:HTML版___/CSS版___/JS版___
304確認:If-None-Match___→状態___
ロールバック方法:____
担当:配信___/CDN___/ブラウザー確認___
確認日時(UTC):2026-10-12 19:30キャッシュは「有効か無効か」の二択ではありません。更新単位が違うものへ別の方針を与え、公開時にURL・ヘッダー・保存層を一緒に確認すると、速さと反映の両方を保ちやすくなります。
SITE PORTを検討するときの確認ポイント
サイト制作を依頼する場合は、画面の見た目だけでなく、この記事で扱った設定を誰が担当するか、公開後の変更や障害確認をどこまで依頼できるかを先に確認します。SITE PORTの完成例と編集デモでは、完成イメージと日常的な編集の流れを確認できます。DNS、サーバー、WordPressの定期処理、HTTPヘッダー等は通常の本文編集と同じ範囲で扱えるとは限らないため、必要な作業を具体的に伝え、対応範囲を確認してください。
関連記事
[更新が反映されないとき](/articles/website-update-not-visible)・[画像を軽くする順番](/articles/website-images-size-alt)・[DNSのTTLと切り替え準備](/articles/dns-ttl-before-server-move)
出典・確認情報
確認日:2026-10-12 / 公式情報の要点と編集部の提案を整理しています。価格・機能・条件は変更される場合があります。
MDN:HTTP cachingMDN:Cache-Control headerMDN:ETag headerMDN:304 Not ModifiedRFC Editor:RFC 9111 HTTP Caching