问题描述
事情是这样的,自己用 SpringBoot + SpringSecurity 做了一个博客网站,然后通过又拍云的 CDN 做了加速。但是发现访问网站时会偶尔出现 重定向次数过多(ERR_TOO_MANY_REDIRECTS),导致无法访问网站,过了几十分钟可能又能访问了。但是直接通过 IP 访问源站,不走 CDN 时不会出现这个问题。
这个问题我冥思苦想、看源代码、看又拍云 CDN 配置,花了好多天时间还是没解决,最后没办法了,找了又拍云在线客服,终于解决了,不得不佩服又拍云客服解决问题的能力和速度啊👍👍👍!
问题原因
网站通过 SpringSecurity 对部分路径做了权限控制,因此对 Session 进行了管理,源站 Session 因为超时自动销毁后,客户端再请求就会被重定向从而再次请求来重新产生一个新的 Session。因此一旦 Session 超时,则源站会发生一次重定向,然后又拍云 CDN 缓存了重定向后的路径资源。所以就会导致客户端和 CDN 之间一直反复重定向,直至 ERR_TOO_MANY_REDIRECTS。
其实这个原因我也想到过,因为我观察源站打印的日志,在反复重定向的过程中,请求并没有进入源站,而且直接通过 IP 访问源站在 Session 因为超时自动销毁的情况下也只会重定向一次,所以问题一定出在 CDN 配置上面。
由上图可以看出,缓存时长为 20 分钟,所以偶尔出现重定向次数过多就解释得通了,缓存过期了就会回源请求到源站,假如这时候源站 Session 没过期,那请求就正常了。
解决方案
在又拍云 CDN 功能配置的缓存控制菜单下配置缓存规则,对于不缓存的路径,要设置 301 和 302 状态码,保证重定向不缓存。
总览——>CDN——>配置——>缓存控制——>缓存规则——>管理——>添加不缓存规则
记得一定要添加状态码,因为默认情况下返回状态码 301 和 302 是会缓存的,我就是百密一疏,没有添加状态码,才折腾了这么久😂。
评论