我遇到的问题与需要保留受HTTPS保护的网站的网址以及其他网站的网址有关。
通常,您有$_SERVER['HTTP_HTTPS']
或$_SERVER['HTTPS']
(取决于您的Apache风格)。您还可以检查端口 - 正常流量为80,HTTPS为443。
我的问题是证书位于负载均衡器,并且所有这些变量都不可用,并且网络服务器在端口80上看到http://www.foo.com。解决此问题的一种方法是告诉loadbalancer在不同的端口上发送流量,但我想知道是否有其他方法可以检测来自负载均衡器的HTTPS?
答案 0 :(得分:40)
如果任何人在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";
}
答案 1 :(得分:14)
如果负载均衡器是SSL连接的另一端,则无法获得比负载均衡器明确提供的更多信息。我会去添加一个http头,它可能已经这样做了,转储所有HTTP头并查看。
作为另一种解决方案,您可以根据URL在负载均衡器上进行重定向。
答案 2 :(得分:2)
$ _SERVER [' HTTP_X_FORWARDED_PROTO']似乎是joomla用户的一个很好的解决方案,因为如果您的负载均衡器执行重定向并且您将force_ssl设置为1或2,那么您将以无限循环结束因为joomla总是看到http: