分页链接丢失search=abc等参数,因paginate()默认不继承$_get;应使用query配置传入$this->request->param(),它安全合并路由变量与查询参数。

分页链接里 search=abc 丢了?用 query 配置而不是硬拼 URL
直接写 ?page=2 肯定丢参数,ThinkPHP 的 paginate() 默认不继承 $_GET。你得显式告诉它哪些参数要带上。
TP6+ 正确写法是把当前请求参数传进 query 配置项:
$list = Db::name('user')->where($map)->paginate([
'list_rows' => 15,
'query' => $this->request->param(),
]);
注意两点:
-
$this->request->param()比$_GET更安全,它已合并了路由变量和查询参数 - 不要用
request()->get(),它只取 GET 部分,漏掉路由段里的值 - 如果用了伪静态(如
/user/page/2),param()仍能拿到完整参数,$_GET可能为空
filter[status]=1 这种数组参数 append 不上去?改用 withQuery()
appends() 会把 filter[status] 当作字符串键处理,生成的链接变成 &filter=[status]=1,后端根本收不到嵌套结构。
TP6.0.12+ 开始,withQuery() 是专为这种场景设计的:
$list = Db::name('user')->paginate(15);
$list->withQuery($_GET); // 自动保留中括号、点号、多维结构
关键点:
- 必须在
assign到模板前调用,否则render()不生效 - 它自动跳过
page参数,不用手动array_diff_key() - 不能和
appends()混用,否则后者会覆盖前者 - 低版本 TP5 或 TP6.0.11- 请用辅助函数 flatten_params 处理后再传给
appends()
分页跳转后 Header 或 Cookie 参数收不到?别依赖 param()
前端在请求头里带了 Authorization: Bearer xxx,或 Cookie 里存了 token=yyy,但翻页链接里不会、也不该暴露这些敏感字段。
真正的问题是:后端分页逻辑不该靠这些参数做数据筛选。如果你的查询条件依赖 Authorization 或某个 cookie 值,说明业务耦合错了——分页是数据呈现层行为,权限和身份应由中间件提前校验并注入查询上下文,而不是每次翻页都重读 Header。
正确做法:
- 权限类参数(如
token、X-User-ID)走中间件解析,存到Session或Request属性里 - 业务类参数(如
region_id、tenant_code)才该透传到分页链接 - 绝对不要在分页 URL 里拼
Authorization,这是安全红线
自定义分页路径时参数被截断?检查 Nginx/Apache 重写规则
比如配置了 rewrite ^/list/(\d+)$ /list.html?page=$1 last;,但没透传原始 query string,结果 /list/2?search=php 变成 /list.html?page=2,search 就丢了。
Nginx 必须加 $args:
rewrite ^/list/(\d+)$ /list.html?page=$1?$args last;
Apache 则需开启 QSA 标志:
RewriteRule ^list/(\d+)$ list.html?page=$1 [QSA,L]
更稳妥的方式是:别依赖重写规则传参,统一用 parse_url($_SERVER['REQUEST_URI']) 在入口解析所有参数,再 merge 进 $_GET,避免规则漏配导致参数静默丢失。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











