在thinkphp中间件中获取当前访问路径:$request->url()获取重写后的路径+查询参数,$request->path()获取纯路径,$request->fullurl()获取完整url;需路由完成后才能通过$request->routeinfo()获取真实路由路径。

在 ThinkPHP 中间件里获取「当前访问路径」,关键在于区分你想要的是原始 URL 路径、重写后路由路径,还是带查询参数的完整路径——不同场景对应不同方法,且必须注意执行时机。
用 $request->url() 获取重写后的路径(最常用)
这是大多数中间件场景下最稳妥的选择。它返回的是经过 URL 重写(如 Apache mod_rewrite 或 Nginx rewrite)后、框架解析出的路径 + 查询字符串,例如 /user/profile?id=123。
- 它不包含协议和域名,只含 path 和 query 部分
- 该值在路由匹配前就已可用,所有中间件(包括前置中间件)都能安全调用
- 若需拼成完整 URL,可组合:
$request->scheme() . '://' . $request->host() . $request->url()
用 $request->path() 获取纯路径(不含查询参数)
当你只需要路径部分(如 /user/profile),不关心 ?id=123 这类参数时,用这个更干净。
- 返回值是字符串,不含问号及之后内容
- 同样不受路由绑定影响,中间件任意位置都可用
- 注意:它返回的是重写后的路径,不是原始 $_SERVER['REQUEST_URI']
用 $request->fullUrl() 获取带协议和域名的完整地址
适合做日志记录、跳转构造或第三方回调拼接。它自动拼接 scheme + host + path + query,例如 https://site.test/user/profile?id=123。
- 内部调用的是 url() + host() + scheme(),比手动拼接更可靠
- 不包含锚点(#xxx),也不受 CLI 环境支持,使用前建议判断:
if (!$request->isCli()) { ... } - 避免使用已废弃的
$request->url(true),TP6.0+ 会报错
想拿「实际匹配到的路由路径」?得等路由完成
如果你要的是最终路由规则中定义的路径(比如 route_domain 绑定后的真实入口路径,或带子域名前缀的路径),那不能依赖 request 方法——因为这些信息只有路由调度完成后才注入。
- 此时应检查
$request->routeInfo()['url']或$request->routeInfo()['rule'] - 但前提是你的中间件注册在 think\middleware\ParseUrl 之后(如放在 app/middleware.php 靠后位置)
- 否则
routeInfo()为空或不完整,取不到真实路由路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











