Meta description 在大量页面重复

Search Console "HTML Improvements" 或第三方爬虫显示几百页 meta description 相同——为什么没你想的那么严重,但仍要管。

Screaming Frog 或 Ahrefs 报”247 页 meta description 重复”。Search Console 旧版 HTML Improvements 报告也标同样。你想花一个周末把这 247 页全重写——别。重复 meta description 不会导致排名惩罚(Google 多年前就确认过);它通过让你的 SERP 看起来雷同来损失 CTR。修复是定向的,不是全站的:重写流量前 50 的页给独特 description;长尾要么从元数据自动生成、要么干脆不写 meta 让 Google 按 query 合成。

常见原因

按命中率从高到低。

1. 模板 fallback 到站点级 description

const description = article.description || site.description;

article.description 为空时吐站点标语。所有没填的文章都拿到同一句话。

怎么判断:统计你站点标语在所有 HTML description 里出现的次数。> 20 页共用就是这条。

2. CMS 字段从未逐篇填

CMS 里有 meta description 字段但不是必填。作者留空。模板 fallback 兜底。

怎么判断:审你文章的 description frontmatter。统计有多少是空或模板默认。

3. 自动生成的分类 / 标签 / 归档页

/category/ai-tools//category/productivity//category/tools/ 都用了通用模板 description:“Browse our latest articles on this topic.”

怎么判断:随便看 5 个分类页 meta description。通用且一样 = bug。

4. 分页页共用父页 description

/blog/page/2//blog/page/3/ 都用 /blog/ 的 description。有时它们甚至不该被收录。

怎么判断curl -s https://yoursite.com/blog/page/2/ | grep -oP 'description" content="\K[^"]+——跟 /blog/ 一致就是这条。

5. 自动取正文前 155 字符

模板”聪明”地取文章正文前 155 字符当 description。如果文章都用同样的样板开头(“在本文中我们将……”),description 又变成近重复。

怎么判断:对比 5 篇 description。都用同样的前 3-4 个词开头就是自动提取太激进。

6. 翻译页共用源语言 description

EN 和 ZH 版本共用 EN description(翻译没覆盖 meta)。文章数 × 2 = 一对一对的重复。

怎么判断:对比 /en/article.mdx/zh/article.mdxdescription frontmatter。一样就是翻译跳过了 meta。

最短修复路径

第 1 步:导出重复 map

# 从 sitemap 拉所有 URL 的 description
curl -s https://yoursite.com/sitemap.xml | grep -oP '<loc>\K[^<]+' | \
while read url; do
  desc=$(curl -s "$url" | grep -oP 'description" content="\K[^"]+')
  echo -e "$desc\t$url"
done | sort | uniq -c -d -f1 -w200 | sort -rn | head -50

按重复次数降序排。前 10 个是优先级。

第 2 步:按流量优先,不按次数

把重复 URL 跟 Search Console → Performance → Pages(按曝光排)对照。聚焦交集:既重复又高曝光的页。

大概是 50-200 页。这些给独特 description。长尾重复可以等或交给自动生成。

第 3 步:为头部 50 写独特 description

每篇按这个模板:

[主关键词短语] + [独特数字 / 细节] + [用户价值]

例:

差(模板默认)
”AI 效率指南——最新工具与技巧""2026 我付费用的 12 个 AI 工具 + 用一周就弃掉的 8 个"
"浏览我们的分类页""47 篇 Astro on Vercel 实战排错指南”

约束:英文 140-160 字符、中日韩 60-80 字。

第 4 步:长尾从元数据生成

模板 helper:

function generateDescription(article) {
  const intro = article.firstParagraph?.slice(0, 100);
  const stats = `${article.wordCount} words · ${article.readTime} min read · ${article.tags.join(", ")}`;
  return `${intro} — ${stats}`.slice(0, 160);
}

用每篇自己的元数据自动产出独特 description。

第 5 步:或者长尾干脆省略 meta

写不出独特描述的页,完全不写 meta。Google 会按 query 合成——常常比一句弱的模板描述更好。

{article.description && (
  <meta name="description" content={article.description} />
)}

没有 meta 比一句重复且弱的 meta 好。

第 6 步:CMS 把 description 设必填

content 配置里(Astro src/content/config.ts):

const article = z.object({
  title: z.string(),
  description: z.string().min(50).max(160),  // 必填
  // ...
});

新文章没 description 就提交不了。

第 7 步:CI 加去重校验

// scripts/check-description-uniqueness.mjs
import fs from 'node:fs';
import matter from 'gray-matter';

const seen = new Map();
const issues = [];

for (const file of fs.readdirSync('src/content/articles/en')) {
  const { data } = matter(fs.readFileSync(`src/content/articles/en/${file}`, 'utf8'));
  const desc = data.description?.trim();
  if (desc && seen.has(desc)) {
    issues.push(`DUPE: ${file} == ${seen.get(desc)}`);
  } else if (desc) {
    seen.set(desc, file);
  }
}

if (issues.length) { console.error(issues.join('\n')); process.exit(1); }

第 8 步:提交 sitemap 后等

重交 sitemap。Search Console 2-4 周反映变化。

哪些情况可能不是你操作错了

Google 经常按 query 自己生成 snippet。独特 meta description 给你默认 snippet(当 query 大体匹配页面时)的控制权——但很具体的 query,Google 合成的常常赢。

容易误判的情况

从正文前 155 字符自动取看起来聪明,可能更糟:文章共用样板开头时 description 又变成近重复。

预防建议

  • CMS schema 把 description 设必填(Zod 或类似强制)。
  • 模板 fallback 留空(让 Google 决定),不要写死一句标语。
  • 构建期 CI 去重校验;重复就 fail。
  • 分类 / 标签 / 分页页:要么每页写独特引言、要么 noindex
  • 每季度用爬虫工具审重复 description 比例;超过 10% 就重写。

FAQ

  • 多少重复算太多? 高曝光页哪怕一个重复都伤 CTR。高流量重复 < 10 个就 OK。
  • 所有重复都要重写吗? 不——按流量排。长尾可以等或按算法处理。

相关阅读

标签: #SEO #排查 #排查 #结构化数据 #重复 Meta