【问题标题】:How can I tell the "current age" of a cached page?如何判断缓存页面的“当前年龄”?
【发布时间】:2016-07-09 04:52:35
【问题描述】:

我想知道浏览器如何确定缓存的资源是否已过期。

假设我已将 max-age 标头设置为 300。我在 14:00 发出了一个请求,3 分钟后我又向同一资源发出了另一个请求。那么浏览器如何判断资源没有过期(current age 是 180 小于 max-age)?浏览器是否为每个请求的资源保存“到期日期”或“当前年龄”?如果是这样,我如何在我提出请求时检查“当前年龄”?

【问题讨论】:

    标签: http browser-cache cache-control


    【解决方案1】:

    检查浏览器在缓存中存储的内容

    要更好地了解浏览器缓存的工作原理,请检查浏览器实际存储在缓存中的内容:

    • Firefox:导航到about:cache
    • Chrome:导航到chrome://cache

    请注意,每个缓存条目(请求的 URL)都有一个键。与密钥相关联,您将找到整个响应详细信息(状态代码、标题和内容)。通过这些详细信息,浏览器能够确定所请求资源的年龄以及它是否已过期。

    HTTP 缓存参考

    RFC 7234 是 HTTP/1.1 中缓存的当前参考,它告诉您关于缓存应该如何工作的故事的一个很好的部分:

    2. Overview of Cache Operation

    正确的缓存操作会保留semantics of HTTP transfers 同时已经消除了信息传递 保存在缓存中。尽管缓存是一个完全可选的功能 对于 HTTP,可以假设重用缓存的响应是 可取的,并且这种重用是默认行为,当没有 要求或本地配置阻止它。 [...]

    每个缓存条目都包含一个缓存键和一个或多个 HTTP 对应于使用相同密钥的先前请求的响应。 最常见的缓存条目形式是成功的结果 检索请求:即对GET 请求的200(OK)响应,这 包含由request target 标识的资源的表示。不过,也可以 缓存永久重定向、否定结果(例如,404(未找到)), 不完整的结果(例如,206(部分内容)),以及对 GET 以外的方法,如果方法的定义允许这样的缓存 并定义了适合用作缓存键的东西。

    主缓存键由请求方法和目标 URI 组成。 但是,由于当今常用的 HTTP 缓存通常是有限的 为了缓存对GET 的响应,许多缓存只是拒绝其他方法 并仅使用 URI 作为主缓存键。 [...]

    定义了一些关于在缓存中存储响应的规则:

    3. Storing Responses in Caches

    缓存不得存储对任何请求的响应,除非:

    • 请求方法被缓存理解并定义为 可缓存,并且

    • 响应状态码被缓存理解,并且

    • no-store 缓存指令未出现 在请求或响应头字段中,以及

    • private 响应指令不 出现在响应中,如果缓存是共享的,并且

    • Authorization 标头字段确实 不会出现在请求中,如果缓存是共享的,除非 response 明确允许它,并且

    • 回复:

      • 包含Expires 标头字段,或

      • 包含max-age 响应指令,或

      • 包含一个s-maxage 响应指令 并且缓存是共享的,或者

      • 包含一个缓存控制扩展,它 允许它被缓存,或者

      • 有一个默认定义为可缓存的状态码,或者

      • 包含一个public 响应指令。

    请注意,上面列出的任何要求都可以被缓存控制扩展覆盖。 [...]

    【讨论】:

      【解决方案2】:

      通常(但不总是)提供资源的服务器会提供一个Date 标头,指示请求该资源的时间。缓存实体可以使用Date 和当前时间来查找资源的年龄。如果Date响应头没有出现,那么缓存实体可能会在其他元数据中标记资源的请求时间,并使用该元数据计算年龄。另一个可能有用的响应标头是 Last-Modified 响应标头。

      首先,您应该检查缓存的资源是否具有Date 标头,以便您自己计算年龄。如果不存在,它将取决于您使用的特定浏览器,以及该浏览器如何处理 Date-less 资源的缓存。有关 HTTP 缓存和涉及的各种因素的更多信息,请参阅this caching tutorial

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 2011-06-01
        • 2016-05-11
        • 1970-01-01
        • 2011-03-23
        • 1970-01-01
        相关资源
        最近更新 更多