分页链接默认用当前域名,需显式指定path参数或重写getUrl()方法才能修改;ThinkPHP中paginate()支持以http(s)://开头的绝对路径覆盖,Page类可直接赋值url属性,全局替换需继承Paginator重写getUrl()并注册。

分页链接默认用当前请求域名,要改必须显式指定 path 或重写 url 生成逻辑,否则所有翻页都会跳回原站。
paginate() 中用 path 参数强制指定完整 URL 域名
这是最直接、副作用最小的方式。ThinkPHP 的 paginate() 支持 path 配置项,传入带协议和域名的绝对路径即可覆盖默认行为。
-
path值必须以http://或https://开头,例如'https://api.example.com/page',不能只写域名或相对路径 - 该配置仅影响分页链接的 base 部分,页码参数(如
p=2)仍会自动拼在后面,无需手动处理 - 若同时用了
query或appends(),它们的参数会正常附加到path后面,顺序无冲突 - 示例:
UserModel::where('status', 1)->paginate(10, false, ['path' => 'https://m.example.com/users']);
Page 类手动设置 url 属性(TP5/TP6 兼容写法)
如果你还在用老版 Page 类(非 paginate()),它的 $url 属性可直接赋值为完整 URL,但要注意时机 —— 必须在调用 show() 前设置。
-
$page->url = 'https://admin.example.com/user/list';是有效的,show()内部会基于这个值生成所有 a 标签 href - 不要只改
$page->parameter或$page->setConfig(),它们不控制域名,只改文案或参数格式 - 若项目启用了 URL 重写(
URL_MODEL=2),$url仍需是完整地址,框架不会自动补协议和域名 - 常见错误:赋值时漏了
https://,导致浏览器按相对路径解析成https://current-domain.com/https://xxx
全局替换分页链接 host(需重写 Paginator::getUrl())
当全站所有分页都要走另一个域名(比如 API 域名、CDN 域名),又不想每个 paginate() 都加 path,就得动底层。TP6 的 think\Paginator 类中,getUrl() 方法负责生成单个页码链接,可继承并重写。
- 新建类继承
think\Paginator,重写getUrl($page),把原返回值的 host 部分替换成目标域名 - 通过
think\facade\Paginator::usePaginator('custom', CustomPaginator::class)注册新分页器 - 再在
paginate()第二个参数传'custom'指定使用它 - 注意:此方式绕过所有内置配置(包括
path),容易和其它配置冲突,调试时建议先 dump 出原始getUrl()返回值对比
真正容易被忽略的是:无论用哪种方式,只要涉及跨域(比如前端静态页跑在 https://h5.example.com,后端 API 在 https://api.example.com),分页链接里的域名就必须和实际接口地址一致,否则点击后请求会发错地方 —— 这不是样式问题,是请求路由根本失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











