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

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

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

当前回答

我使用的最短方法:

$secure_connection = !empty($_SERVER['HTTPS']);

如果使用https,则$secure_connection为真。

其他回答

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

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

我知道这个答案有点晚了,但我把一堆答案结合起来,做了一个适用于所有用例的简单函数。

试试这个:

function is_ssl(){
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO']=="https"){ return true; }
elseif(isset($_SERVER['HTTPS'])){ return true; }
elseif($_SERVER['SERVER_PORT'] == 443){ return true; }
else{ return false; }
}

然后使用if,例如:

if(is_ssl()){
// WHAT TO DO IF IT IS SSL / HTTPS
}else{
// WHAT TO DO IF IT IS NOT SSL / HTTPS
}

此代码适用于Cloudflare,共享主机提供商等。

享受。

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

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

看起来很完美。

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

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

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

如果您正在使用Incapsula的负载均衡器,则需要使用IRule为您的服务器生成自定义报头。我创建了一个HTTP_X_FORWARDED_PROTO头,等于“http”,如果端口设置为80和“https”,如果它等于443。