【发布时间】:2012-04-25 18:10:31
【问题描述】:
在过去的几个小时里,这一直让我发疯。似乎 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...任何想法,有人吗?
注意用反斜杠替换了示例中的斜杠,或者我认为我会发布“太多链接”。它们不是链接,它们是示例域。如果我想发布链接,我会添加一个锚。
【问题讨论】:
-
嗯,它表明重定向正在服务器级别被更改,因此问题很可能与 PHP 和/或 Apache 和/或我们的设置有关。客户端只接收 https >> https 重定向,即使我特别说明它应该是 https >> http。抱歉,也许应该在 OP 中更清楚地说明这一点。
标签: php apache http-headers haproxy