最稳妥获取完整请求url(含参数)用$request->fullurl(),它自动拼接scheme+host+path+query;$request->url()仅返回路径+查询字符串,需手动拼接协议和域名;$request->url(true)在tp6.0+已废弃。

怎么拿到完整请求URL(含参数)
直接用 $request->url() 最稳妥,它返回的是去掉域名的路径+查询字符串,比如 /user/profile?id=123。如果真要带协议和域名,得拼: $request->scheme() . '://' . $request->host() . $request->url()。
别用 $request->url(true) —— 这个在 ThinkPHP 6.0+ 已废弃,调用会报 Method url does not exist 错误。
-
$request->fullUrl()是更安全的替代方案,自动拼好 scheme+host+path+query,但注意它不包含锚点(#xxx) - 如果启用了 URL 重写(如 Apache 的 mod_rewrite),
$request->url()返回的是重写后的路径,不是原始REQUEST_URI - 在 CLI 环境下调用这些方法会抛出异常,得先判断:
if ($request->isSwoole() || $request->isCli()) { ... }
获取当前域名、端口、子目录前缀
ThinkPHP 对 HTTP_HOST 和 SCRIPT_NAME 处理比较细,容易漏掉子目录。比如部署在 https://example.com/admin/,$request->host() 只返回 example.com,而子目录 /admin/ 实际藏在 $request->baseFile() 的路径里。
-
$request->host()→ 域名(不含端口) -
$request->port()→ 端口号,HTTP 默认是空,HTTPS 默认是 443(但常被隐藏) -
$request->root()→ 返回带协议和域名的根地址,例如https://example.com/admin,这个值依赖于APP_URL配置或自动推导,线上环境建议显式配置 - 子目录前缀(如 /admin)不能只靠
$_SERVER['SCRIPT_NAME'],要用$request->baseFile()取到入口文件路径,再截取
为什么 $request->get() 有时拿不到 GET 参数
常见原因是路由变量和查询参数同名,ThinkPHP 默认优先从路由匹配中取值,覆盖了 $_GET。比如访问 /user/123?name=test,且路由规则是 'user/:id' => 'index/user',那么 $request->get('id') 返回 123,但 $request->get('name') 可能为空——除非你关掉「路由变量自动注入」。
- 检查是否开启了
url_param_type = 1(混合模式),建议设为 0(仅路由)或 2(仅参数),避免歧义 - 想强制读原始 GET,用
$request->param('name', '', 'string')并传第三个参数指定来源:$request->param('name', '', 'get') -
$request->get()不解析 JSON 请求体,POST 提交 JSON 时,$request->get()依然只看 URL 查询串,别指望它读 body
Request 对象在中间件和控制器里行为不一致?
是的,关键在实例化时机和绑定方式。$request 在中间件里是原始请求快照,进控制器前可能被路由调度器修改过(比如注入路由变量、重写 pathinfo)。所以中间件里 $request->path() 是原始路径,控制器里可能是路由映射后的逻辑路径。
- 中间件中尽量用
$request->server('REQUEST_URI')或$request->url()获取原始请求标识 - 控制器中优先用
$request->action()、$request->controller(),它们来自路由解析结果,比手动 parse path 更可靠 - 不要在中间件里缓存
$request->param()结果并传给后续逻辑,因为控制器层 param 行为可能被钩子修改(如全局过滤、验证器前置)
最麻烦的是多级反向代理场景,X-Forwarded-For 和 X-Real-IP 被层层覆盖,$request->ip() 可能返回代理 IP。这时候得自己读头、校验可信代理列表,框架默认不帮你做这事。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










