在过去的几个小时里,这一直让我发疯。似乎 PHP/Apache/Pound/Haproxy(无法真正分辨)坚持将页面重定向到我之前使用的相同方案/域,即使我明确声明它应该是不同的。
背景:我们通常有一个 http:\\www.example.com 域耦合到一个 https:\\secure.example.com 安全域(注意不同的子域)。这使我们的开发变得容易,因为我们没有为所有开发人员/项目提供 SSL 证书,我们只需检查 URL 是否以“安全”开头。对于这个项目,客户希望 https:\\www.example.com 作为安全域,所以我想:没问题,我只需更改逻辑以检测到生产。那部分工作正常。
然而,在某些情况下,用户需要从安全重定向到非安全,例如在登录并被重定向到主页时。我已将其缩小到这个简单的测试用例(注意:安全和非安全公共目录只是彼此之间的符号链接):
<?php
// this is our server-specific way of detecting secure/non-secure in production
if (isset($_SERVER['HTTP_X_SSL_CIPHER'])) {
header("HTTP/1.1 Moved permanently", true, 301);
header("Location: http://www.example.com/test.php");
}
echo 'bubbles!';
您希望它在调用 https:\\www.example.com/test.php 后重定向一次,然后回显“bubbles!”。但是,我的浏览器坚持要重定向回httpS:\\www.example.com/test.php,从而导致死循环。
如果我用 HTTP 元刷新和/或 javascript 重定向替换标头调用一切正常,但我真的希望它与位置标头一起使用。Apache/PHP/Pound/Haproxy 似乎自己决定我应该坚持使用安全域,即使我明确告诉他们不要这样做。
需要注意的另一件有趣的事情是反向(从非安全重定向到安全)似乎工作正常。此外,在使用 https:\\secure.example.com 方案的其他站点(在同一服务器上)上,一切正常,大概是因为子域不同。
有谁知道为什么会发生这种情况,以及是什么原因造成的?我们的服务器设置是:Pound 将 https 请求分发到端口 8080 上的隐藏网络服务器,然后 haproxy 对端口 80(以及 IMAP 等其他一些东西)上的非安全网络服务器执行相同的操作,然后是一些普通的 Apache 网络服务器。
我唯一能想到的是负载均衡器以某种方式搞砸了,但这没有意义,因为来自网络服务器的回复直接发送回客户端 AFAICT ......任何想法,任何人?
NB 用反斜杠替换了示例中的斜杠,否则我认为我会发布“太多链接”。它们不是链接,它们是示例域。如果我想发布链接,我会添加一个锚点。