感觉碰到这个问题好几次了,原因都一定相同。
造成无限重定向这一问题的诱因有挺多种,就再记录下一种。
运行环境 Runtime environment
1 | 操作系统 : Ubuntu18.04 |
症状
我的这个网站使用了多个域名:
yiwuwuyi.net(主域名)
yiwuwuyi.cn(主域名)
yiwuwuyi.uk
yiwuwuyi.org
还有一个旧域名:proj.org.cn
两个主域名中,yiwuwuyi.net主要服务国外用户、yiwuwuyi.cn主要服务国内用户。而yiwuwuyi.cn是通过反向代理yiwuwuyi.net来提供服务的,再在前面使用腾讯CDN进行加速,减少带宽压力。
在配置完成后我发现一个问题,我网站中有一些诸如留言框、搜索表单等交互性的功能,在输入内容并提交后可以到达后端服务器,但后端返还的内容却显示为空白页。通过浏览器控制台检查,发现腾讯CDN返还了一个他们自定义的响应码。
在经过一系列测试后,我可以肯定我的主站(yiwuwuyi.net)是正常的,所以问题出现在国内主站(yiwuwuyi.cn)中。再次使用浏览器的控制台检查,发现提交表单后,后端服务器返还的“Location”值不正确而导致无限重定向。
原因
我的站点是强制使用HTTPS的,DNS根据来源IP区分国内然后分别返还设定的IP。
当用户通过yiwuwuyi.cn给我留言时,留言通过:
传送到我的后端,然后后端跳转到:
并附带响应头:
Location: http://yiwuwuyi.net/2017/01/... …
就是因为这个响应头,导致了无限重定向。因为我的网站强制使用HTTPS,那么当后端跳转到http://yiwuwuyi.net时,服务器会将其重定向到https://yiwuwuyi.cn。然而到这里并没有完结,因为链接变成了:
当用户被重定向到上面这个连接时,因为时.php的动态文件,所以要请求后端,然而后端响应的内容和第一次响应的一样。因此再一次地进行上面的重定向过程。由此陷入无限循环。
解决
问题复杂,但也需要花点时间才能理解,但解决办法却很简单。
我只需要在我的反向代理服务器中添加一下两行即可:
proxy_redirect http://yiwuwuyi.net https://yiwuwuyi.cn;
proxy_redirect https://yiwuwuyi.net https://yiwuwuyi.cn;
以上两行内容的意思是将后端的响应头中Location字段进行替换:
总结
一切又再次恢复正常,跳转和链接都工作正常,这样还能减少不必要的跳转。
这是在服务器上解决问题,如果依然出现,那就要检查一下是否是在NS上出了问题。