阿里云CDN+OSS特定目录不缓存

应该有不少朋友在使用阿里云CDN+OSS的时候,希望能够对特定目录不缓存,恰好我也遇到了这个需求,下面记录一下解决方法。

背景

我有一些游戏作品文件,大小在几MB左右。

为了存储它们,首先选型了OSS对象存储,即主动上传到OSS。

因为作品文件较大,一开始使用的ECS固定1Mbits/s带宽,实际对应字节上传速度是100KB/s,上传OSS属于下行带宽,限速导致上传巨慢。

为了保证上传速度,我将ECS改为了流量计费,从而可以达到100Mbits/s的上传速度。

为了加速浏览器访问,我在OSS前面买了CDN,即CDN回源到OSS。

默认CDN是会缓存游戏作品的,并且也会返回Cache-Control: max-age的header令浏览器进行本地缓存,因此当我再次更新OSS中作品的时候,浏览器无法展现最新的作品效果。

因此,我希望让CDN针对作品存放路径不缓存,对其他路径照常缓存。

CDN禁用缓存

首先能想到的就是在CDN中配置,针对作品目录不缓存,也的确有这个选项。

然后Chrome浏览器F5刷新页面后,返回的应答中的确没有了Cache-Control和Expires的header,符合预期。

当我再次普通刷新页面的时候,发现作品请求并没有实际发起,而是load from disk cache,这是为啥呢?

原来HTTP RFC标准规定,如果HTTP应答中没有明确指定Cache-Controle/Expire的话,那么浏览器可以选择本地缓存或者不缓存,具体说明见:https://webmasters.stackexchange.com/questions/111298/what-happens-if-you-dont-set-cache-control-header

因此,我必须想办法对作品文件返回Cache-Control: no-cache的header,这样才能明确告知浏览器不要缓存。

但是,阿里云CDN并没有提供针对某个路径配置HTTP header的入口,只有一个全局配置HTTP header的入口,这怎么办呢?

OSS设置header

通过提交阿里云工单,从工程师处获知OSS支持针对单个文件配置Http header:

但是却没有针对目录整体设置header的地方。

我觉得阿里云不至于考虑不到这一点,所以我看了一下API手册,发现上传OSS的时候可以通过API直接指定header(API手册),下面是一个python的简单示例:

我只需要针对不缓存的文件,设置上述2个header,再配合CDN针对目录的禁用缓存配置,就可以避免浏览器的缓存行为了。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~