概述
CDN访问出现403通常情况下可能是由以下几种情况导致的,我们可以打开浏览器开发者模式,切换到Netwrok标签页以后重新请求异常的URL,复现403的问题,然后在Headers下查看CDN返回的Response Header,通过这个信息我们可以判断这个403错误是什么原因引起的。本文会对这些情况做具体讲解,以下是本文概图。
一.加速域名未添加到CDN
用户在CDN上添加了主域名test.com,对应的CNAME是test.com.alikunlun.com,然后用户的一些其他的二级域名比如a.test.com、b.test.com等域名并没有添加到CDN上,但是却直接将这些二级域名解析到test.com.alikunlun.com,这种情况会导致CDN响应403,具体报错如下。
注意:主域名的CNAME不能被二级域名使用,如果需要加速这些二级域名,需要把二级域名单独都添加到CDN上,并解析到对应的CNAME地址上。或者考虑使用泛域名的方式,泛域名的CNAME是可以被二级域名使用的。
X-Tengine-Bf-Error: non-existent domain
二.CDN鉴权问题
CDN鉴权问题通常表现在没有带鉴权参数、鉴权过期、鉴权计算错误,需要根据URL鉴权的文档了解鉴权的原理然后去进一步排查和解决。
1. CDN开启了鉴权,但是实际的访问URL里没有带鉴权参数,导致报错如下
X-Tengine-Error:denied by req auth: no url arg auth_key
2. 鉴权参数过期
CDN开了鉴权,并且URL带了鉴权参数,但是鉴权参数过期
X-Tengine-Error: denied by req auth: expired timestamp
3. 鉴权参数的md5计算不正确
X-Tengine-Error: denied by req auth: invalid md5hash
解决方案:
- 如果不需要CDN的鉴权功能,可以在CDN控制台关闭鉴权。
- 如果鉴权过期,请重新生成鉴权URL。
- 如果鉴权的md5计算不正确,建议先用CDN控制台的地址生成器生成URL来对比自己的鉴权代码,也可以参考官方帮助文档提供的鉴权示例代码。
三.防盗链问题
开启了防盗链功能,但是实际Request Headers请求头里的Referer头不符合防盗链规则导致失败,因防盗链问题导致的403,在CDN的Response headers里的X-Tengine-Error会返回denied by Referer ACL。防盗链配置请参考配置文档。
X-Tengine-Error: denied by Referer ACL
Referer防盗链类型如下:
- 黑名单:黑名单内的域名均无法访问当前的资源。
- 白名单:只有白名单内的域名能访问当前资源,白名单以外的域名均无法访问当前的资源。
黑名单和白名单互斥,同一时间只支持其中一种方式生效。
1.请求头里没有带referer头,也就是说该HTTP请求是一次空referer的请求的。而CDN控制台又设置了不允许空referer,因此该请求会被403,参考如下案例。
解决方案:如果希望允许空referer的请求,可以登录CDN控制台,单击对应的加速域名 管理,选择 访问控制 > Refer防盗链 > 修改配置,,勾选“允许通过浏览器地址栏直接访问资源URL”。
注:如将防盗链设置不允许为空Referer访问,这样操作,有被盗链的风险。
2.设置了防盗链白名单,但是实际请求时,请求头里的referer头不在白名单里。例如如下案例,设置的白名单是www.test.com, 但是实际访问的时候,请求头里的referer头是dc.xxx.cn,未在白名单里,因此403。
四.IP黑白名单问题
在CDN控制台配置了IP黑白名单,实际访问的IP不符合配置规则,导致出现403。
1.配置了IP白名单,实际访问的客户端IP不在IP白名单里,导致403,具体报错如下
X-Tengine-Error: denied by IP ACL = not in whitelist
2.配置了IP黑名单,实际访问的客户端IP在IP黑名单里,导致403,具体报错如下
X-Tengine-Error: denied by IP ACL = blacklist
常见问题
- 问:为什么配置了IP黑名单,还是可以正常访问,响应200,而不是403?
答:这种情况一般都是客户端真实出口IP跟IP黑名单里配置的IP不一致导致的。建议获取客户端真实出口IP,可以通过IP工具查询;也可以通过下载CDN的日志,从CDN的日志去查找这条请求,CDN的日志里记录了客户端IP。 - 问:发现恶意请求的情况,把恶意请求的客户端IP配置到黑名单了,为什么还是不断有请求CDN?
答:CDN作为一个服务端,无法控制客户端不请求CDN,CDN能做的是当恶意请求到CDN的时候,CDN根据配置的安全规则拒绝不合法的请求,以403的形式拒绝访问。
五.UA黑白名单问题
配置了UA黑白名单,User-Agent名单类型如下:
- 黑名单:黑名单内的User-Agent字段均无法访问当前资源。
- 白名单:只有白名单内的User-Agent字段能访问当前资源,白名单以外的User-Agent字段均无法访问当前资源。
黑名单和白名单互斥,同一时间只支持其中一种方式生效。
1. 配置了UA黑名单,客户端UA命中了黑名单规则,报错如下
X-Tengine-Error: black ua
2. 配置了UA白名单,客户端UA不在UA白名单列表里,报错如下
X-Tengine-Error: not in white ua
六.URL违规被屏蔽
403的URL涉及违法不良信息,违反了相关服务协议和《互联网信息服务管理办法》第十五条规定,这种情况下违法URL会被CDN做屏蔽访问处理。通常这种情况会收到邮件或短信通知,请注意确保CDN加速的内容是合法的内容。以下两个报错均是URL违规导致的
x-swift-error:request hit url black list
x-tengine-ban-error: global ban hit
七.源站响应403
源站响应了403给CDN,CDN再把403响应给客户端。源站响应的403会报错如下
X-Swift-Error: orig response 4XX error
- 源站是用户服务器
可以绑定Host到源站访问测试是否一样存在403的情况,如果源站就有403的情况,需要先解决源站的403问题。另外还有一点需要注意,CDN的回源Host配置错误也可能导致403错误。回源HOST跟源站的区别就是,源站决定了回源时请求到的具体IP地址,而回源HOST决定了回源请求访问到该IP地址上的具体站点。 -
源站是阿里云OSS
如果源Bucket的访问权限是私有权限,但是访问URL里没有带上OSS的私有签名参数(Signature、Expires、OSSAccessKeyId),就会导致CDN回源请求OSS的时候通不过OSS的鉴权导致403,报错如下You have no right to access this object because of bucket acl 。
这种情况建议开启CDN的阿里云OSS私有Bucket回源授权功能。
如果出现如下错误,说明是OSS防盗链鉴权返回的403,则需要检查OSS的防盗链设置。
You are denied by bucket referer policy
如果出现如下错误,说明是开启私有Bucket回源授权的情况下访问了OSS的静态首页,目前CDN的私有Bucket回源功能和OSS的静态网站托管功能冲突,无法一起使用。
You are forbidden to list buckets