背景:
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之类的不缓存头部。