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

其他回答

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

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

试试这个:

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,共享主机提供商等。

享受。

唯一可靠的方法是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

这应该总是工作,即使$_SERVER['HTTPS']是未定义的:

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

该代码与IIS兼容。

根据PHP.net文档和用户评论:

如果通过HTTPS协议查询脚本,请设置为非空值。 注意,当ISAPI与IIS一起使用时,如果请求不是通过HTTPS协议发出的,则该值将为“off”。(同样的行为也被报道为IIS7将PHP作为Fast-CGI应用程序运行)。

还有Apache 1。x服务器(和损坏的安装)可能没有定义$_SERVER['HTTPS'],即使安全连接。尽管不能保证,但按照惯例,端口443上的连接可能使用安全套接字,因此需要进行额外的端口检查。

另外注意:如果在客户端和服务器之间有一个负载均衡器,这段代码不会测试客户端和负载均衡器之间的连接,而是测试负载均衡器和服务器之间的连接。要测试前一个连接,你必须使用HTTP_X_FORWARDED_PROTO头进行测试,但这要复杂得多;请看这个答案下面的最新评论。

我刚刚有一个问题,我正在使用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环境变量