$_SERVER[‘http_HOST’]为空通常因请求未携带Host头,如直连IP、代理剥离或nginx未配置fastcgi_param HTTP_HOST $http_host;应组合HTTP_HOST、SERVER_NAME等变量安全获取域名。

$_SERVER[‘HTTP_HOST’] 为空时的常见原因
php 中 $_SERVER['HTTP_HOST'] 为空,通常不是 PHP 配置问题,而是请求根本没带 Host 头——比如用 curl http://127.0.0.1:8080/ 直连 IP、或浏览器直接输 http://127.0.0.1、又或者某些代理/负载均衡器剥离了 Host。Nginx/apache 在 FastCGI 转发时若未显式透传 Host,也会导致它丢失。
验证方式很简单:在脚本开头加一行 var_dump($_SERVER);,搜索 HTTP_HOST 和 SERVER_NAME 字段是否存在、是否为空。
比 $_SERVER[‘HTTP_HOST’] 更可靠的域名获取方式
依赖单一变量风险高,应组合判断:
-
$_SERVER['HTTP_HOST']优先(含端口,如example.com:8080) - 降级用
$_SERVER['SERVER_NAME'](Apache/Nginx 配置的 ServerName,不带端口,但可能被伪造) - 再降级可拼接
$_SERVER['SERVER_ADDR'] . ':' . $_SERVER['SERVER_PORT'](仅限调试,不可用于生成 URL)
注意:$_SERVER['REQUEST_URI'] 或 $_SERVER['PHP_SELF'] 不含域名,不能用来补全。
立即学习“PHP免费学习笔记(深入)”;
nginx 配置中 Host 头丢失的典型配置错误
FastCGI 场景下,如果 nginx 的 fastcgi_param 没正确传递 Host,$_SERVER['HTTP_HOST'] 就会空。检查你的 fastcgi_params 或站点配置里是否有这行:
fastcgi_param HTTP_HOST $http_host;
如果没有,或写成了 $host(不含端口)、$server_name(静态值),就会出问题。正确写法必须是 $http_host,它直接映射请求头中的 Host 字段。
另外,若启用了 underscores_in_headers on;,且客户端 Host 头含下划线(如 my_site.com),nginx 默认会丢弃该头——这也是静默为空的原因之一。
开发环境本地测试时的坑
用 php -S 内置服务器时,$_SERVER['HTTP_HOST'] 值取决于你浏览器访问时输入的地址:
- 访问
http://localhost:8000→HTTP_HOST = 'localhost:8000' - 访问
http://127.0.0.1:8000→HTTP_HOST = '127.0.0.1:8000' - 但用
curl 127.0.0.1:8000(无 Host 头)→HTTP_HOST为空
所以本地调试务必用完整 URL 测试,或在 curl 中手动加 Host:curl -H "Host: example.com" http://127.0.0.1:8000。
真正容易被忽略的是:https 环境下,有些反向代理(如 Cloudflare)会把原始 Host 改成自己的域名,而把真实 Host 放进 $_SERVER['HTTP_X_FORWARDED_HOST'] ——这时得自己判断并信任该头(需配合白名单 IP 校验)。