核心原因分析
重复,本质上是因为多个不同的URL指向了完全相同或高度相似的内容,搜索引擎在抓取时,会认为这些是重复页面,从而可能进行“去重”处理,导致权重分散,甚至影响网站的整体收录和排名。
常见原因及解决方案
请按照以下顺序逐一排查,通常能解决90%以上的重复问题。
原因1:分页造成的重复(最常见)
这是最典型的情况,list.php?tid=1 和 list.php?tid=1&PageNo=2 被认为是两个页面,但它们共享了大部分内容。
解决方案:设置 canonical 标签
canonical 标签是告诉搜索引擎“哪个页面是主要的、规范的版本”的最佳方式,在所有分页页面中,都指向第一页。
-
找到列表页模板文件: 通常位于
/templets/default/list_article.htm或你自定义的模板目录下。 -
在
<head>标签内添加 canonical 标签: 在<head>和</head>之间,加入以下代码,DedeCMS 有专门的标签来获取当前栏目链接。<head>{dede:field.title/}_{dede:global.cfg_webname/}</title> <meta name="keywords" content="{dede:field.keywords/}" /> <meta name="description" content="{dede:field.description function='html2text(@me)'/}" /> <!-- 在这里添加 canonical 标签 --> <link rel="canonical" href="{dede:global.cfg_basehost/}{dede:field name='typeurl'/}" /> <!-- 其他 head 内容... --> </head>代码解释:
{dede:global.cfg_basehost/}:获取你的网站域名,如https://www.yoursite.com。{dede:field name='typeurl'/}:获取当前栏目的首页链接,即list.php?tid=1这种形式。- 这样设置后,
list.php?tid=1&PageNo=2、list.php?tid=1&PageNo=3等所有分页页面的 canonical 指向都会是https://www.yoursite.com/list.php?tid=1,完美解决了分页重复问题。
原因2:栏目列表页与文章内容页重复
如果你的文章内容页的摘要和列表页的摘要一模一样,或者列表页调用了文章的全文,就会导致列表页和文章页内容高度重复。
解决方案:优化列表页的调用标签
确保列表页调用的是文章的摘要,而不是全文。
-
找到列表页模板文件:
/templets/default/list_article.htm。 -
检查文章调用循环标签:通常是这样的结构:
{dede:list pagesize='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span> <div>[field:description/]...</div> <!-- 这里是关键 --> </li> {/dede:list} -
确保使用
description字段:[field:description/]调用的是文章的摘要,这是正确的做法。- 错误做法:如果你使用了
[field:body/]或[field:text/],那就会调用文章全文,造成严重重复,请务必删除或替换掉它们。 - 如果摘要为空:可以在后台“批量维护” -> “文档HTML更新”中,选择“更新摘要”,让系统自动为没有摘要的文章生成。
原因3:不同栏目交叉调用内容
你在首页调用“新闻”栏目的文章,又在“产品”栏目页也调用了“新闻”栏目的文章,如果这两个栏目页的模板不同,就会导致内容重复。
解决方案:规范栏目调用,使用“arclist”标签时指定栏目ID
在调用外部栏目的内容时,务必指明 typeid。
- 错误示例:在首页调用新闻,但没有指定栏目ID,或者调用了多个栏目。
{dede:arclist row="10"} <!-- 没有指定typeid,可能调用全站最新 --> - 正确示例:明确指定只调用“新闻”栏目(假设ID为1)的内容。
{dede:arclist typeid='1' row="10"} <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist}
原因4:URL形式多样化导致重复
DedeCMS 默认可以生成多种URL,
- 动态:
list.php?tid=1 - 伪静态:
list/1.html - 目录形式:
category/1/
如果这些URL同时存在,就会被搜索引擎视为重复页面。
解决方案:统一URL形式并设置301重定向
- 统一URL:在后台“系统” -> “系统基本参数” -> “核心设置”中,选择一种你喜欢的URL形式(推荐“栏目目录”),然后更新所有文档和HTML。
- 设置301重定向:
- 伪静态方案:确保你的服务器(如Apache)
.htaccess文件配置正确,将动态URL和目录形式的URL都重定向到你选择的最终URL形式。 - Nginx服务器:在
nginx.conf或站点配置文件中添加重定向规则。 - DedeCMS自带功能:在“系统” -> “SQL命令行工具”中,可以执行一些SQL来统一URL,但操作有风险,建议先备份数据库。
- 伪静态方案:确保你的服务器(如Apache)
深层原因及解决方案
如果以上方法都无法解决问题,可能需要检查更深层次的原因。
原因5:arclist 标签的缓存问题
arclist 标签有缓存机制,如果缓存未更新,可能导致显示的内容与数据库不一致,从而产生一些“幽灵”重复内容。
解决方案:关闭或清理 arclist 缓存
- 临时关闭:在
arclist标签中加上cache='no'属性,但这会影响性能,仅作测试用。{dede:arclist typeid='1' cache='no'} - 清理缓存:在后台“系统” -> “缓存管理”中,清空所有缓存,特别是“自定义标签缓存”。
原因6:自定义模型或特殊字段
如果你使用了自定义模型,并且列表页调用了特殊字段(如下载地址、图集内容等),这些字段的内容也可能导致重复。
解决方案:检查并优化自定义模型模板
检查你的自定义模型列表页模板,确保只调用必要的、能区分不同文章的字段,避免调用重复性高的数据。
原因7:数据库问题(罕见)
极少数情况下,数据库中可能存在重复的文档记录(dede_archives 表)。
解决方案:检查数据库
这是一个高风险操作,操作前务必备份数据库!
- 登录phpMyAdmin。
- 执行以下SQL查询来检查是否有完全重复的标题和内容(
title和body字段):SELECT title, body, COUNT(*) as count FROM dede_archives GROUP BY title, body HAVING count > 1;
- 如果查询结果有数据,说明存在重复记录,你需要根据实际情况手动删除重复的ID。
检查和验证方法
修复完成后,如何验证问题是否解决?
-
使用站长工具:
- 百度搜索资源平台:使用“抓取诊断”工具,输入你的列表页URL,查看百度识别的内容是否是你期望的。
- Google Search Console:使用“URL 检查”工具,查看 Google 抓取到的页面快照,并检查“网址”报告中的重复页面。
-
使用SEO工具:
使用如Screaming Frog、Sitebulb等网站爬虫工具,抓取你的网站,在生成的报告中,查看是否有“重复的标题”或“重复的页面描述”警告,这些工具能非常直观地展示出重复的URL和内容。
排查清单
遇到列表页重复问题,按以下步骤操作:
- 【必做】 在列表页模板
<head>中添加canonical- 【必做】 检查列表页模板,确保调用的是 `[field:description/] (,而不是全文。
- 【必做】 检查首页、其他栏目页的调用标签,确保
typeid明确,不交叉调用。- 【推荐】 统一网站的 URL形式,并设置301重定向。
- 【可选】 清理 DedeCMS缓存。
- 【最后手段】 检查数据库中是否存在 重复记录(操作前备份!)。
按照这个流程,绝大多数DedeCMS列表页重复问题都能得到有效解决。
