作者:睿得
一、問題描述
客戶反饋一個CDN加速域名解析切換到CDN的CNAME之後,訪問出現301循環重定向的現象。
與客戶確認目前的業務架構如下:
測試直接訪問WAF(阿里雲CDN源站),響應301 Redirect;
測試直接訪問AWS CloudFront(阿里雲WAF源站),可以正常訪問到網站內容。
二、分析驗證
經過CDN/WAF後得到的結果與直接訪問源站的結果不一致的情況,一般來說是由於CDN/WAF回源時的請求與直接訪問源站時的請求有區別,導致了源站做出了不同的響應結果。
對於301循環重定向的情況,最常見的一種情況就是http-->https的跳轉。問題可以穩定復現,所以很容易測試和定位。
通過http直接訪問AWS CloudFront,可以看到AWS響應了301 Redirect,重定向到https。
進一步核實,WAF上配置了“Enable HTTP back-to-source”的開關,強制WAF使用http協議回源。
循環重定向的訪問路徑:
客戶瀏覽器 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。
最後,為了清空CDN上301狀態的緩存,請客戶在CDN控制檯上進行手工刷新操作。
客戶反饋操作完成後,測試業務恢復正常。
五、新的問題
問題解決幾分鐘後,客戶反饋部分的PC、手機上訪問網站還是會出現301循環重定向的情況。有的人,同一臺電腦上的不同瀏覽器,有些正常,有些不正常。嘗試清理瀏覽器的緩存後問題依舊。
六、分析測試
通過在有問題的客戶端上分析http響應頭,發現一些CDN節點上還有301狀態的緩存。難道是刷新沒有完全成功?
進一步查看CDN節點的緩存時間,是在客戶操作之後才緩存的。
通過檢查客戶CDN配置,發現客戶沒有關閉“Use the same protocol as the back-to-source protocol”的開關。
而另一方面,當有https的請求發到AWS上時,AWS響應的200 OK的響應頭中有no-cache的header。
當有http的請求發到AWS上時,AWS響應的301 Redirect的響應頭中沒有no-cache的header。
所以無論有多少人正常的通過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的跳轉。
3、操作後,手工刷新CDN緩存,測試全部恢復正常。
八、附錄:CDN/WAF訪問協議處理流程