304 Not Modified
HTTP 304 Not Modified (未修改)重定向響應狀態碼錶示不需要重新傳輸請求的資源。
當請求是帶有 If-None-Match 或 If-Modified-Since 頭的條件 GET 或 HEAD 請求,並且條件評估為“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://mdn.club.tw/en-US/
這將導致以下 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。相反,我們得到一個包含 ETag、Age 和 Expires 頭的 304 響應,告訴我們快取的資源版本仍然是最新的
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
現在,使用上一個響應中的 etag 值,並帶有 If-None-Match 條件(因為此 etag 是伺服器上資源的當前版本,我們期望收到 304 Not Modified 響應)再次執行 curl 命令
curl --http1.1 -I --header 'If-None-Match: "b20a0973b226eeea30362acb81f9e0b3"' \
https://mdn.club.tw/en-US/
這將導致以下 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/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
規範
| 規範 |
|---|
| HTTP 語義 # status.304 |
相容性說明
如果此響應在持久連線上錯誤地包含正文,則瀏覽器行為會有所不同。有關更多詳細資訊,請參閱 204 No Content。