javascript - 浏览器缓存 JavaScript

标签 javascript http caching

我发现某些浏览器(可能是 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/

相关文章:

c# - ResourceStrings 真的被缓存了吗?

Javascript 比较日期 - d3.js 图表中的错误

javascript - xhr 请求控制源

http - gitsharp 克隆 http 协议(protocol)失败,但 git 协议(protocol)成功!为什么?

具有批量加载和逐出策略的 Java 内存中缓存解决方案

android - 访问被拒绝查找属性 ro.vendor.hwui.texture_cache_size

javascript - 在 Chrome 扩展中从 Javascript 获取 reactInstance

javascript - Onclick div 仅适用于一位用户

php - JavaScript 和 PHP 网页设计

http - 我可以从我的应用程序提交带有谷歌验证码的表单吗?