通過CDN訪問與直接存取來源站點得到的結果不一樣,這個問題的原因可能在於CDN節點在回源請求時向HTTP Request Header中追加了特定參數,而來源站點對於這些參數有不同的處理邏輯,導致返回結果不一致。
問題描述
啟用CDN系列產品(CDN、DCDN)加速後,用戶端請求經過CDN節點與直接存取來源站點的結果不同。
問題原因
當用戶端請求達到CDN節點後,會進行下列判斷:
命中緩衝 CDN節點直接返回結果給用戶端。
未命中緩衝 CDN節點轉寄用戶端請求,同時在HTTP Request Header要求標頭中追加一些特定的參數,最終向來源站點發起回源請求。示意圖如下。
某些情況下,來源站點對於HTTP Request Header要求標頭中追加的特定參數會有不同的處理方式,導致用戶端請求被處理後的結果與直接存取來源站點不一致。例如:來源站點會判斷要求標頭中是否含有Via參數,以此確認請求是否來自Proxy 伺服器,然後做出不同的響應。
解決方案如下:
定位導致問題的要求標頭參數:
直接存取來源站點並記錄返回結果。
通過類比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欄位。