2

在过去的几个小时里,这一直让我发疯。似乎 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 用反斜杠替换了示例中的斜杠,否则我认为我会发布“太多链接”。它们不是链接,它们是示例域。如果我想发布链接,我会添加一个锚点。

4

1 回答 1

0

找到了; 如果域名匹配(在本例中是这样做的),Pound 默认将任何位置标头重写为“最初请求的内容”。请参阅 ListenHTTPS 部分中的“RewriteLocation 0|1|2”;在我的情况下应该设置为 0(“不要这样做”)。

于 2012-04-26T08:09:09.447 回答