意味
クライアントが持っているキャッシュはまだ有効なので、サーバーはボディを送りません。If-None-Match や If-Modified-Since 付きの条件付きリクエストへの応答です。
よくある原因
- If-None-Match の ETag が現在のバージョンと一致した
- If-Modified-Since 以降リソースが変わっていない
- ブラウザーがキャッシュしたアセットを再検証している
対処法
クライアント・閲覧者の場合
キャッシュのボディを使います。内容が古く見えるなら検証子が間違っている可能性があります。強制再読み込みするか ETag の生成を確認します。
サイトや API の運営者の場合
安定した ETag(ロードバランサー配下の全サーバーで同一)を生成し、200 と同じキャッシュヘッダーを送ります。
レスポンス例
HTTP/1.1
HTTP/1.1 304 Not Modified
Date: Tue, 07 Oct 2025 09:30:00 GMT
Server: nginx
ETag: "33a64df5"
Cache-Control: max-age=3600 仕様
よくある質問
› 304 はエラーですか?
いいえ。クライアントのキャッシュが最新であることを伝えて帯域を節約します。
› デプロイ後にユーザーが古いファイルを見るのはなぜ?
キャッシュヘッダーが古いコピーを許しているからです。アセットにはフィンガープリント付きのファイル名を、HTML には短い max-age と再検証を使います。