问题描述
启用CDN系列产品(CDN、DCDN、SCDN)加速后,客户端请求经过CDN节点与直接访问源站的结果不同。
问题原因
当客户端请求达到CDN节点后,会进行下列判断:
- 命中缓存
CDN节点直接返回结果给客户端。 - 未命中缓存
CDN节点转发客户端请求,同时在HTTP Request Header请求头中追加一些特定的参数,最终请求源站,也就是俗称的“回源”。示意图如下。
某些情况下,源站对于HTTP Request Header请求头中追加的特定参数会有不同的处理方式,导致客户端请求被处理后的结果与直接访问源站不一致。例如:源站会判断请求头中是否含有Via参数,以此确认请求是否来自代理服务器,然后做出不同的响应。
解决方案
通过下列两个步骤进行处理:
步骤一:定位导致此问题的请求头参数
由于源站只针对特定的请求头参数返回不同的结果,所以需要先定位该特定的参数。定位步骤如下:
- 在本地通过以下curl命令直接访问源站,并记录返回结果。
curl -voa 'http://[$Your_Wesbite]' -x [$Source_Server_IP]:[$Source_Server_Port]
说明:
- [$Your_Wesbite]:指您的网站域名。
- [$Source_Server_IP]:指源站服务器的公网IP地址。
- [$Source_Server_Port]:指源站服务器的网站端口,通常该端口为80或443。
- 在本地通过以下curl命令,附加阿里云CDN节点的特定请求头参数,然后请求源站,并记录返回结果。
curl -voa 'http://www.[$Your_Wesbite].com' -x [$Source_Server_IP]:[$Source_Server_Port] -H 'Via:example.aliyundoc.com'
说明:此处以“Via:example.aliyundoc.com”为例,现场可以自定义请求头参数及值,关于阿里云CDN附加的请求头参数,请参见更多信息。
- 对比步骤1和步骤2的结果,检查是否存在不一致的情况。
- 结果一致。
请循环步骤1和步骤2,同时替换步骤2中的请求头参数,直到返回结果不一致。 - 结果不同。
记录结果不同时的请求头参数,然后继续下一步骤。
- 结果一致。
步骤二:修改源站配置或者删除问题参数
当定位到具体的请求头参数时,可参考下面两种方式进行处理:
- 修改源站配置
请检查源站的Web服务器配置,是否存在根据不同的请求头有不同响应的配置。如果存在,请根据实际需求进行调整。 - 在CDN控制台删除追加的请求头参数
如果定位到的请求头参数对您的业务没有实际作用,您可以在CDN控制台配置删除该请求头参数。关于如何删除请求头参数,请参见配置回源HTTP请求头。说明:目前仅阿里云CDN产品支持删除HTTP请求头,SCDN和DCDN暂不支持。如果业务需要,请提交工单联系阿里云技术支持。
更多信息
下面举例介绍CDN节点追加的特定参数。
Via: cn2XXX6.l1, vcache10.cnXXX36, l2cnXXX5.l2, cache28.lXXX35
Eagleeye-Traceid: 24689aa4XXXX58162753e
Ali-Swift-Log-Host: example.aliyundoc.com
Ali-Swift-Stat-Host: demo.example.aliyundoc.com
X-Forwarded-For: 58.XX.XX.41
X-Client-Scheme: http
Ali-Cdn-Real-Ip: 58.XX.XX.41
Ali-Swift-5Xx-No-Retry: on
Cdn-Src-Ip: 127.0.0.1
Ali-Swift-Range-Cache: on
说明:下面列举重要的参数说明。
- Via:请求经过的CDN节点信息。
- Ali-Cdn-Real-Ip:客户端真实IP地址。
- Ali-Swift-Range-Cache:如果您启用了Range回源,CDN节点就会追加该参数,详情请参见配置Range回源。
- X-Forwarded-For:标准的HTTP XFF字段。
适用于
- CDN
- DCDN
- SCDN