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