一、问题描述
客户反馈一个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访问协议处理流程