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

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

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

当前回答

根据hobodave的帖子:“如果通过HTTPS协议查询脚本,则设置为非空值。”

if (!empty($_SERVER['HTTPS']))
{
    $secure_connection = true;
}

其他回答

我使用了这里的主要建议,当没有设置HTTPS时,日志中的“PHP通知”让我很恼火。你可以使用空合并操作符"?? ?":

if( ($_SERVER['HTTPS'] ?? 'off') == 'off' ) {
    // redirect
}

(注意:在php v7之前不可用)

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

这也适用于$_SERVER['HTTPS']未定义的情况

if( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 ){
    //enable secure connection
}

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

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

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

我的系统使用cloudflare。我必须访问$_SERVER['HTTP_CF_VISITOR']值。

$isSsl = false; 
    if (isset($_SERVER['HTTP_CF_VISITOR'])) {
        $cfDecode = json_decode($_SERVER['HTTP_CF_VISITOR']);
        if (!empty($cfDecode) && !empty($cfDecode->scheme) && $cfDecode->scheme == 'https') {
            $isSsl = true;
        }
    }
var_dump($isSsl);