检测 PHP 中的 HTTPS 请求

2022-08-30 20:20:07

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

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

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


答案 1

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

答案 2

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

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


推荐