我遇到的问题与需要保留一些受HTTPS保护的网站的网址有关,而其余部分则被踢到HTTP.
通常,你有$_SERVER['HTTP_HTTPS']
或$_SERVER['HTTPS']
(取决于你的Apache的味道).您还可以检查端口 - 正常流量为80,HTTPS为443.
我的问题是证书位于负载均衡器上,并且所有这些变量都不可用,并且网络服务器在端口80上看到http://www.foo.com.解决此问题的一种方法是告诉负载均衡器发送流量一个不同的端口,但我想知道是否有其他方法来检测来自负载均衡器的HTTPS?
如果任何人在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"; }
如果负载均衡器是SSL连接的另一端,则无法获得比负载均衡器明确提供的更多信息.我会去添加一个http标头,它可能已经这样做,转储所有HTTP标头并查看.
作为另一种解决方案,您可以基于URL在负载均衡器上执行重定向.