最可靠方式是用 parse_url($url, PHP_URL_HOST) 提取 host,再按需处理子域、IDN 和 IPv6;避免正则或 str_replace 硬切,注意反向代理下优先用 $_SERVER['SERVER_NAME']。
PHP中用
提取主域名最可靠
直接用
或
拿到的只是主机名(如
或
),但如果你手头是一个完整 URL 字符串(比如
),必须先解析再剥离路径。此时
是唯一推荐方式,它能准确分离 scheme、host、port、path、query、fragment。
常见错误是用
或正则硬切,结果在带端口、子域、IPv6 地址(如
)或特殊字符时直接崩。
返回 host 部分,不含端口(如
)
若需保留端口,用
单独获取,再手动拼接
注意:
对 IPv6 地址会返回带方括号的格式(
),这是合规行为,别误判为异常
去掉 www 前缀但不误伤其他子域?用条件判断别硬删
很多方案直接
,这会导致
变成
,完全错误。正确做法是明确判断 host 是否以
开头且长度刚好比
多出一个合法域名长度(即后面至少含一个点 + 二级域)。
安全写法:
更健壮可配合
验证剥离后的合法性(PHP 7.4+)
别用
—— 没加锚定边界,可能误替换路径里的 www
从
获取当前请求主域要注意协议和重写影响
如果目标只是当前页面的主域名(非任意 URL),不要自己拼
和
,因为反向代理(如 Nginx + Apache)下
可能被篡改,
环境变量
也可能缺失或值为
。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
优先用
—— 它来自 Web 服务器配置,更可信(但需确保 vhost 配置正确)
若用 Nginx,务必设置
,否则 PHP 可能拿不到
Apache 下开启
并配好
,才能让
可靠
国际化域名(IDN)要转 Punycode 才能安全比较
遇到中文域名(如
)时,
返回的是 UTF-8
编码
的 host,但 DNS 解析和
cookie
域名匹配要求 ASCII 格式(Punycode,如
)。直接拿原始 host 做域名白名单或存储,后续发 cookie 或跳转会失败。
PHP 5.4+ 用
转为标准格式
转之前先用
验证是否为合法 IDN,避免传入普通 ASCII 域名导致意外转换
注意:
是当前标准,旧版
已废弃
主域名提取看着简单,但真实环境里端口、IDN、代理头、子域策略、IPv6 这几处最容易漏掉验证。尤其别在没确认输入来源可信前,就对 host 做任何字符串操作。
parse_url()$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']example.comwww.example.com"https://blog.example.com:8080/path/to/page?x=1#section"parse_url()str_replace()[::1]parse_url($url, PHP_URL_HOST)blog.example.comparse_url($url, PHP_URL_PORT)PHP_URL_HOST[2001:db8::1]str_replace('www.', '', $host)www-admin.example.comadmin.example.comwww.www.if (substr($host, 0, 4) === 'www.' && strpos($host, '.', 4) !== false) { $host = substr($host, 4); }filter_var($host, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)preg_replace('/^www\./', '', $host)$_SERVER$_SERVER['HTTP_HOST']$_SERVER['HTTPS']HTTP_HOSTHTTPSoff$_SERVER['SERVER_NAME']fastcgi_param SERVER_NAME $server_name;UseCanonicalName OnServerNameSERVER_NAME例子.中国parse_url()xn--fsq.xn--fiqs8sidn_to_ascii($host, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46)idn_to_unicode()INTL_IDNA_VARIANT_UTS46IDNA_NONTRANSITIONAL_TO_ASCII