日々の疑問に、確かめられる答えを。 運営・編集
しるべSHIRUBE / JOURNAL
Web制作

Cache-Control・ETag・304の使い分け|更新を早く届ける公開設計

HTMLは再検証、版付き画像・CSS・JSは長期保存という基本設計を図解。no-cacheとno-storeの違い、304、CDN、公開後の確認手順をまとめます。

すべてへ同じキャッシュ期限を設定しません。Webのしるべ編集部(独自作成)
HTMLの再検証と版付き静的ファイルの長期保存を比較した図。
HTMLの再検証と版付き静的ファイルの長期保存を比較した図。

すべてへ同じキャッシュ期限を設定しません。

先に答え:HTMLと版付きファイルを同じ期限にしない

更新を早く反映しながら表示を速くする基本は、役割でキャッシュ方針を分けることです。頻繁に内容が変わり、次に読むCSSや画像のURLを決めるHTMLは再検証しやすくします。一方、内容が変わるたびにファイル名へハッシュや版番号を付けるCSS・JavaScript・画像は、長期間保存できます。

URLと更新方法を一緒に設計します。Webのしるべ編集部(独自作成)
HTML、版付きCSS、画像、個人別ページのキャッシュ方針を並べた表。
HTML、版付きCSS、画像、個人別ページのキャッシュ方針を並べた表。

URLと更新方法を一緒に設計します。

対象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は保存禁止という意味ではありません。Webのしるべ編集部(独自作成)
no-cache、no-store、privateの意味を比較した図。
no-cache、no-store、privateの意味を比較した図。

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を返します。

304はエラーではありません。Webのしるべ編集部(独自作成)
ブラウザーがIf-None-Matchを送り、同じETagなら304を返す流れ。
ブラウザーがIf-None-Matchを送り、同じETagなら304を返す流れ。

304はエラーではありません。

# 最初の応答
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等のページキャッシュ、サービスワーカー、アプリ内キャッシュを分けます。

各層のURLと応答ヘッダーを記録します。Webのしるべ編集部(独自作成)
ブラウザー、CDN、サーバー、Service Worker等のキャッシュ層。
ブラウザー、CDN、サーバー、Service Worker等のキャッシュ層。

各層のURLと応答ヘッダーを記録します。

  1. オリジンサーバーのファイル・データが新しいか。
  2. オリジン応答の Cache-Control、ETag、Age等が意図どおりか。
  3. CDNがどのルールで保存し、どのURLを消去したか。
  4. ブラウザーが通常再読み込みと強制再読み込みでどう変わるか。
  5. Service Workerやアプリが独自に応答を保存していないか。

CDNを消去してもブラウザーの長期キャッシュは残り得ます。逆にブラウザーを消してもCDNが古い応答を返せば直りません。「全部消す」前に、各層の応答ヘッダーとURLを記録します。

版付きURLで長期保存する

MDNは、変わらない静的ファイルはURLへ版番号やハッシュを含め、長い max-age を付けるキャッシュバスティングを紹介しています。内容が変わればURLも変わるため、古いファイルが長期保存されていても新しいHTMLは新URLを参照します。

Cache-Control: public, max-age=31536000, immutable
ファイル名の値は架空の版識別子です。Webのしるべ編集部(独自作成)
CSSの内容変更時にURLをapp.a1b2.cssからapp.c3d4.cssへ変える図。
CSSの内容変更時にURLをapp.a1b2.cssからapp.c3d4.cssへ変える図。

ファイル名の値は架空の版識別子です。

長い期限を同じURLの app.js や style.css に付けたまま中身だけ置き換えると、利用者は期限が切れるまで旧版を使う場合があります。長期保存するファイルは、ビルドやCMSが内容変更時にURLを確実に変えることを確認します。

HTMLへ1年の max-age を設定するような構成は、緊急更新でも中間キャッシュへ到達できず、サーバーから消去できないことがあります。MDNも、長い max-age で保存された中間キャッシュの応答をオリジンから能動的に削除する標準手段はないと説明しています。CDN独自のパージ機能がある場合も、対象URLと範囲を運用票へ残します。

公開前後の確認手順

  1. HTML、CSS、JavaScript、画像、API、個人別ページに分類する。
  2. 現在のヘッダーとCDNルールをURL単位で取得する。
  3. HTMLは再検証、版付き資源は長期保存という方針を決める。
  4. 個人別・Cookie依存の応答に private が必要か確認する。
  5. 新しい版を公開し、HTMLが新しい版付きURLを参照するか確認する。
  6. 通常アクセス、再読み込み、別端末、未ログイン、ログイン後を確認する。
  7. 旧版へ戻す場合も、新しいURLまたは確実なパージ手順を使う。
公開後はHTML版と参照先の版を一緒に確認します。Webのしるべ編集部(独自作成)
資源の分類、ヘッダー設定、公開、別端末等での確認の順序。
資源の分類、ヘッダー設定、公開、別端末等での確認の順序。

公開後はHTML版と参照先の版を一緒に確認します。

確認例:

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

次の「わかる」を見つける

Web制作18分で読める

独自ドメインを買う前に確認すること:初年度料金だけで選ばないためのチェックリスト

初年度の安さだけで決めないために。更新料、自動更新、Whois情報公開代行、無料ドメインの条件、移管料を公式情報で確認し、購入前のチェックリストで整理します。

2026.10.14 確認
Web制作20分で読める

WordPress用レンタルサーバー3社を比較|12か月の総額と無料お試しの注意点

エックスサーバー・ロリポップ!・さくらのレンタルサーバを、12か月の通常料金、ドメイン代、バックアップ、試用から課金に変わる条件で比較。初めて申し込むときの確認手順も説明します。

2026.10.14 確認
WordPress表示設定で最新の投稿と固定ページの選択肢、ホームページと投稿ページの欄、保存ボタンがある。
Web制作8分で読める

WordPressのトップページを固定ページにする方法|お知らせ一覧との分け方

「ホーム」と「お知らせ」を用意し、表示設定で割り当てる手順。管理画面・固定ページ一覧・表示設定の公式画面と4枚の図解で、入口から保存後の確認まで説明します。

2026.10.14 確認