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 结语

一切又再次恢复正常,跳转和链接都工作正常,这样还能减少不必要的跳转。

更多反向代理的内容可以参考:

使用nginx 反向代理Google fonts & ajax 库