背景信息
OSS源站上存储的静态资源包括静态脚本、图片、附件和音频/视频。当终端用户请求访问或下载静态资源时,CDN对OSS源站上的静态资源进行加速,源站上的资源缓存到CDN的加速节点,系统自动调用离终端用户最近的CDN节点上已缓存的资源。加速OSS架构如下图所示。
架构优势
CDN加速OSS的优势如下
(1)用户访问网站资源,全部通过CDN,降低源站压力。
(2)使用CDN流量,单价低于OSS直接访问外网流量。
(3)资源从距离客户端最近的CDN节点获取,减少网络传输距离,保证静态资源质量。
常见问题
一. 如何设置缓存自动刷新
CDN加速OSS的场景下,在OSS的Bucket中修改了Object,使用CDN加速域名访问得到的Object仍是更新前的旧版本,必须在CDN中手动刷新后才能访问到新版本的Object。
这是因为Bucket中的Object更新了,但是CDN中该Object的缓存未到期,所以访问的时候还是老的资源。用户可以开启CDN缓存自动刷新功能。开启此功能后,若Object有更新,OSS会自动刷新CDN上的缓存,从而实现文件更新时缓存自动刷新。具体可以登录OSS控制台,在对应Bucket下选择【传输管理】>【域名管理】界面,设置开启CDN缓存自动刷新。
二. 如何解决静态文件强制下载
出于安全考虑,从2019年9月23日起,针对之后新建的Bucket,直接使用OSS提供的默认域名,从互联网访问OSS上该Bucket的图片类型文件,即mimetype为以下值:
image/jpeg、image/gif、image/tiff、image/png、image/webp、image/svg+xml、image/bmp、image/x-ms-bmp、image/x-cmu-raster、image/exr、image/x-icon、image/heic,扩展名包括:jpg、jpeg、jpe、png、tif、tiff、gif、svg、bmp、ico、ras、dib、svgz、webp、bm、jfif、x-png、exr和heic时,Response Header中会自动加上 Content-Disposition:'attachment=filename;'。即从浏览器访问图片类型文件时,会以附件形式进行下载。用户使用自有域名访问OSS的请求,Response Header中不会加上此信息。解决方案如下:
(1)检查并设置Bucket是否绑定CDN加速域名,详情请参见绑定CDN加速域名。
(2)检查并配置CDN配置的回源Host为用户的加速域名,而不是源站域名。如果设置源站域名(也就是OSS的域名),则CDN回源的时候所带的Host就是OSS域名,这样会导致OSS返回强制下载的HTTP头最终导致资源直接下载。
注:
如果访问URL仍然为强制下载,则可能是CDN缓存了强制下载的HTTP头,需要在CDN控制台刷新URL。另外需要检查OSS源文件的HTTP头内Content-Type的值是否正确,详情请参见 OSS如何设置Content-Type。
三. CDN加速导致OSS配置的CORS跨域失效
使用CDN加速OSS跨域访问失败,原因是可能存在这样的场景:
第一个用户访问CDN时,没有发起跨域访问,然后CDN回源到OSS的时候OSS返回了不带跨域头的Respons Headers信息,并且被CDN缓存下来了。 当第二个用户访问时,发起了跨域请求,但是由于CDN有缓存,直接把之前缓存下来的不带跨域头的Respons Headers信息返回了,导致本次跨域请求失败。因此建议使用CDN加速OSS时,直接在CDN上去配置跨域规则,具体请参考CDN如何配置跨域资源共享(CORS)。
四. CDN加速OSS资源返回403状态码
为了防止OSS被盗链,保护OSS的资源安全,用户把OSS的Bucket权限设置为私有权限,这样就需要带了签名参数的URL去访问。如果CDN加速OSS的访问URL,不带OSS签名参数的话,就会导致403。这种情况下可以开启阿里云OSS私有Bucket回源授权。当开启私有OSS Bucket回源授权后,即表示开启CDN对所有Bucket的只读权限,CDN在回源的时候会计算OSS的签名参数,从而可以从OSS上正常获取资源。
五. CDN加速OSS访问静态托管页面返回403
可以通过Network下获取403请求的Response Headers信息去查看对应的错误信息,如果出现如下错误,说明是开启私有Bucket回源授权的情况下访问了OSS的静态首页。需要注意,目前CDN的私有Bucket回源功能和OSS的静态网站托管功能冲突,无法一起使用。
You are forbidden to list buckets