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

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

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

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

【问题讨论】:

    标签: php apache 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 :

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 2012-04-17
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多