HTTP 304 Not Modified

キャッシュの検証結果: 前回訪問時から変更はなく、既に持っているコピーをそのまま使用できます。

HTTP 304 の意味

HTTP 304 Not Modified は、条件付きリクエストに対する回答です。クライアントは「この日付のコピーを持っている」(If-Modified-Since)または「このフィンガープリントのものを持っている」(If-None-Match)と伝え、サーバーはそのコピーが依然として最新であることをボディなしの 304 で確認します。

この仕組み — キャッシュの再検証 — が、繰り返しのページ読み込みを高速にしています。ブラウザは変更された部分のみを再ダウンロードし、それ以外はすべて小さな 1 回の往復通信で済みます。

304 レスポンスのよくある原因

  • ブラウザはキャッシュされたページ、スクリプト、または画像を再検証し、変更はありませんでした。
  • CDN のエッジが、保存しているオブジェクトをオリジンに対して再検証しました。
  • API クライアントが ETag を使ってリソースを低コストでポーリングしました。

開発者向けの推奨プラクティス

  • クライアントが再検証できるよう、安定した ETag または Last-Modified ヘッダーを配信してください。
  • 304 にレスポンスボディを含めないでください — クライアントは明示的にそれをすでに持っています。
  • レスポンスのたびに変化する ETag(例: ノードごとのハッシュを持つロードバランス構成のサーバーから)に注意してください。これは再検証を静かに無効化します。

レスポンス例

GET /styles.css HTTP/1.1
If-None-Match: "abc123"

HTTP/1.1 304 Not Modified
ETag: "abc123"
Cache-Control: max-age=3600

SEO への影響

304 レスポンスは SEO のパフォーマンスにとって良いものです。Googlebot は条件付きリクエストを積極的に使用しており、正しい再検証によって同じクロールバジェットでより多くのサイトをクロールできるようになります。壊れたバリデーターは、クロールのたびに完全な再ダウンロードを強制してしまいます。

よくある質問

304 レスポンスはエラーですか?

いいえ — これはキャッシュされたコピーがまだ有効であることを示す成功シグナルです。ブラウザはこれを透過的に処理します。

何が 304 レスポンスを引き起こしますか?

If-None-Match または If-Modified-Since ヘッダーを含むリクエストで、その値が現在のリソースと一致している場合です。

なぜ DevTools で 200 ではなく 304 が表示されるのですか?

ブラウザはキャッシュされたコピーを持っており、それを再検証しました。このステータスは、サーバーがファイルを再送信する代わりにキャッシュを確認したことを示します。