返回

如何在没有 `$_SERVER['HTTPS']` 的情况下判断 HTTPS 连接?

php

## 在没有 $_SERVER['HTTPS'] 的情况下判断是否使用 HTTPS

在当今互联网安全至关重要的时代,判断服务器连接是否通过 HTTPS 安全进行至关重要。但是,$_SERVER['HTTPS'] 变量有时可能未定义,给开发人员带来了挑战。本文将探讨其他替代变量,以可靠地检测 HTTPS 连接。

替代变量

$_SERVER['HTTPS'] 无法使用时,可以使用以下替代变量:

  • $_SERVER['HTTP_X_FORWARDED_PROTO'] 指示请求中指定的协议,通常为用于连接的协议。
  • $_SERVER['HTTP_X_FORWARDED_SSL'] 布尔值,表示请求是否通过 SSL(HTTPS)连接。
  • $_SERVER['REMOTE_ADDR'] 客户端的 IP 地址。如果是本地环回地址(例如 127.0.0.1),请求可能通过 localhost 进行,在这种情况下不会使用 HTTPS。

示例代码

以下代码使用替代变量检测 HTTPS 连接:

if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") {
    $secure_connection = true;
} elseif(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == "https") {
    $secure_connection = true;
} elseif(isset($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == "on") {
    $secure_connection = true;
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] == "127.0.0.1") {
    $secure_connection = false;
} else {
    $secure_connection = false;
}

其他考虑因素

除了这些变量之外,还有一些其他因素可以帮助判断 HTTPS 连接:

  • $_SERVER['SERVER_PORT'] 服务器正在侦听的端口。对于 HTTPS,通常为 443。
  • $_SERVER['REQUEST_SCHEME'] PHP 8 中引入的变量,指示请求使用的方案(HTTP 或 HTTPS)。
  • get_headers() 函数: 可以用来检查 X-Forwarded-ProtoX-Forwarded-SSL 头,这些头通常包含有关连接的信息。

结论

通过使用这些替代变量和考虑因素,开发人员可以可靠地检测 HTTPS 连接,即使 $_SERVER['HTTPS'] 未定义。这对于确保在线交互的安全至关重要。

常见问题解答

Q1:为什么 $_SERVER['HTTPS'] 有时会未定义?
A1:这可能是由于命令行脚本、某些 Web 服务器或使用代理服务器或负载平衡器造成的。

Q2:哪个替代变量最可靠?
A2:$_SERVER['HTTP_X_FORWARDED_PROTO'] 通常是最可靠的,因为它直接来自请求。

Q3:$_SERVER['REMOTE_ADDR'] 如何指示 HTTPS?
A3:如果 IP 地址是本地环回地址,则请求可能通过 localhost 进行,在这种情况下不会使用 HTTPS。

Q4:可以使用多个替代变量来提高准确性吗?
A4:是的,建议检查多个变量以提高可靠性。

Q5:这些替代变量在所有情况下都准确吗?
A5:尽管这些变量通常很准确,但在某些罕见情况下它们可能不可靠,例如当使用自定义代理服务器或负载平衡器时。