Request::domain() 在接口统计中不可靠,因其仅读取并清洗 HTTP_HOST,无法应对反向代理、多域名绑定、CLI 调用及 CDN/WAF 篡改等场景;应按用途区分:真实入口用 x-forwarded-host + host()、路由绑定域名用 routeInfo()['__domain__']、资源路径用 Url::root(true),CLI 需手动补全域名,日志记录首选 $request->fullUrl()。

直接用 Request::domain() 就能拿到当前请求的域名,但接口统计场景下容易漏掉反向代理、多域名绑定、CLI 调用等边界情况——不处理这些,统计结果会错得离谱。
为什么 Request::domain() 在接口统计里不够用
它只读 HTTP_HOST 头并做简单清洗(去端口、转小写、切子域),但真实生产环境里:
- 反向代理(如 Nginx 终结 HTTPS)后,
HTTP_HOST可能是localhost:8080,而实际域名是api.example.com - 多域名绑定(
route_domain配置)时,Request::domain()返回的是请求头里的值,不是路由匹配到的绑定域名 - 队列任务或定时命令中调用该方法,
request()上下文为空,直接抛异常 - 某些 CDN 或 WAF 会篡改或清空
HTTP_HOST,导致返回空或错误值
接口统计必须用的域名获取方式
统计类逻辑不能依赖“看起来像”的域名,得明确区分来源和用途:
- 统计「真实访问入口」:用
$request->header('x-forwarded-host') ?: $request->host(),配合trust_host配置白名单(如['10.0.0.0/8', '127.0.0.1']) - 统计「路由绑定域名」(比如区分
shop.example.com和admin.example.com):必须在路由中间件之后取$request->routeInfo()['__domain__'] ?? null - 统计「协议+域名+子目录根路径」(用于拼接资源 URL 或跳转):用
Url::root(true),它已自动适配APP_URL配置和子目录部署 - CLI 环境补全:先判断
if ($request->isCli()) { app('request')->setDomain('https://api.example.com'); },再调用
fullUrl() 是接口日志记录的黄金标准
接口请求统计最常需要完整 URL(含参数),别拼 $_SERVER,也别信 url(true)(TP6 已废弃):
-
$request->fullUrl()自动处理协议、host、path、query,且兼容 Swoole/CLI(加前置判断即可) - 它不包含锚点(
#xxx),这对日志统计是好事——锚点不影响服务端逻辑 - 重写规则(如 Apache mod_rewrite 或 Nginx rewrite)下仍返回用户看到的 URL,不是原始
REQUEST_URI - 若需排除敏感参数(如
token=xxx),得手动解析查询字符串再拼:用parse_str($request->query(), $qs); unset($qs['token']); $cleanUrl = rtrim($request->fullUrl(), '?' . http_build_query($request->query())) . '?' . http_build_query($qs);
真正难的不是“怎么拿域名”,而是想清楚你要统计的是谁看到的域名、谁配置的域名、还是谁路由到的域名——三者可能完全不同。没理清这点,代码写得再全也没法对上监控大盘里的数字。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











