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