老少爷们儿们,我是那个在机房啃着煎饼果子、被你们半夜电话叫起来修服务器的织梦运维老周,干了十几年,啥妖蛾子没见过,今天咱不扯虚的,就唠唠后台最闹心的栏目页分页生成问题,你以为是服务器不行?八成是配置和习惯的锅,下面这六个高频雷区,你踩过哪个,直接对着抄作业。
织梦CMS栏目页分页404/空白/重复三连坑?运维老手手把手拆弹实录
栏目分页生成“404 Not Found”,后台点生成却显示成功
报错现象:
后台“生成-更新栏目HTML”提示“成功”,但前台访问 /list-1-2.html 直接404,刷新缓存也没用,单页正常,唯独分页全部死链。
原因分析:
这99%是伪静态规则和分页参数不匹配,织梦默认分页URL是 /list-{tid}-{page}.html,但你服务器(Nginx/Apache)重写规则只写了 list-{tid}.html 的匹配,没带 -{page} 段,或者你用的是“动态分页”模式,但模板里写死了静态链接。
解决步骤(Nginx为例):
- 打开你的站点配置文件(一般在
/usr/local/nginx/conf/vhost/你的域名.conf)。 - 找到
location /里的 rewrite 规则,必须确保有这一条:rewrite ^/list-([0-9]+)-([0-9]+)\.html$ /plus/list.php?tid=$1&PageNo=$2 last;
重点检查有没有
-([0-9]+)这一个捕获组,很多老配置只写了-([0-9]+)\.html只匹配首页。 - 改完执行
nginx -t检查语法,nginx -s reload,别只重启PHP,伪静态是web服务器的活儿。 - 回后台“系统-系统基本参数-核心设置”,确认“URL伪静态”是 “使用伪静态(需服务器支持)”,不是“动态”。
分页生成完是空白页,查看源代码只有半个HTML标签
报错现象:
生成第一页正常,第二页、第三页打开白屏,浏览器F12看到网络请求返回200,但HTML不完整,止步在某个{dede:list}标签附近。
原因分析:
典型的PHP内存溢出或死循环,织梦的 arclist 和 list 标签在分页时,如果文章过多,比如单栏目超过5000篇,它内部有个“翻页预查询”会一次性把当前页+下一页的ID全捞出来算页码,数据量一大直接打爆 memory_limit,模板里如果用了 {dede:sql} 且没限制条数,也会崩。
解决步骤:
- 先改PHP内存限制,找到
/data/php.ini(或你面板的PHP配置),把memory_limit = 128M改成256M或512M。 别问为啥不够,织梦的SQL查询就是这么“豪横”。 - 打开
/include/arc.listview.class.php,搜索GetTotalResult函数,找到里面一句$this->TotalResult = $this->GetTotalResult();大概在300行附近,在它的前面强制加一个分页阈值保护:if($this->PageNo > 500) { $this->PageNo = 500; }意思是最多翻500页,防止恶意生成导致内存炸弹。
- 清空
/data/cache目录下的tplcache文件夹,保留文件夹本身,然后重新生成栏目。
分页页码错乱,首页显示“2/3/4”,没有“1”
报错现象: 栏目第一页底部页码没有“1”,直接从“2”开始,或者点“上一页”跳到最后一页。
原因分析:
这是典型的“变量覆盖”问题,你的模板里,很可能在 {dede:list} 标签外面,又用了一个 {dede:global name='page'} 或者自己写了个 {dede:php} 循环,把织梦内部的 $PageNo 变量给覆盖了,比如你想显示“共X页”,但写成了 {dede:global name='totalpage'/},同时在 {dede:list} 里又用了 [field:totalpage/],这两个值是不同步的。
解决步骤:
- 打开你的栏目模板(
/templets/default/list.htm)。 - 删掉所有自定义的
{dede:global name='page'/}里面带page的标签,只保留织梦自带的{dede:pagelist listitem="pageno" listsize="5" /}。 - 如果想做“首页/上一页”样式,必须使用织梦官方函数标签,不要自己拼HTML链接,正确写法是:
<ul>{dede:pagelist listitem="index,pre,list,next,end" listsize="5"/}</ul> - 确认模板里没有别的PHP代码修改
$GLOBALS['PageNo'],搜索PageNo关键字,全部删掉。
分页生成时报错“Table 'dede_arctiny' doesn't exist”
报错现象:
后台批量生成分页时,直接弹SQL错误页面,提示找不到 dede_arctiny 表。
原因分析:
这是没安装完整或手动删过表,织梦分页生成要用 arctiny 表存摘要数据,但很多精简安装包会SQL导入不全,或者你之前用帝国/WordPress转换工具,把表结构搞坏了。
解决步骤:
- 备份数据库(用phpMyAdmin导出SQL)。
- 登录phpMyAdmin,运行以下SQL创建缺失表(注意表前缀,如果前缀是
dede_直接跑,如果是abc_就改一下):CREATE TABLE `dede_arctiny` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `typeid` smallint(5) unsigned NOT NULL DEFAULT '0', `typeid2` varchar(255) NOT NULL DEFAULT '', `channel` smallint(6) NOT NULL DEFAULT '1', `arcrank` smallint(6) NOT NULL DEFAULT '0', `title` char(60) NOT NULL DEFAULT '', `litpic` char(100) NOT NULL DEFAULT '', `pubdate` int(10) unsigned NOT NULL DEFAULT '0', `senddate` int(10) unsigned NOT NULL DEFAULT '0', `sortrank` int(10) unsigned NOT NULL DEFAULT '0', `mid` mediumint(8) unsigned NOT NULL DEFAULT '0', `money` smallint(6) NOT NULL DEFAULT '0', `filename` char(60) NOT NULL DEFAULT '', `daccess` smallint(6) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `main` (`typeid`,`arcrank`), KEY `sortrank` (`sortrank`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- 执行完后,去后台“系统-SQL命令行工具”,执行一遍
DELETE FROM dede_arctiny WHERE id NOT IN (SELECT id FROM dede_archives);清理脏数据。 - 重新生成。
分页链接是动态的(list.php?tid=1&PageNo=2),但已经开了伪静态
报错现象:
明明后台开了“伪静态”,但前台分页链接全变成 list.php?tid=1&PageNo=2,刷新也不行。
原因分析:
八成是你改了栏目属性没同步缓存,织梦的栏目网址规则写在 dede_arctype 表的 typedir 字段里,你如果之前在“栏目管理”里把“栏目录”改成带 /list/ 的静态目录,但没重新生成栏目缓存,前台就拿旧动态规则渲染了。
解决步骤:
- 后台“核心-频道模型-内容模型管理”,确认“列表模板”用的默认模板没错。
- 去“系统-SQL命令行工具”执行:
UPDATE dede_arctype SET typedir = CONCAT('/list/', id) WHERE ispart = 0;前提是你的伪静态规则是
/list/{id}.html。 - 关键一步:后台“生成-更新系统缓存”,勾选“模板缓存”和“栏目缓存”,确定。
- 修改
/data/cache/inc_catalog_base.inc文件(用FTP下载改),把里面的list.php?tid=全部替换成list-,保存上传。 - 再去生成页面,看链接是否变回
.html,还不行就重启PHP-FPM。
无限极分类下,子栏目分页生成后父栏目内容被清空
报错现象: 父栏目原本有内容,生成完某个子栏目后,父栏目首页变成空白或者只显示子栏目内容,分页也没了。
原因分析:
SQL逻辑错误,织梦的 list.php 在获取列表时,如果子栏目的 typeid 参数没带 son 标识,它会误把父栏目的 typeid 当成自己的,查询条件写成了 typeid IN (父栏目ID),结果父栏目所有子栏目内容全跑出来了,而父栏目自身的内容被过滤掉。
解决步骤:
- 打开
/plus/list.php文件,找到大约第60行,搜索$tid变量。 - 在
$tid赋值后,强行加一条判断:$tid = intval($tid); $sonIds = GetSonIds($tid); // 获取所有子栏目ID if(empty($sonIds)) { $condition = "typeid = $tid"; } else { $condition = "typeid IN (".$tid.",".$sonIds.")"; }这是最原始的修复方法,但更推荐你在后台“栏目管理-修改栏目-高级参数”里,不要勾选“列表模板继承上级”,让每个子栏目独立指定模板。
- 修改后,清空
/data/cache下的inc_catalog_base.inc缓存。 - 重新生成父栏目和所有子栏目。
老周最后唠叨一句: 织梦这东西就像老捷达,皮实但小毛病多,分页问题十有八九是缓存不干净和变量被覆盖,下次再遇到,先做两件事:清空 /data/cache 下的 tplcache 和 inc 缓存文件,再重启一下PHP,解决不了再动代码,按上面六步排查,99%的“分页起义”都能按下去,实在不行,把报错截图甩过来,我瞅一眼就知道你踩哪个坑了。



发表评论