问题根源分析
织梦的分页链接默认格式是动态的,
/plus/list.php?tid=1&PageNo=2

开启伪静态后,我们希望它变成类似这样的格式:
/plus/list-1-2.html
当你在服务器上配置了Rewrite规则,将 list-1-2.html 这样的请求正确地转发给 plus/list.php 时,织梦程序需要能够识别这个链接,并从中解析出 tid=1 和 PageNo=2 这两个关键参数。
问题的核心就在于:
- 服务器Rewrite规则:是否正确地将
list-{tid}-{PageNo}.html解析为plus/list.php?tid={tid}&PageNo={PageNo}? - 织梦程序:是否知道如何生成
list-{tid}-{PageNo}.html这样的链接,并且能正确解析这种格式的URL参数?
通常情况下,问题出在服务器Rewrite规则上,或者两者之间的匹配参数上。

解决方案(请按顺序尝试)
第一步:检查并修改织梦后台分页设置
这是最基础的一步,确保织梦本身开启了伪静态分页。
- 登录织梦DedeCMS后台。
- 进入 “系统” -> “系统基本参数” -> “核心设置”。
- 找到 “是否使用伪静态” 这个选项,确保它被设置为 “是”。
- 保存设置。
注意: 仅仅设置这里是不够的,它只是告诉织梦“请为我生成伪静态链接”,但具体怎么生成,还需要修改模板文件。
第二步:修改列表页模板文件,生成正确的伪静态链接
织梦默认的分页代码是动态的,你需要手动修改模板文件来让它生成静态格式的链接。
- 找到你的列表页模板文件,通常位于
/templets/你的模板名称/list_articled.htm。 - 用代码编辑器打开这个文件。
- 找到织梦的分页标签,通常是
dede:pagelist。 - 关键修改:在
dede:pagelist标签内,增加一个listitem属性,明确告诉织梦你需要显示哪些分页元素,并确保它生成的是静态链接。
修改前的代码可能类似这样:

<div class="dede_pages">
<ul class="pagelist">
{dede:pagelist listsize="4" listitem="info,index,end,pre,next,pageno"}
{/dede:pagelist}
</ul>
</div>
修改后的代码(推荐):
<div class="dede_pages">
<ul class="pagelist">
{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="4"}
{/dede:pagelist}
</ul>
</div>
listitem 参数说明:
info: 显示总页数、总条数等信息。index: 显示首页链接。pre: 显示上一页链接。next: 显示下一页链接。pageno: 显示页码。end: 显示尾页链接。
通过设置 listitem,织梦会尝试生成与后台“是否使用伪静态”设置相匹配的链接,如果后台设置为“是”,它就会生成 list-1-2.html 这样的链接。
第三步:配置服务器Rewrite规则(最关键的一步)
这是解决问题的核心,你需要根据你的服务器环境,选择对应的Rewrite规则,并确保它正确无误。
重要提示:
- Nginx:将规则放入
nginx.conf文件中的server块,或者放入网站根目录下的.conf文件中。 - Apache:将规则保存为
.htaccess文件,并上传到网站根目录。 - IIS:将规则保存为
web.config文件,并上传到网站根目录。
方案A:Apache服务器 (.htaccess)
在你的网站根目录下,确保存在 .htaccess 文件,并添加以下规则:
# 织梦DedeCMS伪静态规则
RewriteEngine On
# 如果请求的是真实存在的文件或目录,则直接访问
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 处理列表页
RewriteRule ^plus/list-([0-9]+)-([0-9]+)\.html$ /plus/list.php?tid=$1&PageNo=$2 [L]
# 处理文章页
RewriteRule ^plus/view-([0-9]+)-([0-9]+)\.html$ /plus/view.php?arcID=$1 [L]
规则解释:
RewriteEngine On:开启Rewrite引擎。RewriteCond ...:条件判断,如果不是真实文件或目录,才进行重写,避免影响真实文件访问。RewriteRule ...:核心重写规则。^plus/list-([0-9]+)-([0-9]+)\.html$:匹配list-数字-数字.html这样的URL。([0-9]+)是一个正则表达式,用于捕获tid和PageNo的值。/plus/list.php?tid=$1&PageNo=$2:将捕获到的值($1是第一个tid,$2是第二个PageNo)作为参数,重写为动态URL。[L]:Last Rule,表示匹配到这条规则后就停止,不再匹配后续规则。
方案B:Nginx服务器 (nginx.conf)
在Nginx的配置文件(通常是 nginx.conf 或站点配置文件)的 server 块中添加以下规则:
# 织梦DedeCMS伪静态规则 rewrite "^/plus/list-([0-9]+)-([0-9]+)\.html$" /plus/list.php?tid=$1&PageNo=$2 last; rewrite "^/plus/view-([0-9]+)-([0-9]+)\.html$" /plus/view.php?arcID=$1 last;
规则解释:
rewrite:Nginx的指令。"^/plus/list-([0-9]+)-([0-9]+)\.html$":匹配URL。/plus/list.php?tid=$1&PageNo=$2:重写目标。last:表示在本location中完成重写,并停止继续匹配rewrite规则。
方案C:IIS服务器 (web.config)
在网站根目录下创建 web.config 文件,并添加以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="DedeCMS List" stopProcessing="true">
<match url="^plus/list-([0-9]+)-([0-9]+)\.html$" />
<action type="Rewrite" url="plus/list.php?tid={R:1}&PageNo={R:2}" />
</rule>
<rule name="DedeCMS View" stopProcessing="true">
<match url="^plus/view-([0-9]+)-([0-9]+)\.html$" />
<action type="Rewrite" url="plus/view.php?arcID={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
第四步:检查并修改 arc.listview.class.php 文件(高级/备用方案)
如果以上方法都无效,可能是织梦程序在生成分页链接时,没有正确处理你的自定义规则,这时可以直接修改核心文件。
- 找到文件
/include/arc.listview.class.php。 - 用代码编辑器打开,搜索
GetPageListST函数。 - 在这个函数里,找到生成上一页、下一页、页码链接的代码段,修改
$this->GetCurUrl()的调用方式,确保它生成的URL符合你的伪静态规则。 - 这一步风险较高,建议修改前备份原文件,通常情况下,第三步的Rewrite规则已经足够,无需修改此文件。
总结与排查清单
当遇到织梦伪静态后不能翻页时,请按以下清单逐一排查:
- 后台设置:系统 -> 系统基本参数 -> 核心设置 -> “是否使用伪静态” = “是”。
- 模板修改:列表页模板 (
list_xxx.htm) 中的{dede:pagelist}标签,确保listitem属性设置正确。 - Rewrite规则:
- 确认服务器环境:是 Apache, Nginx 还是 IIS?
- 检查规则文件:
.htaccess(Apache),nginx.conf(Nginx),web.config(IIS) 是否存在于网站根目录? - 检查规则内容:规则是否完全复制正确?特别是正则表达式部分。
- 清除缓存:修改完任何文件后,都请清除浏览器缓存和织梦后台的缓存。
- 检查服务器日志:如果规则仍然无效,请查看服务器的错误日志(如 Nginx 的
error.log,Apache 的error_log),它会告诉你请求是如何被处理的,以及为什么失败,可能会提示404 Not Found,说明Rewrite规则没有生效,或者重写后的目标文件不存在。
按照这个流程,90%以上的织梦伪静态分页问题都可以得到解决,如果问题依旧,请提供你的服务器环境、使用的Rewrite规则以及具体的错误现象,以便进一步定位问题。
