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

另见