ThinkPHP获取不带域名的相对网页路径应优先使用request()->baseUrl(),它自动返回不含QUERY_STRING的路径(如/index/index/hello.html),兼容PATH_INFO和入口文件逻辑;若只需路由路径标识,可用request()->path()获取精简路径(如index/index/hello)。

ThinkPHP 获取不带域名的相对网页路径,核心是提取当前请求的 URI 路径部分(不含协议、域名、端口、QUERY_STRING),也就是浏览器地址栏中「域名之后、问号之前」的那一段。
用 request()->url() 配合手动截断
这是最直接可控的方式。`request()->url()` 返回的是完整路径 + 查询参数(如 /index/index/hello.html?name=thinkphp),我们只需去掉 query 部分即可:
- 调用
request()->baseUrl()—— 它专为此设计,返回的就是不带 QUERY_STRING 的相对路径,例如:/index/index/hello.html - 该方法自动处理 PATH_INFO 和入口文件逻辑,兼容普通模式和 pathinfo 模式
- 无需正则或字符串操作,稳定且语义明确
用 request()->path() 获取路由路径(无后缀)
如果你只需要控制器/操作层级的路径标识(常用于路由匹配或权限判断),`request()->path()` 更精简:
- 它返回的是解析后的 PATH_INFO,不含文件后缀和查询参数,例如访问
/index/index/hello.html→ 得到index/index/hello - 适合做菜单高亮、模块识别、日志记录等场景
- 注意:若 URL 是
/admin/user/edit?id=1,且启用 pathinfo,则可能返回admin/user/edit;否则可能为空或依赖重写规则
避免用 $_SERVER 手动拼接
虽然 $_SERVER['REQUEST_URI'] 看似简单,但它包含 query string,需额外用 parse_url() 处理,容易出错:
立即学习“PHP免费学习笔记(深入)”;
- 比如
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)可以取到路径,但无法自动适配子目录部署、入口文件隐藏等框架特性 - 在 Nginx + pathinfo 或 Apache rewrite 场景下,
REQUEST_URI可能与 ThinkPHP 实际解析的路由不一致 - 框架原生方法已封装好兼容逻辑,没必要绕开
补充:静态资源路径别混淆
相对网页路径 ≠ 静态文件相对路径。前端引用 CSS/JS 图片时,应基于网站根目录(/)或使用 Url::build() / asset() 辅助函数生成 URL,而不是把 request()->baseUrl() 直接拼进去。



















