PHP翻页函数仅生成URL字符串,SEO效果取决于服务器映射(如Nginx/Apache重写)与PHP统一生成规则;须封装buildPageUrl()函数确保路径一致,配合^~前缀匹配、!-f/!-d判断及QSA保留参数等配置。

PHP翻页函数本身不生成伪静态链接,它只负责拼出 URL 字符串;真正决定链接是否“符合SEO规范”的,是服务器如何把 /news/2/ 这类路径映射回 $_GET['page']=2,以及 PHP 是否用一致、无重复、可预测的规则生成所有分页地址。
分页链接必须由统一函数生成,不能手写或硬编码
手写 <a href="/news/2/"> 看似简单,但一旦路径规则变更(比如从 /news/2/ 改成 /news/page-2),所有模板、JS、缓存都要改。容易漏改,导致 404 或跳转错乱。
应该封装一个集中控制的函数:
function buildPageUrl($page, $baseUrl = '/news/') {
if ($page == 1) {
return rtrim($baseUrl, '/');
}
return rtrim($baseUrl, '/') . '/' . (int)$page . '/';
}
要点:
立即学习“PHP免费学习笔记(深入)”;
-
$baseUrl必须带末尾斜杠(如/news/),否则rtrim后拼接会出错 - 第 1 页返回根路径(
/news/),不是/news/1/,避免内容重复 - 强制
(int)$page防止注入或非法值传入 URL - 所有分页位置(列表页、面包屑、JSON API)都调这个函数,保证一致性
Nginx location 块必须精准匹配,否则 404 或循环重定向
常见错误是写成 location /news { ... },这会匹配 /news/、/news/2/、/news-api/ 全部路径,导致 API 被误转发。
正确写法(Nginx):
location ^~ /news/ {
rewrite ^/news/(\d+)/?$ /news.php?page=$1 last;
rewrite ^/news/?$ /news.php?page=1 last;
}
关键点:
-
^~表示前缀匹配且优先级高于正则,防止被其他location ~ \.php$规则干扰 -
?$让末尾斜杠可选,兼容/news/2和/news/2/ -
last是内部重写,不暴露重定向,浏览器地址栏不变 - 必须显式处理
/news/(即第 1 页),否则访问该路径会 404
Apache 的 .htaccess 规则要避开真实文件和目录
如果没加判断,/news/2/ 请求可能被当成真实子目录,直接 403 或 404,根本进不了重写流程。
标准写法(Apache):
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^news/(\d+)/?$ news.php?page=$1 [L,QSA]
RewriteRule ^news/?$ news.php?page=1 [L,QSA]
注意:
-
RewriteBase /必须存在,否则相对路径解析错误(尤其在子目录部署时) -
!-f和!-d是安全底线:只有当请求路径不是真实文件或目录时才重写 -
[QSA]保留原始查询参数(比如带跟踪参数?utm_source=xxx) - 两条规则顺序不能颠倒,否则
/news/会被第一条正则捕获为 page=0
PHP 中不要依赖 PATH_INFO 解析分页号
有些老方案用 $_SERVER['PATH_INFO'] 手动截取路径,比如 /news.php/2 → 取出 /2。这种写法脆弱且不可靠:
- PHP-FPM 下
PATH_INFO默认关闭或被 CGI 模式干扰 - 无法兼容 Nginx(需额外配置
fastcgi_split_path_info) - URL 不够干净(
/news.php/2比/news/2/多一个.php)
正确做法就是让 Web 服务器完成映射,PHP 安心读 $_GET['page'],不碰原始 URI。
真正难的是路径设计的一致性:第 1 页要不要斜杠、末尾斜杠是否强制、分页参数名是否统一(page 还是 p)、有没有 canonical 标签兜底——这些细节比函数怎么写更容易被忽略,也更影响 SEO 效果。



















