HTTP 304 Not Modified

缓存校验器:自上次访问以来内容未发生变化,继续使用你已有的副本即可。

HTTP 304 是什么意思

HTTP 304 Not Modified 是对条件请求的回应。客户端表示“我有一份这个日期的副本”(If-Modified-Since)或“带有这个指纹的副本”(If-None-Match),服务器则通过回复不带响应体的 304 来确认该副本仍然是最新的。

这种机制——缓存重新校验——正是重复页面加载得以快速的原因:浏览器只重新下载发生变化的部分,其余内容只需一次很小的往返请求。

304 响应的常见原因

  • 浏览器重新校验了一个缓存的页面、脚本或图片,发现它没有变化。
  • CDN 边缘节点将其存储的对象与源站进行了重新校验。
  • 一个 API 客户端使用 ETag 以低成本方式轮询资源。

开发者的最佳实践

  • 提供稳定的 ETag 或 Last-Modified 响应头,以便客户端能够进行重新校验。
  • 不要为 304 附带响应体——客户端明确已经拥有该内容。
  • 警惕每次响应都会变化的 ETag(例如来自负载均衡服务器、各节点使用不同哈希的情况):它们会悄无声息地使重新校验失效。

示例响应

GET /styles.css HTTP/1.1
If-None-Match: "abc123"

HTTP/1.1 304 Not Modified
ETag: "abc123"
Cache-Control: max-age=3600

SEO 影响

304 响应对 SEO 性能有利:Googlebot 大量使用条件请求,正确的重新校验能让它在相同预算下抓取更多站点内容。校验器出错会导致每次抓取都触发完整的重新下载。

常见问题

304 响应算是一种错误吗?

不是——它是一个成功信号,表示你的缓存副本仍然有效。浏览器会透明地处理它。

什么会触发 304 响应?

一个携带 If-None-Match 或 If-Modified-Since 头的请求,其值与当前资源仍然匹配。

为什么开发者工具中显示的是 304 而不是 200?

浏览器已有缓存副本并对其进行了重新校验。该状态表明服务器确认了缓存有效,而不是重新发送文件。