php获取带端口域名需判断协议和端口:https时默认443、http时默认80,非默认端口才显式拼接;优先用$_server[‘server_name’]和$_server[‘server_port’],反向代理下应读取x-forwarded-port等头并校验来源。
PHP 获取带端口的域名,关键看是否启用 HTTPS 和端口是否为默认值(80/443)——非默认端口必须显式拼接,否则 $_SERVER['HTTP_HOST'] 通常不包含端口。
为什么 $_SERVER['HTTP_HOST'] 有时没端口?
浏览器在请求默认端口(HTTP 的 80、HTTPS 的 443)时,Host 请求头会省略端口。所以即使你访问 http://example.com:80,$_SERVER['HTTP_HOST'] 也只返回 example.com;同理 https://example.com:443 也只返回 example.com。
只有当端口非默认时(如 :8080、:8443),$_SERVER['HTTP_HOST'] 才会包含端口。
- 安全起见,不要直接信任
$_SERVER['HTTP_HOST']—— 它可能被客户端伪造 - 若需构造绝对 URL(如重定向、生成链接),应主动判断协议和端口
- 反向代理(如 Nginx + PHP-FPM)环境下,
$_SERVER['SERVER_PORT']可能是代理端口(如 80),而非真实后端端口,此时需依赖X-Forwarded-Port等头
手动拼接带端口域名的可靠方法
组合 $_SERVER['SERVER_NAME'] 或可信的域名配置 + $_SERVER['SERVER_PORT'],再根据 $_SERVER['HTTPS'] 或 $_SERVER['SERVER_PORT'] 判断协议。