检测PHP中的HTTPS请求

我遇到的问题是需要保留HTTPS保护的某个网站的url,剩下的则踢到HTTP。

通常情况下,你有$_SERVER['HTTP_HTTPS']$_SERVER['HTTPS'] (取决于你的Apache的味道)。 您也可以检查端口 – 正常stream量为80,HTTPS为443。

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

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

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

如果任何人在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"; } 

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