【问题标题】:Why isn't _SERVER["HTTPS"] set to 1?为什么 _SERVER["HTTPS"] 没有设置为 1?
【发布时间】:2012-07-25 13:19:18
【问题描述】:

我的网站有一个 SSL 证书,我正在点击 https://mysite.com/info.php,但在 PHP 变量部分下没有报告 _SERVER["HTTPS"]。我相信这会导致 Drupal 网站出现问题,其中一些 URL 以 https://... 形式写入页面,而另一些则以 http://... 形式写入页面。

什么决定是否设置了 _SERVER["HTTPS"]?


编辑:这可能是我的问题Detecting HTTPS vs HTTP on server sending back nothing useful 的答案。可能是负载平衡器问题

【问题讨论】:

  • 这是在什么网络服务器上运行的?
  • Apache,我很确定负载均衡器是问题所在。 IT部门提到他们专门设置了PHP变量HTTP_USESSL。安全页面模块已更改为检查该变量而不是 HTTPS。
  • 与其更改默认模块(这将在下次升级时中断),不如考虑在 boostrap 文件中的某处执行$_SERVER['HTTPS'] = isset( $_SERVER['HTTP_USESSL'] ) ? 'YES' : '' ),这样以后的升级不会中断。
  • 我同意...继承代码。我将来可能会做出这样的改变,这样模块本身就不会被黑客入侵。谢谢。

标签: php apache webserver


【解决方案1】:

事实证明,由于处理 SSL 加密/解密的负载均衡器,Web 服务器没有获得 $_SERVER["HTTPS"],但 $_SERVER["HTTP_USESSL"] 已设置并可用作SSL 流量的闪存。

【讨论】:

    【解决方案2】:

    它在文档中说$_SERVER['HTTPS']

    Set to a non-empty value if the script was queried through the HTTPS protocol.
    

    所以

    function checkHTTPS() {
        if(!empty($_SERVER['HTTPS']))
            if($_SERVER['HTTPS'] !== 'off')
                return true; //https
            else
                return false; //http
         else
            if($_SERVER['SERVER_PORT'] == 443)
                return true; //https
            else
                return false; //http
    }
    

    【讨论】:

    • 是的,但我要说的是当我查看 phpinfo(); 的输出时它没有为 _SERVER["HTTPS"] 显示任何内容......它根本没有设置,但据我所知(SSL 证书和 url 是 https://......)
    • 这取决于您的服务器配置(Apache、nginx 等)及其传递给 PHP 的变量。我想另一种方法是$_SERVER['SERVER_PORT'] == '443'
    • 这里我做了一个函数(未测试)
    • SSL 端口在大多数情况下是 443,但并非总是如此。
    【解决方案3】:

    在代理/负载均衡器后面

    $_SERVER['SERVER_PORT'] 总是 80

    $_SERVER["HTTPS"] 和 $_SERVER["HTTP_USESSL"] 为 NULL

    我使用了返回 http 或 https 的 $_SERVER['HTTP_X_FORWARDED_PROTO']

    【讨论】:

    • 其出色的解决方案。工作对我来说就像一个魅力。谢谢!
    【解决方案4】:

    添加到 Arnaud Hallais 的帖子中,我设法在我的 localhost (apache/mac)、测试服务器 (apache/linux) 和生产站点 (iis/win) 上获得正确协议的唯一方法是:

    define("PROTOCOL", isset($_SERVER['HTTP_X_FORWARDED_PROTO']) ? $_SERVER['HTTP_X_FORWARDED_PROTO'] : ((isset( $_SERVER["HTTPS"] ) && strtolower( $_SERVER["HTTPS"] ) == "on" ) ? 'https' : 'http')); 
    

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2012-05-23
      • 1970-01-01
      • 2016-03-17
      相关资源
      最近更新 更多