2009-01-16 40 views
17

我遇到的问题是需要保留HTTPS保护的某个网站的某些网址,其余的网址都是HTTP。在PHP中检测HTTPS请求

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

我的问题是,证书坐在负载平衡器,而所有这些变量是不可用的,和web服务器看到http://www.foo.com端口80上的一个方法来解决这个是告诉负载均衡器上发送不同的交通端口,但我想知道是否有其他方法来检测来自负载均衡器的HTTPS?

回答

14

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

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

+0

是的,很好的答案hayalci。我刚刚查看了同样的问题(在一个我认为也是负载平衡的站点上),并且似乎唯一可以识别HTTPS使用的方法是通过头文件'HTTP_NOSSL`。 True表示HTTP,false表示HTTPS。 – 2011-08-17 02:54:24

38

如果有人有一个亚马逊AWS弹性负载均衡背后的同样的问题,解决方法很简单,因为$_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"; 
} 
+2

是否曾有过$ _SERVER ['HTTP_X_FORWARDED_PROTO']`不会包含在$ _SERVER var中的情况? – eipark 2012-07-29 09:13:45

2

$ _SERVER ['HTTP_X_FORWARDED_PROTO']似乎是joomla用户的一个很好的解决方案,因为如果您的loadbalancer执行重定向并且将force_ssl设置为1或2,那么您将以无限循环结束,因为joomla总是会看到http: