在 PHP 中检测 HTTPS 请求

Posted

技术标签:

【中文标题】在 PHP 中检测 HTTPS 请求【英文标题】:Detecting HTTPS requests in PHP 【发布时间】:2010-10-01 22:18:40 【问题描述】:

我遇到的问题与需要保留受 HTTPS 保护的网站的一些 url 而其余的则转移到 HTTP。

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

我的问题是 证书位于负载平衡器上,所有这些变量都不可用,并且网络服务器在端口 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";

【讨论】:

是否存在$_SERVER['HTTP_X_FORWARDED_PROTO'] 不会包含在 $_SERVER 变量中的情况? @eipark 肯定是因为它的客户端设置的标头,但是有条件返回。 @elpark 在您使用 aws 负载均衡器之前,我会说不,因为它是一个记录在案的功能:aws.typepad.com/aws/2010/10/…。 @eipark 是的,当您在负载均衡器和服务器之间时【参考方案2】:

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

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

【讨论】:

是的,很好的答案 hayalci。我一直在研究同样的问题(在我认为也是负载平衡的网站上),似乎我可以识别 HTTPS 使用的唯一方法是通过标题 HTTP_NOSSL。 True 表示 HTTP,false 表示 HTTPS。【参考方案3】:

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

【讨论】:

以上是关于在 PHP 中检测 HTTPS 请求的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中检测 Ajax 并确保请求来自我自己的网站

如何在php中检测ajax跨域请求

php [PHP]检测AJAX请求

PHP 检测Ajax请求

微信域名检测接口(官方api)——PHP请求示例

PHP 检测是否有ajax或json请求