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。