通过阿里云CDN系列产品访问与直接访问源站得到的结果不一样

更新时间:

问题描述

启用CDN系列产品(CDN、DCDN、SCDN)加速后,客户端请求经过CDN节点与直接访问源站的结果不同。

问题原因

当客户端请求达到CDN节点后,会进行下列判断:

  • 命中缓存
    CDN节点直接返回结果给客户端。
  • 未命中缓存
    CDN节点转发客户端请求,同时在HTTP Request Header请求头中追加一些特定的参数,最终请求源站,也就是俗称的“回源”。示意图如下。

某些情况下,源站对于HTTP Request Header请求头中追加的特定参数会有不同的处理方式,导致客户端请求被处理后的结果与直接访问源站不一致。例如:源站会判断请求头中是否含有Via参数,以此确认请求是否来自代理服务器,然后做出不同的响应。

解决方案

通过下列两个步骤进行处理:

  1. 定位导致此问题的请求头参数
  2. 修改源站配置或者删除问题参数

步骤一:定位导致此问题的请求头参数

由于源站只针对特定的请求头参数返回不同的结果,所以需要先定位该特定的参数。定位步骤如下:

  1. 在本地通过以下curl命令直接访问源站,并记录返回结果。
    curl -voa 'http://[$Your_Wesbite]' -x [$Source_Server_IP]:[$Source_Server_Port]
    说明
    • [$Your_Wesbite]:指您的网站域名。
    • [$Source_Server_IP]:指源站服务器的公网IP地址。
    • [$Source_Server_Port]:指源站服务器的网站端口,通常该端口为80或443。
  2. 在本地通过以下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附加的请求头参数,请参见更多信息
  3. 对比步骤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