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.org.cn/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.org.cn/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
。