概述
CDN访问出现403状态码通常情况下可能是由以下几种情况导致的,在排查问题时可以打开浏览器开发者模式,切换到Network标签页后,重新请求异常的URL,复现403的问题,然后在Headers下查看CDN返回的Response Header,通过这个信息可以判断是什么原因引起的403错误。本文会对这些情况进行具体介绍。
详细信息
加速域名未添加到CDN
当您在CDN上添加了aliyundoc.com
主域名,且对应的CNAME为aliyundoc.com.w.alikunlun.com
时,您其他的二级域名,例如example.aliyundoc.com
、demo.aliyundoc.com
并没有添加到CDN,但是却直接将这些二级域名解析到aliyundoc.com.w.alikunlun.com
,这种情况下会导致CDN响应403,具体报错如下。
X-Tengine-Bf-Error: non-existent domain
CDN鉴权问题
CDN鉴权问题通常表现在没有携带鉴权参数、鉴权过期、鉴权计算错误,需要根据URL鉴权的文档了解鉴权的原理然后去进一步排查和解决。
- 常见的鉴权问题如下:
- 没有携带鉴权参数:CDN开启了鉴权,但是实际访问URL中没有携带鉴权参数,导致出现如下报错。
X-Tengine-Error:denied by req auth: no url arg auth_key
- 鉴权过期:CDN开启了鉴权,并且URL携带了鉴权参数,但是鉴权参数过期。
X-Tengine-Error: denied by req auth: expired timestamp
- 鉴权计算错误:鉴权参数的MD5值计算不正确。
X-Tengine-Error: denied by req auth: invalid md5hash
- 没有携带鉴权参数:CDN开启了鉴权,但是实际访问URL中没有携带鉴权参数,导致出现如下报错。
- 解决方案:
防盗链问题
开启了防盗链功能,但是实际Request Headers请求头中的Referer头不符合防盗链规则导致出现403。而防盗链问题导致的403,在CDN的Response headers中的X-Tengine-Error会返回denied by Referer ACL。具体防盗链问题请参见由于防盗链异常导致访问CDN返回403错误的解决方法。
X-Tengine-Error: denied by Referer ACL
IP黑白名单问题
在CDN控制台配置了IP黑白名单,实际访问的IP不符合配置规则,导致出现403。
- IP黑白名单问题现象
- 配置了IP白名单,但是实际访问的客户端IP不在IP白名单里,导致出现403,具体报错如下。
X-Tengine-Error: denied by IP ACL = not in whitelist
- 配置了IP黑名单,且实际访问的客户端IP在IP黑名单里,导致出现403,具体报错如下。
X-Tengine-Error: denied by IP ACL = blacklist
- 配置了IP白名单,但是实际访问的客户端IP不在IP白名单里,导致出现403,具体报错如下。
- 根据对应的问题修改IP黑白名单配置,详情请参见配置IP黑白名单。
UA黑白名单问题
- 配置了UA黑名单,客户端UA命中了黑名单规则,报错如下。
X-Tengine-Error: black ua
- 配置了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私有Bucket回源授权。
如果出现如下错误,说明是OSS防盗链鉴权返回的403,则需要检查OSS的防盗链设置。
You are denied by bucket referer policy
修改OSS的防盗链配置,详情请参见设置防盗链。
如果出现如下错误,说明是开启私有Bucket回源授权的情况下访问了OSS的静态首页,目前CDN的私有Bucket回源功能和OSS的静态网站托管功能冲突,无法一起使用。
You are forbidden to list buckets
您可以根据实际情况选择以下一种解决方法进行处理:
- 关闭阿里云OSS私有Bucket回源授权,详情请参见关闭私有Bucket回源授权。
- 关闭OSS的静态网站托管功能,详情请参见静态网站托管,删除静态网站托管配置。