我试图了解“状态 304 未修改”和“200(来自缓存)”之间究竟有什么区别
我在上次更改的 javascript 文件上收到 304。为什么会这样?感谢您的帮助。
我试图了解“状态 304 未修改”和“200(来自缓存)”之间究竟有什么区别
我在上次更改的 javascript 文件上收到 304。为什么会这样?感谢您的帮助。
https://sookocheff.com/post/api/effective-caching/是围绕这 2 个 HTTP 状态代码形成所需理解的绝佳来源。
仔细阅读后,我有了这样的理解
在典型用法中,当检索到 URL 时,Web 服务器将返回资源的当前表示形式及其对应的 ETag 值,该值位于 HTTP 响应标头“ETag”字段中。然后,客户端可以决定缓存该表示及其 ETag。稍后,如果客户端要再次检索相同的 URL 资源,它会首先确定该 URL 的本地缓存版本是否已过期(通过 Cache-Control 和 Expire 标头)。如果 URL 没有过期,它将检索本地缓存的资源。如果它确定 URL 已过期(过时),则客户端将联系服务器并将其先前保存的 ETag 副本与请求一起发送到“If-None-Match”字段中。(来源:https ://en.wikipedia.org/wiki/HTTP_ETag )
但是,即使将来设置了资产的到期时间,浏览器仍然可以根据“Vary”标头使用 ETag 访问服务器以进行条件 GET。“变化”标题的详细信息:https ://www.fastly.com/blog/best-practices-using-vary-header/
“200(来自缓存)”表示浏览器为所发出的请求找到了缓存响应。因此,它没有进行网络调用以从远程服务器获取该资源,而是简单地使用了缓存的响应。
现在,这些缓存的响应具有与之相关的生命周期。随着时间的推移,响应可能会变得陈旧。如果这些服务不允许陈旧(参见4.2.4 - RFC7234 部分),浏览器需要联系远程服务器并验证这些缓存的响应是否仍然有效。响应状态码是服务器让浏览器304
知道响应没有改变并且仍然有效的方式。
如果浏览器收到304
响应,它可以“刷新”相关的陈旧响应。并且随后对资源的请求可以再次从浏览器缓存中提供,而无需与远程服务器进行检查(直到响应再次变得陈旧)。
304 Modified
A 304 Not Modified 表示文件自“If-Modified-Since”或“If-None-Match”指定的版本以来没有被修改过。
200 OK
如果 HTTP 请求有效,这是您将得到的响应。GET 请求将包含与文件相关的内容。POST 请求将包含保存操作结果的内容。
快乐编码!
生命周期