【问题标题】:304 Not Modified with 200 (from cache)304 未修改为 200(来自缓存)
【发布时间】:2013-10-28 23:54:02
【问题描述】:

我试图了解“状态 304 未修改”和“200(来自缓存)”之间的确切区别

我在上次更改的 javascript 文件上收到 304。为什么会这样? 感谢您的帮助。

【问题讨论】:

标签: http http-status-code-304


【解决方案1】:

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。 'vary' 标头的详细信息:https://www.fastly.com/blog/best-practices-using-vary-header/

【讨论】:

    【解决方案2】:

    “200(来自缓存)”表示浏览器为所发出的请求找到了缓存响应。因此,它没有通过网络调用从远程服务器获取该资源,而是简单地利用了缓存的响应。

    现在这些缓存的响应具有与之关联的生命周期。随着时间的推移,响应可能会变得陈旧。如果这些服务不允许陈旧(参见section 4.2.4 - RFC7234),浏览器需要联系远程服务器并验证这些缓存的响应是否仍然有效。 304 响应状态码是服务器让浏览器知道响应没有改变并且仍然有效的方式。

    如果浏览器收到304 响应,它可以“刷新”相关的陈旧响应。随后对资源的请求可以再次从浏览器缓存中得到服务,而无需与远程服务器进行检查(直到响应再次变得陈旧)。

    【讨论】:

      【解决方案3】:

      304 修改
      304 Not Modified 表示文件自“If-Modified-Since”或“If-None-Match”指定的版本以来没有被修改过。

      200 正常
      如果 HTTP 请求有效,这是您将得到的响应。 GET 请求将包含与文件相关的内容。 POST 请求将包含保存操作结果的内容。

      编码愉快!
      Lyfe

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-08
        • 2017-04-04
        • 2018-11-23
        • 2011-01-27
        • 1970-01-01
        • 2022-01-06
        相关资源
        最近更新 更多