用 $_SERVER['HTTP_HOST'] 还是 $_SERVER['SERVER_NAME']?详解 PHP 中的不同场景
2024-03-09 02:51:24
_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 中同时使用这两个变量,因为它们可能导致不可预测的行为。