TP5分页伪静态需显式启用isurl=>true并正确配置path、query及服务器重写规则。默认paginate()仍生成?page=2,不自动适配路由;Apache需AllowOverride FileInfo且RewriteRule加PT标志;Nginx须将路径转为s=xxx格式并重载配置。

分页链接带 .html 后缀但参数仍走 query string
这是最常见错觉:以为开了伪静态,paginate() 就自动输出 /list/2.html 这种路径。实际上,默认情况下它仍生成 ?page=2 形式,哪怕你已配置了 url_route_on => true 和 .htaccess。根本原因在于:paginate() 的 URL 构建逻辑和路由解析是两套机制——前者只看 $options['path'] 和 $options['query'],不主动读取路由规则。
要让分页链接变成伪静态格式,必须显式传入 isurl => true 并手动拼路径参数:
-
isurl => true是 TP5 分页器内置开关,启用后会把query数组里的键值逐个拼成路径段,末尾加.html -
path必须以/开头,且与服务器重写规则匹配(如 Nginx 里rewrite ^/list/(.*)\.html$ /index.php?s=list/index&page=$1 last;) -
query不能含page键——它会被自动替换为当前页码,其他参数(如搜索条件)才进路径段
示例:
$list = Db::name('article')->where('status', 1)
->paginate(10, false, [
'path' => '/list/',
'query' => ['cat' => input('cat')],
'isurl' => true,
'var_page' => 'page'
]);
此时第 2 页链接为 /list/2.html?cat=5(注意:TP5 默认仍保留 query 参数,需配合路由规则二次处理)
Apache 下 .htaccess 没生效导致 404 或跳回 index.php
即使 PHP 层生成了 /list/2.html,如果 Apache 没正确转发,结果就是 404 或直接下载 HTML 文件。关键点不在「有没有写规则」,而在「规则放哪、是否被读取、是否匹配请求路径」。
必须确认三件事:
-
.htaccess文件在public/目录下(TP5 默认入口目录),不是项目根目录;文件名必须是.htaccess,不能是htaccess或.htaccess.txt - Apache 配置中
AllowOverride至少设为FileInfo Options,设成None会完全忽略该文件 - 规则必须用
PT(PassThrough)标志,否则PATH_INFO无法传递给 PHP:RewriteRule ^list/(\d+)\.html$ index.php?s=list/index&page=$1 [QSA,PT,L]
漏掉 PT 是最隐蔽的坑:页面能打开,但 input('page') 始终为空,因为框架没收到 PATH_INFO。
分页器生成的链接末尾多出 ?page=2
这个现象说明 isurl => true 没起作用,或者 path 配置错误。TP5 分页器在 isurl 为 false 时,强制走 http_build_query() 拼 query string,不受路由影响。
检查以下几处:
- 传给
paginate()的第三个参数是数组,不是字符串;['isurl'=>true]要和其他选项同级,别嵌套错层 -
path值结尾不能有.html,否则会变成/list/.html2.html;它只是基础路径前缀 - 若用了自定义路由(如
Route::rule('list/:page','index/article/list')),分页器不会自动识别该规则,仍按原始path+query构建,除非你在路由里显式绑定分页参数
简单验证法:在控制器里 dump 出 $list->render() 生成的 HTML,看 里的地址是否含 .html。不含,说明 isurl 未生效。
Nginx 下 rewrite 规则和 TP5 的 s 参数模式不匹配
TP5 默认使用 URL_MODEL = 2(兼容模式),依赖 $_GET['s'] 解析模块/控制器/操作。Nginx 规则必须把路径转成 s=xxx 才能对上,而不是试图模拟 PATH_INFO。
典型错误配置:
rewrite ^/list/(\d+)\.html$ /index.php/list/index/page/$1 last; // ❌ TP5 不认 PATH_INFO 格式
正确写法(对应上面分页示例):
rewrite ^/list/(\d+)\.html$ /index.php?s=list/index&page=$1 last;
注意:last 不可换成 redirect 或 break;s= 后面的值必须和路由定义完全一致(大小写、斜杠数);如果项目在子目录(如 /myapp/),rewrite 路径前缀要补全:^/myapp/list/(\d+)\.html$。
最易忽略的是:Nginx 配置修改后必须执行 nginx -t && nginx -s reload,只改文件不重载等于白改。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











