一尘不染

如何确定您是否在不使用$ _SERVER ['HTTPS']的情况下使用HTTPS

php

我在线上看过很多教程,说您需要检查$_SERVER['HTTPS']服务器是否通过HTTPS进行了安全连接。我的问题是,在我使用的某些服务器上,这$_SERVER['HTTPS']是一个未定义的变量,导致错误。我可以检查是否应该定义另一个变量?

为了清楚起见,我目前正在使用以下代码来确定它是否为HTTPS连接:

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

阅读 527

收藏
2020-05-26

共1个答案

一尘不染

即使$_SERVER['HTTPS']未定义,这也应该始终有效 :

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

该代码与IIS兼容。

1)如果通过HTTPS协议查询脚本,则设置为非空值。

2)请注意,当将ISAPI与IIS一起使用时,如果请求不是通过HTTPS协议发出的,则该值将为“ off”。(对于运行PHP作为Fast-
CGI应用程序的IIS7,已经报告了相同的行为)。

另外,$_SERVER['HTTPS']即使安全连接,Apache1.x服务器(以及损坏的安装)也可能尚未定义。尽管不能保证,但按照惯例,端口443上的连接可能使用安全套接字,因此需要进行额外的端口检查。

附加说明:如果客户端与服务器之间存在负载平衡器,则此代码不会测试客户端与负载平衡器之间的连接,而是测试负载平衡器与服务器之间的连接。要测试以前的连接,您必须使用HTTP_X_FORWARDED_PROTO标头进行测试,但这要复杂得多。

2020-05-26