20

我遇到的问题与需要保留受 HTTPS 保护的网站的一些 url 和其余的踢到 HTTP 的需要有关。

通常,您拥有$_SERVER['HTTP_HTTPS']$_SERVER['HTTPS'](取决于您的 Apache 风格)。您还可以检查端口 - 正常流量为 80,HTTPS 为 443。

我的问题是证书位于负载均衡器上,所有这些变量都不可用,并且网络服务器在端口 80 上看到http://www.foo.com。解决此问题的一种方法是告诉负载均衡器发送流量一个不同的端口,但我想知道是否有其他方法可以检测来自负载均衡器的 HTTPS?

4

3 回答 3

47

如果有人在 Amazon AWS Elastic Load Balancer 背后遇到同样的问题,解决方案很简单,因为$_SERVER变量将包括:

[HTTP_X_FORWARDED_PORT] => 443
[HTTP_X_FORWARDED_PROTO] => https

因此,要获取协议,您可以使用:

function getRequestProtocol() {
    if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO']))
        return $_SERVER['HTTP_X_FORWARDED_PROTO'];
    else 
        return !empty($_SERVER['HTTPS']) ? "https" : "http";
}
于 2012-01-27T10:26:59.490 回答
15

如果负载均衡器是 SSL 连接的另一端,则您无法获得比负载均衡器明确提供的更多信息。我会去添加一个 http 标头,它可能已经这样做了,转储所有 HTTP 标头并查看。

作为另一种解决方案,您可以根据 URL 在负载均衡器上进行重定向。

于 2009-01-16T23:23:23.663 回答
1

$_SERVER['HTTP_X_FORWARDED_PROTO'] 对于 joomla 用户来说似乎是一个很好的解决方案,因为如果您的负载均衡器进行重定向并且您将 force_ssl 设置设置为 1 或 2,那么您将在无限循环中结束,因为 joomla 总是看到 http:

于 2014-03-26T11:04:48.473 回答