节点缓存VS浏览器缓存

2021-06-01 17:07:25 浏览数 (1)

背景:

CDN节点缓存策略:

可根据实际业务场景设置合理的缓存策略,比如遵循源站、遵循CDN配置的缓存时间等,可针对不同的文件,或目录等灵活设置。在缓存时间内,CDN节点直接以缓存响应给客户端;若缓存过期,用户访问会触发节点回源校验文件是否更新。若文件缓存未过期,但源站更新了并希望用户立即访问到新文件,可提交刷新操作,强制清除CDN缓存,触发回源拉取。

浏览器缓存策略:

强制缓存:当浏览器向服务器发起请求时,服务器会将缓存规则放入HTTP响应报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Control优先级比Expires高。

协商缓存:强制缓存失效后,浏览器携带缓存标识向服务器发起请求,一般是使用 if-modified-since/Last-Modified 和 if-none-match/Etag 由服务器来决定浏览器缓存的资源是否可以使用。

一般情况下,节点缓存和浏览器缓存是独立的,并不会相互影响。但腾讯云在特定平台的特定场景下,两者会出现关联性。

问题描述:

客户反馈将域名vodtest.xiaobli.xyz “全部文件不缓存” 的策略删除后,访问如下url文件,CDN节点和浏览器均会缓存住,不符合预期。

https://vodtest.xiaobli.xyz/nbi/rt/traffic/overview?platform=2&today=2021-03-18

原因分析:

1、确认域名vodtest.xiaobli.xyz的节点缓存策略。

如下所示,客户反馈的url没有匹配到其中任何一条规则。

测试验证,复现到节点缓存住的现象(Hit From Disktank3即代表缓存命中)。且从响应头可以发现:

(1)节点未缓存命中时,无 Cache-Control: max-age头部;

(2)节点缓存命中时,有Cache-Control: max-age头部。

(3)绑定源站测试,源站无Cache-Control 相关的缓存头部。

为何CDN节点会缓存住该文件?带着这个问题,翻查产品文档(https://cloud.tencent.com/document/product/228/47672),找到答案如下:

平台默认策略

若您未配置任何规则或请求未命中配置的规则时,默认遵循以下平台策略:

  • 当用户请求您某一业务资源时,若源站对应的 HTTP Response Header 中存在 Cache-Control 字段,则遵循该 Cache-Control
  • 若源站对应的 HTTP Response Header 中无 Cache-Control 字段,则:CDN 节点默认对该资源缓存600s。

客户反馈的url,未命中配置的规则,且源站无 Cache-Control 字段,则CDN节点会缓存600s。

2、确认域名vodtest.xiaobli.xyz的浏览器缓存策略。

如下所示,该域名无浏览器缓存过期配置。在这种场景下,浏览器缓存多久取决于访问某资源时,服务器响应的Cache-Control

或Expires。一般情况下这2个头部都是继承源站的,CDN侧不会进行修改。客户反馈的这个url,源站没有这2个头部,按理应该不缓存。但由于该文件CDN节点缓存后,会默认加上Cache-Control: max-age=600,才导致浏览器也缓存住了。

解决方案:

若除了有明确设置缓存策略的文件类型外,其它文件均不需要缓存,可以采用如下方案(二选一即可)。

1、在当前缓存策略的基础上,新增一条“全部文件不缓存”(优先级最低)的兜底策略,控制台操作即可。

2、针对CDN侧没有设置明确缓存策略的文件类型,源站需要返回Cache-Control:no-cache之类的不缓存头部。

0 人点赞