通过CDN访问与直接访问源站得到的结果不一样,这个问题的原因可能在于CDN节点在回源请求时向HTTP Request Header中追加了特定参数,而源站对于这些参数有不同的处理逻辑,导致返回结果不一致。
问题描述
启用CDN系列产品(CDN、DCDN)加速后,客户端请求经过CDN节点与直接访问源站的结果不同。
问题原因
当客户端请求达到CDN节点后,会进行下列判断:
命中缓存 CDN节点直接返回结果给客户端。
未命中缓存 CDN节点转发客户端请求,同时在HTTP Request Header请求头中追加一些特定的参数,最终向源站发起回源请求。示意图如下。
某些情况下,源站对于HTTP Request Header请求头中追加的特定参数会有不同的处理方式,导致客户端请求被处理后的结果与直接访问源站不一致。例如:源站会判断请求头中是否含有Via参数,以此确认请求是否来自代理服务器,然后做出不同的响应。
解决方案如下:
定位导致问题的请求头参数:
直接访问源站并记录返回结果。
通过模拟CDN节点添加特定请求头参数的方式访问源站,并记录返回结果。
循环替换和测试不同的请求头参数,直到找到导致结果不一致的特定参数。
修改源站配置或删除问题参数:
检查源站Web服务器配置,根据实际需求调整对特定请求头参数的响应逻辑。
如果该请求头参数对业务无实际作用,且使用的是阿里云CDN产品,可以在CDN控制台配置中删除该请求头参数。注意:SCDN和DCDN暂不支持此功能,如有需要,请提交工单联系阿里云技术支持。
解决方案
步骤一:定位导致此问题的请求头参数
由于源站只针对特定的请求头参数返回不同的结果,所以需要先定位该特定的参数。定位步骤如下:
直接访问源站并记录返回结果。
curl -voa 'http://[$Your_Wesbite]' -x [$Origin_Server_IP]:[$Origin_Server_Port]
说明[$Your_Wesbite]:指您的网站域名。
[$Origin_Server_IP]:指源站服务器的公网IP地址。
[$Origin_Server_Port]:指源站服务器的网站端口,通常该端口为80或443。
通过模拟CDN节点添加特定请求头参数的方式访问源站,并记录返回结果。
curl -voa 'http://www.[$Your_Wesbite].com' -x [$Origin_Server_IP]:[$Origin_Server_Port] -H 'Via:example.aliyundoc.com'
说明此处以“Via:example.aliyundoc.com”为例,请根据实际情况自定义请求头参数及值。关于阿里云CDN附加的请求头参数,请参见更多信息。
对比步骤1和步骤2的结果,检查是否存在不一致的情况。
结果一致。 请循环步骤1和步骤2,同时替换步骤2中的请求头参数,直到返回结果不一致。
结果不同。 记录结果不同时的请求头参数,然后继续下一步骤。
步骤二:修改源站配置或者删除问题参数
当定位到具体的请求头参数时,可参考下面两种方式进行处理:
修改源站配置。 请检查源站的Web服务器配置,是否存在根据不同的请求头有不同响应的配置。如果存在,请根据实际需求进行调整。
在CDN控制台删除追加的请求头参数。 如果定位到的请求头参数对您的业务没有实际作用,您可以在CDN控制台配置删除该请求头参数。关于如何删除请求头参数,请参见删除请求头参数。
更多信息
下面举例介绍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字段。