我在网上看到很多教程说你需要检查$_SERVER['HTTPS']
如果服务器连接受 HTTPS 保护。我的问题是在我使用的一些服务器上,$_SERVER['HTTPS']
是一个未定义的变量,会导致错误。我可以检查是否还有另一个应该始终定义的变量?
需要明确的是,我目前正在使用此代码来解析它是否是 HTTPS 连接:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$secure_connection = true;
}
}
即使在以下情况下,这也应该始终有效$_SERVER['HTTPS']
未定义:
function isSecure() {
return
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| $_SERVER['SERVER_PORT'] == 443;
}
该代码与 IIS 兼容。
来自PHP.net 文档和用户评论 http://www.php.net/manual/en/reserved.variables.server.php :
-
如果通过 HTTPS 协议查询脚本,则设置为非空值。
-
请注意,在 IIS 中使用 ISAPI 时,如果请求不是通过 HTTPS 协议发出,则该值将为“off”。 (对于将 PHP 作为 Fast-CGI 应用程序运行的 IIS7,已报告了相同的行为)。
此外,Apache 1.x 服务器(和损坏的安装)可能没有$_SERVER['HTTPS']
即使连接牢固也已定义。尽管不能保证,但端口 443 上的连接是通过习俗 https://www.rfc-editor.org/rfc/rfc2818#section-2.3,可能使用安全套接字 http://en.wikipedia.org/wiki/Secure_Sockets_Layer,因此需要进行额外的端口检查。
附加说明:如果客户端和服务器之间有负载均衡器,则此代码不会测试客户端和负载均衡器之间的连接,而是测试负载均衡器和服务器之间的连接。要测试以前的连接,您必须使用HTTP_X_FORWARDED_PROTO
header,但是做起来要复杂得多;看最新评论 https://stackoverflow.com/questions/1175096/how-to-find-out-if-youre-using-https-without-serverhttps/2886224#comment102520055_2886224在这个答案下面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)