我在网上看到过很多教程,说你需要检查$_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;
}

其他回答

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

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

我的系统使用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);
$secure_connection = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || (!empty($_SERVER['HTTP_HTTPS']) && $_SERVER['HTTP_HTTPS'] != 'off') || $_SERVER['REQUEST_SCHEME'] == 'https' || $_SERVER['SERVER_PORT'] == 443) ? true : false;

代码正在检查任何可能的东西,也可以在IIS web服务器上工作。Chrome自v44不设置头HTTP: 1,所以检查HTTP_HTTPS是OK的。如果这段代码不匹配https,这意味着您的web服务器或代理服务器配置不佳。Apache本身设置HTTPS标志正确,但当你使用代理(例如nginx)时可能会有问题。你必须在nginx https虚拟主机中设置一些头文件

proxy_set_header   X-HTTPS 1;

并使用一些Apache模块通过从代理中查找X-HTTPS来正确设置HTTPS标志。搜索mod_fakessl, mod_rpaf等。

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

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

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

真正的答案:准备复制粘贴到一个[配置]脚本

/* configuration settings; X=edit may 10th '11 */
$pv_sslport=443; /* for it might be different, as also Gabriel Sosa stated */
$pv_serverport=80; /* X */
$pv_servername="mysite.com"; /* X */

/* X appended after correction by Michael Kopinsky */
if(!isset($_SERVER["SERVER_NAME"]) || !$_SERVER["SERVER_NAME"]) {
    if(!isset($_ENV["SERVER_NAME"])) {
        getenv("SERVER_NAME");
        // Set to env server_name
        $_SERVER["SERVER_NAME"]=$_ENV["SERVER_NAME"];
    }
}
if(!$_SERVER["SERVER_NAME"]) (
    /* X server name still empty? ... you might set $_SERVER["SERVER_NAME"]=$pv_servername; */
}

if(!isset($_SERVER["SERVER_PORT"]) || !$_SERVER["SERVER_PORT"]) {
    if(!isset($_ENV["SERVER_PORT"])) {
        getenv("SERVER_PORT");
        $_SERVER["SERVER_PORT"]=$_ENV["SERVER_PORT"];
    }
}
if(!$_SERVER["SERVER_PORT"]) (
    /* X server port still empty? ... you might set $_SERVER["SERVER_PORT"]=$pv_serverport; */
}

$pv_URIprotocol = isset($_SERVER["HTTPS"]) ? (($_SERVER["HTTPS"]==="on" || $_SERVER["HTTPS"]===1 || $_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://") :  (($_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://");

$pv_URIprotocol现在是正确的,可以使用了;示例网站= pv_URIprotocol美元。$ _SERVER(“SERVER_NAME”)。当然,字符串也可以替换为TRUE和FALSE。PV代表PortalPress变量,因为它是一个总是工作的直接复制粘贴。可以在产品脚本中使用此片段。