304 Not Modified

HTTP 304 Not Modified (未修改)重定向響應狀態碼錶示不需要重新傳輸請求的資源。

當請求是帶有 If-None-MatchIf-Modified-Since 頭的條件 GETHEAD 請求,並且條件評估為“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://mdn.club.tw/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。相反,我們得到一個包含 ETagAgeExpires 頭的 304 響應,告訴我們快取的資源版本仍然是最新的

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

現在,使用上一個響應中的 etag 值,並帶有 If-None-Match 條件(因為此 etag 是伺服器上資源的當前版本,我們期望收到 304 Not Modified 響應)再次執行 curl 命令

bash
curl --http1.1 -I --header 'If-None-Match: "b20a0973b226eeea30362acb81f9e0b3"' \
 https://mdn.club.tw/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

規範

規範
HTTP 語義
# status.304

相容性說明

如果此響應在持久連線上錯誤地包含正文,則瀏覽器行為會有所不同。有關更多詳細資訊,請參閱 204 No Content

另見