304 Not Modified
HTTP の 304 Not Modified はリダイレクトレスポンスステータスコードで、リクエストされたリソースを再送する必要がないことを示します。
このレスポンスコードは、リクエストが条件付きの GET や HEAD リクエストに If-None-Match もしくは If-Modified-Since ヘッダーが付いており、条件が 'false' と評価された時に送信されます。
これは、クライアントがキャッシュしたリソースがまだ有効であり、条件が 'true' と評価された場合、サーバーはリソースとともに 200 OK レスポンスを送信したであろうことを確認します。
詳細については、 HTTP キャッシュを参照してください。
レスポンスには本体を含んではならず、 200 レスポンスで送信されるであろう次のようなヘッダーを記載しなければなりません。
メモ:
ブラウザーの開発者ツールのネットワークパネルの多くは、 304 レスポンスにつながる追加のリクエストを作成するため、ローカルキャッシュへのアクセスが開発者から見えます。
ステータス
304 Not Modified
例
>条件付きリクエストに対する 304 レスポンス
下記の例は、条件付きリクエストヘッダーつきの curl を使用して作成された GET リクエストを示しています。
--http1.1 フラグは、読みやすくするために HTTP/1.1 プロトコルを強制するために使用されています。
最初のリクエストは、If-Modified-Since 条件を使用して未来の日付である 2050 年 11 月 21 日を設定しています。
これは false と評価されるはずです。まだ現れていない時点以降にリソースが更新されることはありえないからです。
curl --http1.1 -I --header 'If-Modified-Since: Tue, 21 Nov 2050 08:00:00 GMT' \
https://big.rakal.top/en-US/
これにより、次のような HTTP リクエストが発生します。
GET /en-US/ HTTP/1.1
Host: big.rakal.top
User-Agent: curl/8.7.1
Accept: */*
If-Modified-Since: Tue, 21 Nov 2050 08:00:00 GMT
リソースが If-Modified-Since ヘッダーのタイムスタンプ後に更新された場合、現在のリソースバージョンではレスポンスは 200 OK となりるはずです。
代わりに 304 レスポンスを取得し、そのレスポンスには ETag、Age、Expires の各ヘッダーが含まれ、リソースのキャッシュされたバージョンが最新であることを示します。
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 レスポンスが返されると予想されます)。
curl --http1.1 -I --header 'If-None-Match: "b20a0973b226eeea30362acb81f9e0b3"' \
https://big.rakal.top/en-US/
これにより、次のような HTTP リクエストが発生します。
GET /en-US/ HTTP/1.1
Host: big.rakal.top
User-Agent: curl/8.7.1
Accept: */*
If-None-Match: "b20a0973b226eeea30362acb81f9e0b3"
リクエスト時点では etag の値が一致するため、エンティティタグは条件に合わず、304 レスポンスが返されます。
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 を参照してください。