我在网上看到过很多教程,说你需要检查$_SERVER['HTTPS'],如果服务器连接是HTTPS安全的。我的问题是,在我使用的一些服务器上,$_SERVER['HTTPS']是一个未定义的变量,导致错误。是否有另一个变量我可以检查,总是应该定义?
只是为了清楚一点,我目前正在使用这段代码来解决它是否是一个HTTPS连接:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$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,共享主机提供商等。
享受。
这应该总是工作,即使$_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头进行测试,但这要复杂得多;请看这个答案下面的最新评论。
唯一可靠的方法是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