知识点
CDN作为分布式加速系统,不管如何,只是作为加速,不会对资源更改,返回给客户的内容需要和源站保持一致
问题描述
客户端请求经过CDN节点与直接访问源站的结果不同
问题分析
当客户端请求到达CDN节点后,会进行下列判断
命中缓存且缓存数据没有过期
CDN节点直接返回结果给客户端
未命中缓存
CDN节点转发客户端请求,同时在HTTP Request Header请求头中追加一些特定的参数,最终请求源站
原理图
某些情况下,源站对于HTTP Request Header请求头中追加的特定参数会有不同的处理方式,导致客户端请求被处理后的结果与直接访问源站不一致
例如:源站会判断请求头中是否含有Via参数,以此确认请求是否来自代理服务器,然后做出不同的响应。
解决方案
通过下列两个步骤进行处理
- 定位导致此问题的请求参数
- 修改源站配置或者删除问题参数
步骤一:定位导致此问题的请求头参数
由于源站只针对特定的请求头参数返回不同的结果,所以需要先定位该特定的参数。定位步骤如下
在本地通过以下curl命令直接访问源站,并记录返回结果
代码语言:javascript复制curl -voa 'http://www.[$Your_Wesbite].com' -x [$Source_Server_IP]:[$Source_Server_Port]
- [$Your_Wesbite]:指您的网站域名。
- [$Source_Server_IP]:指源站服务器的公网IP地址。
- [$Source_Server_Port]:指源站服务器的网站端口,通常该端口为80或443。
在本地通过以下curl命令,附加阿里云CDN节点的特定请求头参数,然后请求源站,并记录返回结果
代码语言:javascript复制curl -voa 'http://www.[$Your_Wesbite].com' -x [$Source_Server_IP]:[$Source_Server_Port] -H 'header'
对比步骤1和步骤2的结果,检查是否存在不一致的情况
结果一致。 请循环步骤1和步骤2,同时替换步骤2中的请求头参数,直到返回结果不一致。
结果不同。 记录结果不同时的请求头参数,然后继续下一步骤。
步骤二:修改源站配置或者删除问题参数
当定位到具体的请求头参数时,可参考下面两种方式进行处理:
修改源站配置
请检查源站的Web服务器配置,是否存在根据不同的请求头有不同响应的配置。如果存在,请根据实际需求进行调整
在CDN控制台删除追加的请求头参数
如果定位到的请求头参数对您的业务没有实际作用,您可以在CDN控制台配置删除该请求头参数。
代码语言:javascript复制Via: cn2**6.l1, vcache10.cn**36, l2cn**5.l2, cache28.l**35
Eagleeye-Traceid: 24689aa4*******58162753e
Ali-Swift-Log-Host: test.***.cn
Ali-Swift-Stat-Host: level2.test.***.cn
X-Forwarded-For: 58.***.***.41
X-Client-Scheme: http
Ali-Cdn-Real-Ip: 58.***.***.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字段。
小结
用户通过 URL 进行资源访问时,真实的客户访问资源时并不会关心节点和源站资源是否一致,一般都是cdn厂商的客户反馈访问节点和直接访问源站结果不一致或者节点回源拉取资源后和源站资源不一致,当用户通过 URL 进行资源访问时,如节点资源过期节点转发客户端请求,同时在HTTP Request Header请求头中追加一些特定的参数,请求源站,源站对于HTTP Request Header请求头中追加的特定参数会有不同的处理方式,导致客户端请求被处理后的结果与直接访问源站不一致。如果不需要请求头参数,可根据情况调整,同时注意域名是否有配置gzip压缩、图片转换、回源url改写,一般遇到节点和源站可以考虑下刷新。
疑问
哪些某些情况下,源站对于HTTP Request Header请求头中追加的特定参数会有不同的处理方式
当客户端请求到达CDN节点后,谁来判断是否命中cdn节点且缓存是否过期