核心是参数未完整传至PHP层,须用try_files $uri $uri/ /index.php?$query_string;透传全部GET参数,并确保PATH_INFO模式下fastcgi_param PATH_INFO $fastcgi_path_info;、fastcgi_split_path_info正则准确及cgi.fix_pathinfo=1。

ThinkPHP6.0 伪静态后参数丢失,核心不是路由写错了,而是请求转发时关键参数没完整传到 PHP 层。重点在于确保 GET 查询参数 和 PATH_INFO 路径信息 都能被正确解析和透传。
必须用 try_files 传递完整 query_string
很多配置只写 rewrite ^(.*)$ /index.php?s=$1 last;,这会丢掉 ? 后面的参数(比如 ?id=123&search=abc),导致 $_GET 为空、$request->param('id') 拿不到值。
✅ 正确做法是在 location / 块中使用:
try_files $uri $uri/ /index.php?$query_string;- 它把原始 URL 中所有查询参数原样传给 index.php,TP6/TP8 都能识别
s=和额外 GET 参数 - 比 if+rewrite 更稳定,尤其对中文路径、二级目录、子应用更友好
PATH_INFO 模式下要确保三项全到位
如果你用的是 pathinfo 形式(如 /user/profile/id/123),而报 “URL pathinfo not supported”,说明 $_SERVER['PATH_INFO'] 没传进来或内容异常。
必须同时满足:
- Nginx 的
location ~ \.php$块中包含:fastcgi_param PATH_INFO $fastcgi_path_info; - PHP-FPM 的
fastcgi_split_path_info正则已启用,且匹配准确(推荐^(.+\.php)(/.+)$) - php.ini 中
cgi.fix_pathinfo = 1(Docker 或加固环境常被设为 0,需手动检查)
分页传参丢失?别硬拼 URL,用 withQuery()
调用 paginate() 时,默认不继承当前请求参数。直接写 &page=2 会丢掉 search=abc 或 filter[status]=1 这类参数。
✅ 正确方式:
$list = Db::name('user')->paginate(15);$list->withQuery($_GET); // 自动保留中括号、点号、多维结构- 必须在
assign到模板前调用,否则模板里 render() 不生效 - 不要混用
appends(),它会覆盖withQuery()的结果
确认入口路径和运行目录是否对齐
TP6 入口强制在 public/index.php,但很多 Nginx 配置仍指向 /index.php,造成重写失败或 404。
- 宝塔 → 网站 → 设置 → 网站目录 → 运行目录:必须选
/public(不是留空,也不是根目录) - 伪静态规则中的目标路径必须是
/public/index.php或站点根就是public/目录 - 如果项目部署在二级目录(如
/myapp/),try_files第三项要改为/myapp/index.php?$query_string
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











