这是一个非常常见的需求,伪静态的好处主要有:

- SEO友好:URL中包含关键词,对搜索引擎更友好。
- 用户体验好:URL看起来更简洁、美观,符合用户习惯。
- 隐藏技术细节:对外不暴露
.php等后缀,增加安全性。
实现 DedeCMS 列表分页伪静态主要分为两大步:
- 服务器配置:让服务器能够将伪静态URL正确地重写为真实的PHP文件。
- DedeCMS 程序配置:修改 DedeCMS 的相关文件,使其生成伪静态的链接。
第一步:服务器配置
这是最关键的一步,如果服务器配置不正确,伪静态链接会返回 404 错误。
Apache 服务器
如果你的服务器是 Apache,并且开启了 mod_rewrite 模块(虚拟主机一般都默认开启),操作如下:
-
在网站根目录创建
.htaccess文件。
(图片来源网络,侵删)- 如果文件已存在,直接编辑它。
- 如果不存在,新建一个文件,命名为
.htaccess(注意前面的点)。
-
将以下代码写入
.htaccess文件中:# 将 RewriteEngine 开启 RewriteEngine On # DedeCMS 列表分页伪静态规则 RewriteRule ^list-([0-9]+)-([0-9]+)\.html$ /plus/list.php?tid=$1&PageNo=$2 [L]
-
代码解释:
RewriteEngine On:开启重写引擎。RewriteRule:定义重写规则。^list-([0-9]+)-([0-9]+)\.html$:这是匹配的URL模式。^:字符串开始。list-:固定的 "list-" 字符串。([0-9]+):一个或多个数字,用括号捕获,第一个代表栏目ID(tid)。- 一个连字符。
([0-9]+):又一个或多个数字,用括号捕获,第二个代表页码(PageNo)。\.html:匹配 ".html" 后缀。- 字符串结束。
/plus/list.php?tid=$1&PageNo=$2:这是重写后的真实URL。$1和$2分别对应前面括号中捕获的第一个和第二个数字。[L]:表示如果这条规则匹配成功,就停止处理后续的 RewriteRule。
-
重启 Apache 服务,让配置生效。
Nginx 服务器
如果你的服务器是 Nginx,操作如下:

-
找到 Nginx 的配置文件,通常是
nginx.conf或在vhost目录下的你的网站配置文件。 -
在
server块中添加以下 rewrite 规则:# DedeCMS 列表分页伪静态规则 rewrite "^/list-([0-9]+)-([0-9]+)\.html$" /plus/list.php?tid=$1&PageNo=$2 last;
-
代码解释:
rewrite:Nginx 的重写指令。"^/list-([0-9]+)-([0-9]+)\.html$":匹配的URL模式,和 Apache 类似。/plus/list.php?tid=$1&PageNo=$2:重写后的真实URL。last:表示停止执行当前的rewrite检查,然后搜索匹配location规则。
-
重启 Nginx 服务,让配置生效。
第二步:DedeCMS 程序配置
服务器配置好后,需要修改 DedeCMS 的程序文件,让它生成我们想要的伪静态链接。
修改 arc.listview.class.php 文件
这个文件是 DedeCMS 处理列表页的核心文件,我们需要修改它来分页链接的生成方式。
-
找到文件位置:
include/arc.listview.class.php -
编辑文件:使用代码编辑器(如 VS Code, Sublime Text, Notepad++)打开该文件。
-
找到并修改分页函数: 搜索
GetPageListST函数,找到生成页码链接的代码段,通常在文件末尾附近。找到类似这样的代码(可能因版本不同略有差异):
// 修改前 $plist .= $jstempstr; $plist .= $listdd; $plist .= "<li><span class=\"pageinfo\">共 <strong>$totalpage</strong> 页</span></li>\r\n"; $plist .= "</ul>\r\n"; return $plist;
将生成链接的代码部分进行修改,你需要找到
$jstempstr的赋值部分,通常是一个str_replace或者preg_replace。以较新版本的 DedeCMS 5.7 为例,找到类似下面这样的代码块:
// ... 在 GetPageListST 函数内部 ... // 获取链接的函数 $geturl = "GetListUrl($j)"; // 修改前,通常是动态链接 // $plist .= "<li><a href='".$geturl."'>".$j."</a></li>\r\n"; // ... // $plist .= "<li><a href='".$geturl."'>下一页</a></li>\r\n"; // ... // $plist .= "<li><a href='".$geturl."'>末页</a></li>\r\n";
将其修改为伪静态链接格式,你需要修改所有生成
href属性的地方。修改后的代码示例:
// ... 在 GetPageListST 函数内部 ... // 获取栏目ID $tid = $this->TypeID; // 修改分页链接的生成逻辑 // 首页 $indexpage = "<li><a href='/list-".$tid."-1.html'>首页</a></li>\r\n"; // 上一页 $prepage = "<li><a href='".$this->GetPrePage()."' class='a1'>上一页</a></li>\r\n"; // 注意:上一页和下一页通常有自己的函数,可以直接调用,为了统一格式,可以也手动构造 // 手动构造上一页 if($this->PageNo != 1) { $prepage = "<li><a href='/list-".$tid."-".($this->PageNo-1).".html'>上一页</a></li>\r\n"; } else { $prepage = "<li><span class='a1'>上一页</span></li>\r\n"; } // 下一页 // 手动构造下一页 if($this->PageNo != $totalpage) { $nextpage = "<li><a href='/list-".$tid."-".($this->PageNo+1).".html'>下一页</a></li>\r\n"; } else { $nextpage = "<li><span class='a1'>下一页</span></li>\r\n"; } // 末页 $endpage = "<li><a href='/list-".$tid."-".$totalpage.".html'>末页</a></li>\r\n"; // 中间页码 $listdd = ''; for($j=1;$j<=$totalpage;$j++) { if($j==$this->PageNo) { $listdd .= "<li><span class=\"thisclass\">$j</span></li>\r\n"; } else { $listdd .= "<li><a href='/list-".$tid."-".$j.".html'>".$j."</a></li>\r\n"; } } // 拼接最终的分页HTML $plist = "<div class=\"dede_pages\">\r\n"; $plist .= "<ul>\r\n"; $plist .= $indexpage; $plist .= $prepage; $plist .= $listdd; $plist .= $nextpage; $plist .= $endpage; $plist .= "<li><span class=\"pageinfo\">共 <strong>$totalpage</strong> 页</span></li>\r\n"; $plist .= "</ul>\r\n"; $plist .= "</div>\r\n"; return $plist;说明:
- 我们直接硬编码了链接的格式为
/list-{栏目ID}-{页码}.html。 $this->TypeID就是当前列表页的栏目ID。$this->PageNo是当前页码。$totalpage是总页数。- 这种方法最直接,但缺点是如果未来想修改URL格式,需要再次修改这个文件。
- 我们直接硬编码了链接的格式为
-
保存文件。
第三步:后台设置(可选,但推荐)
在 DedeCMS 后台,你也可以开启一个开关,让系统在生成HTML时也使用伪静态的链接。
- 登录 DedeCMS 后台。
- 进入 “系统” -> “系统基本参数” -> “核心设置”。
- 找到 “列表命名规则” 这一项。
- 将其修改为
list_{tid}_{page}.html或者你想要的任何格式(list-{tid}-{page}.html)。 - 保存。
注意:这个设置主要影响你使用“生成HTML”功能时,生成的静态列表页文件名,对于动态分页,你需要按照第二步的代码修改来实现。
总结与验证
完成以上步骤后:
- 清空浏览器缓存。
- 访问一个列表页,
http://你的域名.com/plus/list.php?tid=1。 - 查看页面源代码,检查分页部分的链接是否已经变成了
http://你的域名.com/list-1-2.html这样的格式。 - 点击分页链接,测试是否能正常跳转并显示内容。
如果出现 404 错误,请首先检查 第一步的 .htaccess 或 Nginx 配置 是否正确,并确保服务器已重启。
常见问题
-
Q: 为什么我改了代码,链接没变?
- A: 1. 请确认修改的是正确的文件
include/arc.listview.class.php,2. 检查缓存,清除浏览器缓存和DedeCMS后台的“更新缓存”,3. 检查服务器配置是否正确。
- A: 1. 请确认修改的是正确的文件
-
Q: 为什么首页或栏目首页的链接也变了,但我想让它保持动态?
A: 上述修改是针对所有列表页的,如果你只想修改分页,不想修改首页/栏目首页的链接,需要更精确地修改代码逻辑,确保只有页码大于1时才生成伪静态链接,但通常保持统一格式是更好的做法。
-
Q: 我的URL格式想用
category/1/2.html怎么办?- A: 只需要修改
.htaccess和arc.listview.class.php中的URL模式即可。.htaccess规则改为RewriteRule ^category/([0-9]+)/([0-9]+)\.html$ ...,PHP代码中改为href='/category/".$tid."/".$j.".html'。
- A: 只需要修改
希望这份详细的教程能帮助你成功实现 DedeCMS 列表分页的伪静态!
