【问题标题】: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 明确允许它,并且
-
回复:
请注意,上面列出的任何要求都可以被缓存控制扩展覆盖。 [...]
【解决方案2】:
通常(但不总是)提供资源的服务器会提供一个Date 标头,指示请求该资源的时间。缓存实体可以使用Date 和当前时间来查找资源的年龄。如果Date响应头没有出现,那么缓存实体可能会在其他元数据中标记资源的请求时间,并使用该元数据计算年龄。另一个可能有用的响应标头是 Last-Modified 响应标头。
首先,您应该检查缓存的资源是否具有Date 标头,以便您自己计算年龄。如果不存在,它将取决于您使用的特定浏览器,以及该浏览器如何处理 Date-less 资源的缓存。有关 HTTP 缓存和涉及的各种因素的更多信息,请参阅this caching tutorial。
希望这会有所帮助!