通过HTTPS访问时,$ _SERVER ['HTTPS']如何为空?

时间:2012-06-08 15:00:30

标签: php apache https

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

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

指定docs for mod_ssl

  

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

这是否意味着我需要明确

SetEnv HTTPS on
如果PHP以mod_php的形式运行以获得$_SERVER['HTTPS']设置,那么在Apache中

我想弄清楚我的系统中是否有问题,或者我是否看到了正常的行为。

3 个答案:

答案 0 :(得分:3)

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

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

否则, $ _ SERVER [“HTTPS”] 将为空..

答案 1 :(得分:1)

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

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

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

    $secure_connection = true;
}

顺便说一下,如果您的网站负载均衡且平衡器在内部常规HTTP连接上运行,也可能发生这种情况。

<强>更新

我不确定mod_userdir是否始终具有此效果,即使它未被使用。

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

答案 2 :(得分:0)

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