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

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

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

当前回答

唯一可靠的方法是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['SERVER_PORT'],因为SSL通常运行在端口443上,但这并不是万无一失的。

这就是我解决这个问题的方法

$https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0 ||
        !empty($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
            strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0;

return ($https) ? 'https://' : 'http://';

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

唯一可靠的方法是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'] == 'on']在负载均衡器后面的服务器上不起作用)是:

$isSecure = false;
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
    $isSecure = true;
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') {
    $isSecure = true;
}
$REQUEST_PROTOCOL = $isSecure ? 'https' : 'http';

HTTP_X_FORWARDED_PROTO:标识HTTP请求的初始协议的事实标准,因为反向代理(负载均衡器)可能使用HTTP与web服务器通信,即使反向代理的请求是HTTPS http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Common_non-standard_request_headers