我发现某个浏览器(可能是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被重复了两次(不知道为什么),但是IMHO根本就没有日期问题,因为没有过期。我希望浏览器在需要页面的时候发送If-None-Match:"0e5...",我错了吗?
因为我只使用HTTPS,所以我不关心代理缓存。我看到,单独加载所有文件并始终检查它们的新鲜度是非常低效的,但这是另一回事。所以我想,我现在不需要缓存控制。
现在,我想知道浏览器是否允许在没有显式许可的情况下缓存页面(以及缓存时间多长),并且不检查页面的新鲜度?我怎样才能禁用它?(*)
(*)我确实想要缓存,但只在检查了ETag之后。
发布于 2017-03-03 01:01:23
ETag导致缓存
当出现一个实体标签时,它会增加响应“缓存性”。只需省略ETag,缓存行为就无法定义- it 可以缓存也可以不缓存。
除非受到缓存控制(第14.9节)指令的特殊限制,否则缓存系统可能总是存储成功的响应。
这里需要注意的是,浏览器正在加速缓存东西--如上所述,规范允许浏览器缓存响应,除非明确告诉它们不要缓存响应,否则它们就会缓存响应。
因此,如果您想确保某些东西没有缓存,请使用缓存控制头:
Cache-control:no-cache 添加此头将防止浏览器缓存。它重写任何其他缓存规则,如“最后修改”、“过期”、“ETag”等:
如果no-cache指令没有指定字段名,那么缓存就不能使用响应来满足后续请求,而不需要对源服务器进行成功的重新验证。
实际上,这意味着浏览器不会存储任何内容。
如果您想在每次添加max-age=0:时强制某些内容重新验证
Cache-Control: max-age=0该请求包括一个"max-age=0“缓存控制指令,该指令强制每个缓存沿着到达源服务器的路径重新验证其自己的条目。
这里的不同之处在于,每次使用资源时,浏览器都会存储文件并重新验证,即将ETag发送到源服务器,并(希望)获得304个未修改的响应。
这与must-revalidate有类似的行为,每次都需要重新验证,尽管它的不同之处不一定是一个陈旧的响应。如果它不能联系到原点,它需要用504响应(而最大年龄=0可以提供陈旧的响应,即使不可能接触)。
摘要
不要储存任何东西:
Cache-Control: no-cache商店,但每次都要检查。如果我们不能检查(没有互联网),请使用缓存的:
Cache-Control: max-age=0储存,但是检查过期的时间。如果我们不能检查(没有互联网),失败:
Cache-Control: must-revalidatehttps://stackoverflow.com/questions/42568582
复制相似问题