開發與維運

接入CDN/WAF後出現循環重定向問題的排查記錄

作者:睿得

一、問題描述

客戶反饋一個CDN加速域名解析切換到CDN的CNAME之後,訪問出現301循環重定向的現象。

image.png

與客戶確認目前的業務架構如下:

image.png

測試直接訪問WAF(阿里雲CDN源站),響應301 Redirect;

測試直接訪問AWS CloudFront(阿里雲WAF源站),可以正常訪問到網站內容。

image.png

二、分析驗證

經過CDN/WAF後得到的結果與直接訪問源站的結果不一致的情況,一般來說是由於CDN/WAF回源時的請求與直接訪問源站時的請求有區別,導致了源站做出了不同的響應結果。

對於301循環重定向的情況,最常見的一種情況就是http-->https的跳轉。問題可以穩定復現,所以很容易測試和定位。

image.png

通過http直接訪問AWS CloudFront,可以看到AWS響應了301 Redirect,重定向到https。

image.png

進一步核實,WAF上配置了“Enable HTTP back-to-source”的開關,強制WAF使用http協議回源。

image.png

循環重定向的訪問路徑:

客戶瀏覽器 https --> 阿里雲CDN https--> 阿里雲WAF http --> AWS CloudFront CDN 301 --> 客戶瀏覽器 https

四、解決方案

1、首先,聯繫客戶在WAF控制檯上關閉“Enable HTTP back-to-source”的開關,使WAF回源時使用https協議。

2、此外,注意到客戶在CDN上開啟了“Use the same protocol as the back-to-source protocol”的開關,這時,如果用戶通過http協議訪問CDN,CDN使用http協議回源,所以建議客戶同時在CDN控制檯上關閉“Use the same protocol as the back-to-source protocol”的開關,強制CDN使用https協議回源WAF。

image.png

最後,為了清空CDN上301狀態的緩存,請客戶在CDN控制檯上進行手工刷新操作。

客戶反饋操作完成後,測試業務恢復正常。

五、新的問題

問題解決幾分鐘後,客戶反饋部分的PC、手機上訪問網站還是會出現301循環重定向的情況。有的人,同一臺電腦上的不同瀏覽器,有些正常,有些不正常。嘗試清理瀏覽器的緩存後問題依舊。

image.png

六、分析測試

通過在有問題的客戶端上分析http響應頭,發現一些CDN節點上還有301狀態的緩存。難道是刷新沒有完全成功?

進一步查看CDN節點的緩存時間,是在客戶操作之後才緩存的。

image.png

通過檢查客戶CDN配置,發現客戶沒有關閉“Use the same protocol as the back-to-source protocol”的開關。

而另一方面,當有https的請求發到AWS上時,AWS響應的200 OK的響應頭中有no-cache的header。

image.png

當有http的請求發到AWS上時,AWS響應的301 Redirect的響應頭中沒有no-cache的header。

image.png

所以無論有多少人正常的通過https協議成功網站,CDN都不會緩存。而一旦有人不小心用http協議訪問了這個網址後,CDN就會緩存住301的狀態,導致後續的訪問者(無論是http還是https)都會出現301循環重定向的錯誤。

此外,對於301的狀態,一些瀏覽器(FireFox、移動端的Safari等)會一直進行緩存,所以還需要手工清理瀏覽器的本地緩存。

七、徹底解決

1、聯繫客戶關閉“Use the same protocol as the back-to-source protocol”的開關。

2、與客戶確認業務不需要http協議的訪問,在阿里雲CDN上配置http --> https的跳轉。

image.png

3、操作後,手工刷新CDN緩存,測試全部恢復正常。

八、附錄:CDN/WAF訪問協議處理流程

image.png

Leave a Reply

Your email address will not be published. Required fields are marked *