我想知道浏览器如何确定缓存的资源是否已过期。
假设我已将max-age
标头设置为300.我在14:00发出请求,3分钟后我向同一资源发出了另一个请求。那么浏览器如何告诉资源没有过期(current age
哪个是180小于max-age
?浏览器是否为每个请求的资源保留“到期日期”或“当前年龄”?如果是这样,我如何在提出请求时检查“当前年龄”?
答案 0 :(得分:3)
要更好地了解浏览器缓存的工作原理,请检查浏览器实际存储在缓存中的内容:
about:cache
。chrome://cache
。请注意,每个缓存条目(请求的URL)都有一个密钥。与密钥相关联,您将找到整个响应详细信息(状态代码,标题和内容)。通过这些详细信息,浏览器可以确定所请求资源的年龄以及它是否已过期。
HTTP {1.1中当前的缓存参考RFC 7234告诉您关于缓存如何工作的故事的很好的部分:
2. Overview of Cache Operation
正确的缓存操作会保留semantics of HTTP transfers 同时已经消除了信息的传递 保存在缓存中。虽然缓存是一个完全可选的功能 在HTTP中,可以假设重用缓存的响应 期望并且当没有时,这种重用是默认行为 要求或本地配置阻止它。 [...]
每个缓存条目由缓存密钥和一个或多个HTTP组成 对应于使用相同密钥的先前请求的响应。 最常见的缓存条目形式是a的成功结果 检索请求:即对
200
请求的GET
(OK)响应 包含request target标识的资源的表示。但是,也有可能 缓存永久重定向,否定结果(例如,404
(未找到)), 不完整的结果(例如,206
(部分内容))和回复 方法定义允许此类缓存的方法以外的方法GET
并定义适合用作缓存键的内容。主缓存密钥由请求方法和目标URI组成。 但是,由于目前常用的HTTP缓存通常是有限的 缓存对
GET
的响应,许多缓存只是拒绝其他方法 并仅使用URI作为主缓存密钥。 [...]
定义了一些关于在缓存中存储响应的规则:
3. Storing Responses in Caches
高速缓存绝不能存储对任何请求的响应,除非:
请求方法由缓存理解并定义为 可缓存的,
缓存可以理解响应状态代码,
no-store
缓存指令未出现 在请求或响应标头字段中,
private
响应指令没有 如果缓存是共享的,则显示在响应中,
Authorization
标题字段 如果缓存是共享的,则不会出现在请求中,除非 响应明确允许它,响应:
包含
Expires
标题字段或包含
max-age
响应指令或包含
s-maxage
响应指令 并且共享缓存,或包含一个缓存控制扩展 允许它被缓存,或
的状态代码默认定义为可缓存,或
包含
public
响应指令。请注意,上面列出的任何要求都可以通过缓存控制扩展来覆盖。 [...]
答案 1 :(得分:1)
通常(但并非总是)提供资源的服务器将提供Date
标头,指示请求该资源的时间。缓存实体可以使用Date
和当前时间来查找资源的年龄。如果未显示Date
响应标头,则缓存实体可能会在其他元数据中标记资源的请求时间,并使用该元数据计算年龄。要查找的另一个可能有用的响应标头是Last-Modified
响应标头。
首先,您应该检查缓存的资源是否具有用于您自己的年龄计算的Date
标头。如果不存在,则它将取决于您使用的是哪个特定浏览器,以及该浏览器如何处理Date
的缓存 - 更少的资源。有关HTTP缓存及其涉及的各种因素的更多信息,请参阅this caching tutorial。
希望这有帮助!