最直接的方式是用$request->fullurl(),它自动拼出协议+域名+路径+查询参数,一步到位;该方法自动适配http/https、包含当前域名(含端口)、拼接完整查询字符串,但不包含锚点,且在路由重写环境下仍返回重写后的url。

最直接的方式是用 $request->fullUrl(),它自动拼出协议 + 域名 + 路径 + 查询参数,一步到位。
推荐方法:用 fullUrl()
这是 ThinkPHP 官方推荐且最稳妥的方案:
- 自动适配 HTTP/HTTPS 协议
- 自动包含当前域名(含端口,非标准端口不省略)
- 自动拼接请求路径和完整查询字符串(如
?id=1&status=ok) - 不包含锚点(
#section1),这点需注意 - 在路由重写环境下仍能正确返回重写后的 URL,不是原始
REQUEST_URI
替代方案:手动拼接(需谨慎)
如果因特殊原因不能用 fullUrl(),可组合使用:
$request->scheme() . '://' . $request->host() . $request->url()- 注意:
$request->url()返回的是路径 + 查询字符串(如/user/list?id=5),不含协议和域名 - 别用
$request->url(true)—— TP6.0+ 已废弃,调用会报错 - 避免直接拼
$_SERVER['HTTP_HOST']和$_SERVER['REQUEST_URI'],它不兼容反向代理、CLI 或 Swoole 环境
特别注意部署在子目录的情况
比如项目部署在 https://example.com/admin/:
-
$request->fullUrl()仍返回完整地址,如https://example.com/admin/user?id=1 -
$request->host()只返回example.com,不带子目录 - 子目录前缀(
/admin)实际由$request->baseFile()推导而来,框架内部已处理,无需手动干预
环境兼容性提醒
这些方法在 CLI 或 Swoole 环境下可能异常:
- 调用前建议判断:
if (!$request->isCli() && !$request->isSwoole()) { ... } - 否则会抛出异常,比如 “Method url does not exist” 或 “Undefined index: HTTP_HOST”
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











