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

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

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

当前回答

如果你正在使用Apache,你可以一直依赖它

$_SERVER["REQUEST_SCHEME"]

验证所请求URL的方案。但是,正如在其他回答中提到的,在假设真的使用SSL之前,验证其他参数是谨慎的。

其他回答

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

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

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

唯一可靠的方法是Igor M。

$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://");

考虑以下: 你在使用nginx的fastcgi,默认情况下(debian, ubuntu) fastgi_params包含指令:

快进HTTPS $ HTTPS;

如果你没有使用SSL,它会被转换为空值,而不是'off',而不是0 你死定了。

http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html

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

/* 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变量,因为它是一个总是工作的直接复制粘贴。可以在产品脚本中使用此片段。

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

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

我会添加一个全局过滤器,以确保我检查的所有内容都是正确的;

function isSSL() {

    $https = filter_input(INPUT_SERVER, 'HTTPS');
    $port = filter_input(INPUT_SERVER, 'SERVER_PORT');
    if ($https) {

        if ($https == 1) {
            return true;
        } elseif ($https == 'on') {
            return true;
        }
    } elseif ($port == '443') {
        return true;
    }

    return false;
}