304 Not Modified

HTTP 304 Not Modified リダイレクトレスポンスステータスコードは、リクエストされたリソースを再送する必要がないことを示します。

このレスポンスコードは、リクエストが条件付きGETHEAD リクエストに If-None-Match もしくは If-Modified-Since ヘッダーが付いており、条件が 'false' と評価された時に送信されます。 これは、クライアントがキャッシュしたリソースがまだ有効であり、条件が 'true' と評価された場合、サーバーはリソースとともに 200 OK レスポンスを送信したであろうことを確認します。 詳細については、 HTTP キャッシュを参照してください。

レスポンスには本体を含んではならず、 200 レスポンスで送信されるであろう次のようなヘッダーを記載しなければなりません。

メモ: 多くのブラウザーの開発ツールのネットワークパネル304 レスポンスにつながる追加のリクエストを作成するため、開発者はローカルキャッシュへのアクセスを見ることができます。

ステータス

http
304 Not Modified

条件付きリクエストに対する 304 レスポンス

下記の例は、条件付きリクエストヘッダーつきの curl を使用して作成された GET リクエストを示しています。 --http1.1 フラグは、読みやすくするために HTTP/1.1 プロトコルを強制するために使用されています。

最初のリクエストは、If-Modified-Since 条件を使用して未来の日付である 2050 年 11 月 21 日を設定しています。 これは false と評価されるはずです。まだ現れていない時点以降にリソースが更新されることはありえないからです。

bash
curl --http1.1 -I --header 'If-Modified-Since: Tue, 21 Nov 2050 08:00:00 GMT' \
 https://developer.mozilla.org/en-US/

これにより、次のような HTTP リクエストが発生します。

http
GET /en-US/ HTTP/1.1
Host: developer.mozilla.org
User-Agent: curl/8.7.1
Accept: */*
If-Modified-Since: Tue, 21 Nov 2050 08:00:00 GMT

リソースが If-Modified-Since ヘッダーのタイムスタンプ後に更新された場合、現在のリソースバージョンではレスポンスは 200 OK となりるはずです。 代わりに 304 レスポンスを取得し、そのレスポンスには ETagAgeExpires の各ヘッダーが含まれ、リソースのキャッシュされたバージョンが最新であることを示します。

http
HTTP/1.1 304 Not Modified
Date: Wed, 28 Aug 2024 09:52:35 GMT
Expires: Wed, 28 Aug 2024 10:01:53 GMT
Age: 3279
ETag: "b20a0973b226eeea30362acb81f9e0b3"
Cache-Control: public, max-age=3600
Vary: Accept-Encoding
X-cache: hit
Alt-Svc: clear

それでは、別の curl コマンドを実行し、前回レスポンスで取得した etag 値を If-None-Match 条件とともに使用します(この etag はサーバー上のリソースの最新バージョンであるため、 304 Not Modified レスポンスが返されると予想されます)。

bash
curl --http1.1 -I --header 'If-None-Match: "b20a0973b226eeea30362acb81f9e0b3"' \
 https://developer.mozilla.org/en-US/

これにより、次のような HTTP リクエストが発生します。

http
GET /en-US/ HTTP/1.1
Host: developer.mozilla.org
User-Agent: curl/8.7.1
Accept: */*
If-None-Match: "b20a0973b226eeea30362acb81f9e0b3"

リクエスト時点では etag の値が一致するため、エンティティタグは条件に合わず、304 レスポンスが返されます。

http
HTTP/1.1 304 Not Modified
Date: Wed, 28 Aug 2024 10:36:35 GMT
Expires: Wed, 28 Aug 2024 11:02:17 GMT
Age: 662
ETag: "b20a0973b226eeea30362acb81f9e0b3"
Cache-Control: public, max-age=3600
Vary: Accept-Encoding
X-cache: hit
Alt-Svc: clear

仕様書

Specification
HTTP Semantics
# status.304

互換性メモ

このレスポンスが永続的な接続上で誤って本文を含んだ場合、ブラウザーの動作はさまざまです。 詳しくは 204 No Content を参照してください。

関連情報