【问题标题】:How can $_SERVER['HTTPS'] be empty when accessing over HTTPS?通过 HTTPS 访问时,$_SERVER['HTTPS'] 如何为空?
【发布时间】:2012-06-08 15:00:29
【问题描述】:

当我实际通过 https 访问页面时,$_SERVER['HTTPS'] 为空时遇到问题。

根据docs for $_SERVER,通过 HTTPS 访问页面时,这应该是非空的。

编码docs for mod_ssl

该模块提供了大量 SSL 信息作为 SSI 和 CGI​​ 命名空间的附加环境变量。

这是否意味着我需要明确

SetEnv HTTPS on

在 Apache 中,如果 PHP 作为 mod_php 运行以获取 $_SERVER['HTTPS'] 设置?

我正在尝试确定我的系统是否有问题,或者我看到的行为是否正常。

【问题讨论】:

    标签: php apache https


    【解决方案1】:

    要在 .htaccess 中正确使用 SetEnv,您需要 mod_env 模块,例如:

    <IfModule mod_env.c>
       SetEnv HTTPS on
    </IfModule>
    

    否则,$_SERVER["HTTPS"] 将为空..

    【讨论】:

    • 我试过了,但现在$_SERVER["HTTPS"] 会“开启”,即使我没有使用 HTTPS。
    【解决方案2】:

    我相信SetEnv 不适用于 PHP 模块;您是否有机会使用mod_userdir?这可能会产生影响。

    或者,您可以使用这种检测:

    if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'
        || $_SERVER['SERVER_PORT'] == 443) {
    
        $secure_connection = true;
    }
    

    顺便说一句,如果您的站点是负载平衡的并且平衡器在内部通过常规 HTTP 连接运行,这也可能发生。

    更新

    我不确定mod_userdir 是否总是有这种效果,即使它没有被使用。

    就示例而言,您可以(确保没有人在查看)将其写入$_SERVER['HTTPS'] 本身,而不是为$secure_connection 赋值:)

    【讨论】:

    • 没有负载均衡器。 mod_userdir 已编译,但未使用。 SetEnv 有效;我主要是想弄清楚这是正常行为还是我有实际问题。不幸的是,您的示例对我不起作用,因为有第 3 方代码正在检查 $_SERVER['HTTPS']
    • @MPD 不能说太多关于 mod_userdir 究竟是如何影响它的,但是我已经添加了一种方法来仍然使用我发布的示例代码 :)
    【解决方案3】:

    您使用的是 Apache 2.x 还是 1.x?我在PHP docs for $_SERVER 上发现了一条评论,它说它不会使用 Apache 1 进行设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2012-09-21
      相关资源
      最近更新 更多