我在网上看到很多教程说您需要检查$_SERVER['HTTPS']服务器的连接是否受 HTTPS 保护。我的问题是,在我使用的某些服务器上,$_SERVER['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 文档和用户评论:
如果脚本是通过 HTTPS 协议查询的,则设置为非空值。 请注意,在将 ISAPI 与 IIS 一起使用时,如果请求不是通过 HTTPS 协议发出的,则该值将为“off”。(对于将 PHP 作为 Fast-CGI 应用程序运行的 IIS7 报告了相同的行为)。
如果脚本是通过 HTTPS 协议查询的,则设置为非空值。
请注意,在将 ISAPI 与 IIS 一起使用时,如果请求不是通过 HTTPS 协议发出的,则该值将为“off”。(对于将 PHP 作为 Fast-CGI 应用程序运行的 IIS7 报告了相同的行为)。
$_SERVER['HTTPS']此外,即使安全连接,Apache 1.x 服务器(和损坏的安装)也可能没有定义。虽然不能保证,但按照惯例,端口 443 上的连接可能使用安全套接字,因此需要进行额外的端口检查。
附加说明:如果客户端和您的服务器之间有负载均衡器,此代码不会测试客户端和负载均衡器之间的连接,而是测试负载均衡器和您的服务器之间的连接。要测试前一个连接,您必须使用HTTP_X_FORWARDED_PROTO标头进行测试,但这要复杂得多;请参阅此答案下方的最新评论。
HTTP_X_FORWARDED_PROTO
我将 cloudflare 用于我的系统。我必须访问该$_SERVER['HTTP_CF_VISITOR']值。
$_SERVER['HTTP_CF_VISITOR']
$isSsl = false; if (isset($_SERVER['HTTP_CF_VISITOR'])) { $cfDecode = json_decode($_SERVER['HTTP_CF_VISITOR']); if (!empty($cfDecode) && !empty($cfDecode->scheme) && $cfDecode->scheme == 'https') { $isSsl = true; } } var_dump($isSsl);