我在网上看到过很多教程,说你需要检查$_SERVER['HTTPS'],如果服务器连接是HTTPS安全的。我的问题是,在我使用的一些服务器上,$_SERVER['HTTPS']是一个未定义的变量,导致错误。是否有另一个变量我可以检查,总是应该定义?

只是为了清楚一点,我目前正在使用这段代码来解决它是否是一个HTTPS连接:

if(isset($_SERVER['HTTPS'])) {
    if ($_SERVER['HTTPS'] == "on") {
        $secure_connection = true;
    }
}

当前回答

我刚刚有一个问题,我正在使用Apache mod_ssl运行服务器,然而phpinfo()和var_dump($_SERVER)显示PHP仍然认为我在端口80上。

这是我的解决办法,任何人有同样的问题....

<VirtualHost *:443>
  SetEnv HTTPS on
  DocumentRoot /var/www/vhost/scratch/content
  ServerName scratch.example.com
</VirtualHost>

值得注意的是SetEnv线。有了这些,在重新启动之后,您应该有了您一直梦想的HTTPS环境变量

其他回答

Chacha,根据PHP文档:“如果通过HTTPS协议查询脚本,则设置为非空值。”你的if语句在很多HTTPS打开的情况下会返回false。您需要验证$_SERVER['HTTPS']是否存在并且非空。如果某个服务器的HTTPS设置不正确,您可以尝试检查$_SERVER['SERVER_PORT'] == 443。

但请注意,一些服务器也会将$_SERVER['HTTPS']设置为非空值,所以一定要检查这个变量。

参考:$_SERVER和$HTTP_SERVER_VARS的文档[已弃用]

我发现这些参数也是可以接受的,而且在切换web服务器时更可能不会出现误报。

$_SERVER['HTTPS_KEYSIZE'] $_SERVER['HTTPS_SECRETKEYSIZE'] $_SERVER['HTTPS_SERVER_ISSUER'] $_SERVER['HTTPS_SERVER_SUBJECT'] if($_SERVER['HTTPS_KEYSIZE'] != NULL){/*do foobar*/}

您可以检查$_SERVER['SERVER_PORT'],因为SSL通常运行在端口443上,但这并不是万无一失的。

你觉得这个怎么样?

if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
    $scheme = 'https';
else
    $scheme = 'http';

我不认为添加一个端口是一个好主意——特别是当你有很多不同版本的服务器时。这只是增加了一个要记住改变的东西。看医生的,我认为最后一行kaisers很好,所以:

if(!empty($_SERVER["HTTPS"]))
  if($_SERVER["HTTPS"]!=="off")
    return 1; //https
  else
    return 0; //http
else
  return 0; //http

看起来很完美。