浏览器缓存javascript

时间:2017-03-03 00:36:57

标签: javascript http caching

我发现有些浏览器(可能是Safari;我正在等待答案)在没有被告知的情况下缓存我的Javascript。

脚本只能通过

加载
<script src="some-name.js"></script>

服务器(我的嵌入式Jetty)发送以下标题:

Date: Fri, 03 Mar 2017 00:17:04 GMT
Server: ...
Vary: origin, accept-encoding, authorization, x-role
Date: Fri, 03 Mar 2017 00:17:04 GMT
Content-Type: application/javascript; charset=utf-8
Content-Encoding: gzip
ETag: "0e5dd67b500a018f0996bc417e032083"

ETag计算似乎是正确的。 Date重复两次(不明白为什么),但恕我直言,没有日期重要,因为没有过期。我希望浏览器在需要页面时发送If-None-Match:"0e5...",我错了吗?

由于我只使用HTTPS,所以我不关心代理缓存。我看到单独加载所有文件并始终检查它们的新鲜度是非常低效的,但这是另一个故事。所以我想,我现在不需要缓存控制。

现在我想知道是否允许浏览器在没有明确许可的情况下缓存页面(以及持续多长时间)和而不检查其新鲜度? 我该如何禁用它? (*)

(*)我确实想要缓存,但只有在检查了ETag之后。

1 个答案:

答案 0 :(得分:1)

ETag导致缓存

entity tag出现时,会增加回复'cacheability'。简单地省略ETag就会使缓存行为未定义 - may or may not be cached

  

除非受缓存控制(第14.9节)指令的特别约束,否则缓存系统可能总是存储成功的响应

作为旁注,这里的浏览器会积极地缓存内容 - 如上所述,规范允许它们缓存响应,除非明确告知不要,所以他们这样做。

因此,如果您想确保某些内容无法缓存,请使用Cache-Control标头:

Cache-control:no-cache 

添加此标题将prevent the browser from caching。它会覆盖任何其他缓存规则,例如Last-Modified,Expires,ETag等:

  

如果no-cache指令没有指定字段名,那么在没有成功重新验证原始服务器的情况下,缓存不得使用该响应来满足后续请求。

实际上,这意味着浏览器不会存储任何内容。

如果您想在每次添加max-age = 0时强制重新验证某些内容:

Cache-Control: max-age=0
  

请求包括&#34; max-age = 0&#34; cache-control指令,它强制每个缓存沿着到源服务器的路径重新验证其自己的条目

这里的不同之处在于浏览器将存储文件并在每次使用资源时重新验证,即将ETag发送到源服务器并且(希望)获得304未修改的响应。

这与must-revalidate的行为类似,每次都需要重新验证,但与的区别在于不得提供陈旧的响应。如果它不能与原点联系,则需要回复504(而即使无法联系,max-age = 0也可以提供陈旧响应)。

摘要

不要存储任何东西:

Cache-Control: no-cache

存储,但每次都要检查。如果我们无法检查(没有互联网),请使用缓存的:

Cache-Control: max-age=0

存储,但检查何时到期。如果我们无法检查(没有互联网),请失败:

Cache-Control: must-revalidate