我发现某些浏览器(可能是 Safari;我正在等待答案)在没有被告知的情况下缓存了我的 Javascript。
脚本只需通过以下方式加载
<script src="some-name.js"></script>
服务器(我的嵌入式 Jetty)发送以下 header :
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 后才需要。
最佳答案
ETag 导致缓存
当 entity tag存在它会增加响应 'cacheability' 。简单地省略 ETag 会使缓存行为未定义 - 它 may or may not be cached :
Unless specifically constrained by a cache-control (section 14.9) directive, a caching system MAY always store a successful response
作为旁注,浏览器会主动缓存内容 - 如上所示,规范允许它们缓存响应,除非明确告知不要这样做,所以它们会这样做。
因此,如果您想确保某些内容不会缓存,请使用 Cache-Control header :
Cache-control:no-cache
添加此 header 将 prevent the browser from caching 。它会覆盖任何其他缓存规则,例如 Last-Modified、Expires、ETag 等:
If the no-cache directive does not specify a field-name, then a cache MUST NOT use the response to satisfy a subsequent request without successful revalidation with the origin server.
实际上,这意味着浏览器不会存储任何内容。
如果您想强制某些内容每次都重新验证,请添加 max-age=0:
Cache-Control: max-age=0
The request includes a "max-age=0" cache-control directive, which forces each cache along the path to the origin server to revalidate its own entry
这里的区别在于,浏览器将存储文件并在每次使用资源时重新验证,即将 ETag 发送到源服务器并(希望)获得 304 未修改响应。
这与 must-revalidate
具有类似的行为,后者也每次都需要重新验证,尽管不同之处在于它不能提供过时的响应。如果无法联系源,则需要响应 504(而 max-age=0 可以提供陈旧的响应,即使无法联系)。
摘要
不存储任何内容:
Cache-Control: no-cache
存储,但每次都检查。如果我们无法检查(没有互联网),请使用缓存的:
Cache-Control: max-age=0
存储,但检查它何时过期。如果我们无法检查(没有互联网),则失败:
Cache-Control: must-revalidate
关于javascript - 浏览器缓存 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42568582/