在 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 请求的主要内容,如果未能解决你的问题,请参考以下文章