如何判断缓存页面的“当前年龄”?

时间:2016-07-09 04:52:35

标签: http browser-cache cache-control

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

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

2 个答案:

答案 0 :(得分:3)

检查哪些浏览器存储在其缓存中

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

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

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

HTTP缓存的参考

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

希望这有帮助!