返回

用 $_SERVER['HTTP_HOST'] 还是 $_SERVER['SERVER_NAME']?详解 PHP 中的不同场景

php

_SERVER['HTTP_HOST'] vs. _SERVER['SERVER_NAME']: 正确理解 PHP 文档

在使用 PHP 编写脚本时,明确 _SERVER['HTTP_HOST'] 和 _SERVER['SERVER_NAME'] 之间的区别至关重要。这两个变量用于定义链接,但它们具有不同的应用场景和安全注意事项。

$_SERVER['SERVER_NAME']

$_SERVER['SERVER_NAME'] 的值由 Web 服务器配置决定,通常由 VirtualHost、ServerName 和 UseCanonicalName 等指令设置。它表示服务器在网络上的主机名或域。

$_SERVER['HTTP_HOST']

$_SERVER['HTTP_HOST'] 的值则源自客户端请求。它表示客户端用于访问服务器的请求头中的主机名或域。

选择合适的变量

根据这两个变量的定义,我们得出以下结论:

  • 如果链接需要根据服务器配置定义,请选择 $_SERVER['SERVER_NAME']。
  • 如果链接需要根据客户端请求定义,请选择 $_SERVER['HTTP_HOST']。

对于大多数网站而言,使用 $_SERVER['HTTP_HOST'] 是更明智的选择。它确保链接在不同的服务器配置下依然有效,并且更能抵抗 XSS 攻击。

安全注意事项

虽然 _SERVER 变量通常被视为不安全,但 _SERVER['HTTP_HOST'] 被认为是安全的。这是因为它基于客户端请求,而不是服务器配置,因此不太可能被恶意用户利用。

示例

以下是如何使用 $_SERVER['HTTP_HOST'] 定义链接的示例:

$link = 'http://' . $_SERVER['HTTP_HOST'] . '/contact-us.php';

结论

  • _SERVER['HTTP_HOST'] 和 _SERVER['SERVER_NAME'] 具有不同的应用场景。
  • 对于大多数网站,使用 $_SERVER['HTTP_HOST'] 定义链接更安全。
  • $_SERVER['HTTP_HOST'] 被认为是安全的,即使在表单中使用也是如此。

常见问题解答

1. 为什么 _SERVER['HTTP_HOST'] 比 _SERVER['SERVER_NAME'] 更安全?
答:因为 _SERVER['HTTP_HOST'] 基于客户端请求,而 _SERVER['SERVER_NAME'] 基于服务器配置,后者更易于被攻击者操纵。

2. 是否可以将 $_SERVER['HTTP_HOST'] 用于重定向?
答:可以,它被广泛用于在网站的不同部分之间重定向。

3. $_SERVER['HTTP_HOST'] 是否始终可用的?
答:在某些情况下,例如客户端禁用 HTTP 头部,$_SERVER['HTTP_HOST'] 可能不可用。

4. 使用 $_SERVER['HTTP_HOST'] 定义绝对路径时,是否需要包含协议(例如 https://)?
答:是的,为了确保链接的可靠性,在使用 $_SERVER['HTTP_HOST'] 定义绝对路径时,请务必包含协议。

5. 是否可以在 URL 中使用 _SERVER['HTTP_HOST'] 和 _SERVER['SERVER_NAME']?
答:不建议在 URL 中同时使用这两个变量,因为它们可能导致不可预测的行为。