thinkphp分页链接仍为?page=2,是因为分页器未启用伪静态模式;需在paginate()中显式传入path、isurl(tp5)或type(tp6)、url_html_suffix等配置,并确保服务器重写规则、路由设置与框架配置三者一致,否则无法生成/list/2.html类url。

ThinkPHP分页链接为什么还是带?page=2
默认分页生成的URL是 ?page=2 这类GET参数形式,不是你想要的 /list/page/2.html 或 /list/2.html。根本原因是:分页类没被告知要走伪静态路径,它仍按传统查询字符串拼接。
ThinkPHP 5.x/6.x 的分页器(Paginator)本身不自动适配伪静态,必须显式传入带路径规则的 path 和开关标识,否则它永远只输出 ?page=N。
-
path参数必须是完整可访问的路由前缀,比如/news/list或/public/index.php/news/list(取决于部署方式) - 必须传
'isurl' => true(TP5)或'type' => 'html'(TP6.3+),否则伪静态逻辑不会触发 - TP6 中若使用了多应用模式,
path需包含应用名,如/index/news/list,漏掉会 404
TP5 分页伪静态需手动改 Paginator.php?
不用改框架源码。官方已预留扩展点,直接在调用 paginate() 时传参即可生效。改源码不仅危险,还会在升级后丢失。
正确做法是在控制器中这样写:
$list = Db::name('article')->paginate(10, false, [
'path' => '/article/list', // 注意:以 / 开头,且必须和实际路由匹配
'query' => request()->param(), // 透传当前 URL 的其他参数(如搜索关键词)
'isurl' => true, // TP5 关键开关,启用 path 模式
'var_page' => 'page'
]);
- 如果部署在子目录(如
http://site.com/myapp/),path必须写成/myapp/article/list -
query不传会导致分页链接丢失筛选条件,例如搜索keyword=php后翻页就没了 - 模板中直接用
{$list->render()}即可,无需额外处理
TP6 分页伪静态怎么配才不 404
TP6 默认分页走的是 ?page=2,要变成 /list/2.html,光靠 paginate() 参数不够,必须三者对齐:
- 服务器重写规则必须把
/list/2.html转给index.php?s=/list/2.html(Nginx 用try_files $uri $uri/ /index.php?s=$uri&$args) - 框架配置里
'pathinfo_depr' => '/'和'url_html_suffix' => '.html'必须开启且一致 - 分页调用时指定
'type' => 'html'并给出绝对路径:['path' => '/list', 'type' => 'html']
常见错误是 path 写成 'list'(缺开头 /)或 '/list/'(结尾多斜杠),都会导致路由解析失败返回 404。
分页链接末尾的 .html 是怎么加上的
不是自动拼的,是框架根据 url_html_suffix 配置 + 分页器的 type 或 isurl 开关共同决定的。它只控制“是否启用后缀”,不控制“是否强制添加”。
- 设
'url_html_suffix' => '.html':访问/list/2会 404;只有/list/2.html才能命中 - 设
'url_html_suffix' => ''(空字符串):/list/2和/list/2.html都能访问,但分页器默认只生成前者 - 想让分页器固定输出
.html,TP5 用'isurl'=>true+ 手动拼后缀;TP6 用'type'=>'html'即可自动补
最易忽略的一点:url_html_suffix 改了之后,务必清空 runtime/cache/ 目录,否则旧缓存会让新配置不生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











