应配置var_page => 'p'使框架识别p=2而非page=2:tp5.1+需在paginate()第三参数传['var_page' => 'p', 'query' => request()->param()];tp6则须调用paginator::currentpageresolver()配合input('p/d', 1)。

ThinkPHP 5.1+ 中如何把 page 参数改成 p
默认分页链接是 ?page=2,但你想变成 ?p=2,核心不是改 URL 显示,而是让框架识别并使用新参数名解析当前页码。直接改模板里的链接没用,Page 类内部仍会读 page。
关键在分页类初始化时传入 var_page 配置:
-
var_page控制「接收页码的 GET 参数名」,必须设; -
query可选,用于透传其他参数(比如搜索条件),避免翻页后丢失; - 模板中调用
$list->render()会自动按新参数名生成链接。
示例(控制器中):
$list = Db::name('article')
->where($where)
->paginate(10, false, [
'var_page' => 'p',
'query' => request()->param()
]);
$this->assign('list', $list);
ThinkPHP 6.x 的写法略有不同
TP6 把分页配置从数组改为 Paginator 对象方式,但本质一样:var_page 仍是开关。区别在于不能直接在 paginate() 第三个参数里传数组,得提前设置全局或局部 Paginator 配置。
推荐在控制器中局部覆盖(不影响其他分页):
use think\Paginator;
Paginator::currentPageResolver(function () {
return input('p/d', 1);
});
$list = Db::name('article')->paginate(10);
注意:input('p/d', 1) 表示从 GET 中取 p,缺失则默认为 1;/d 是类型修饰符,确保返回整数。
URL 重写后 page 还会被误读吗?
会。如果旧链接 ?page=3 和新链接 ?p=3 同时存在,TP 默认优先读 page(除非你显式禁用)。所以必须确保:
- 所有分页入口统一用新参数(模板、JS 跳转、手动拼接都要改);
- 不要在
paginate()外再调用input('page')或类似逻辑; - 若用了路由规则重写(如
news/p/<id></id>),需确认没有和page冲突的变量名捕获。
自定义分页模板里怎么适配?
如果你重写了 think\paginator\driver\Bootstrap 等模板,里面硬编码了 page(比如 &page=),那必须同步替换为 p。但更稳妥的做法是:完全不用手拼,直接用 $this->render() 返回的 HTML —— 它已根据 var_page 自动处理好了。
真正容易被忽略的是:中间件、权限检查、日志记录这些地方如果手动解析了 page,也得一并改掉。否则看似链接对了,后台逻辑却还在按旧参数跑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











