大量页面重复 title:6 种来源 + 「per-page title 必填 + CI 拦」预防

审计报 80 页共用一个 `<title>`——一般是模板 fallback / 分页 / 双语未消歧——让 per-page title 必填、CI 拦同标题。

爬虫审计报「80 页 <title> 完全一样」。你一查——都是「MySite Blog」或「MySite — Tag Page」或「Article on MySite」。Google 在 SERP 分不清、这些页 CTR 惨、审计工具一直亮红。

重复标题稀释排名信号、给 Google「SEO 偷懒」信号。多数重复来自 6 种模式:模板 fallback(per-page title 缺失)、分页(「Posts — Page 2」)、双语未带 locale 标记、机器生成 tag 页、CMS 错误、syndicated 转载。修法:per-page title 必填 + CI 断言无两个可索引页同 title。

常见原因

按命中率从高到低:

1. per-page title 缺失时套模板 fallback

你 frontmatter 里写了 title:,但 title 空时模板 fallback 到「MySite Blog」——好几篇没填 title 的文章现在共用 fallback。

如何判断:有 fallback 标题的页面 frontmatter 里 title: 都是空。grep -L "^title:" src/content/articles/**/*.mdx 列出来。

2. 分页(Page 2、Page 3)共用父标题

/blog/ 是「MySite Blog」,/blog/page/2/ 也是「MySite Blog」,/blog/page/3/ 同。分页没反映在 title 里。

如何判断:URL 模式 /page/N/?page=N<title> 一样——URL 在区分,title 没。

3. 双语页没 locale 标记

/en/articles/topic//zh/articles/topic/<title>Topic</title>——Google 把它们去重了,尽管 URL 不同。

如何判断:同 translationKey 对、title 一致——ZH 版至少该有中文字,两边都「Topic」就是模板没 localize。

4. 自动生成 tag / 归档页

50 个 tag 页都叫「Tagged: ${tagName}」——但模板只输出了「Tagged: 」没替换变量。全是字面 <title>Tagged: </title>

如何判断<title> 里有格式字符串残片的页面模式——模板变量替换失败。

5. CMS / bulk-edit 把多个 title 合成了一个

「查找替换」或 normalize 脚本覆盖了多文件的 title:——它们现在共用模板派生的标题。

如何判断git log --all -p -S "title:" -- src/content/articles/ 看近期 bulk-edit——某次 edit 把很多 title: 设成同值。

6. Syndicated / import 的内容保留了原站标题

从合作博客 import 的文章保留了原 <title>——现在是你站 50 页的 title,全和合作方旧格式一致。

如何判断:共用 title 可疑地带着别的站点 branding 或日期格式你站不用。

最短修复路径

按收益从高到低。Step 1 审计,Step 2 + 5 防再发。

Step 1:爬一遍 + 导出,按 title 分组

# 用 Screaming Frog、Sitebulb 或自己写
# 导出 URL + <title> 为 CSV
# 按 title 分组,count 倒序

看到最大重复 cluster 先修——修 80 页同标题比修 5 个小重复值得。

Step 2:每组决定怎么差异化

Cluster 类型修法
模板 fallbacktitle: 改必填、缺失 fail build
分页加 ” — Page 2” / ” — Page 3”
双语撞加 locale:en Topic / zh 主题(或后缀 ” — English” / ” — 中文”)
Tag 页格式字符串 bug修模板变量替换
Bulk-edit 覆盖git log 恢复或逐页重写
Import syndicated重写 title 符合你站风格

Step 3:title 既要独特也要可搜

光独特不够——也要搜索友好

差:「Article」(独特但没用)
好:「Claude API streaming responses — step-by-step (2026)」

靠 specificity 差异化,不只是加数字。

Step 4:重提 sitemap + 申请重索引

改完 title:

# Astro / 静态生成器一般 build 时重建 sitemap
pnpm build

# GSC:Sitemaps → 重提
# 高流量页:URL Inspection → Request Indexing

Google 不重爬就看不到新 title——显式提交加速。

Step 5:CI 断言:无重复 title

// scripts/check-unique-titles.mjs
import fs from "node:fs";
import path from "node:path";
import matter from "gray-matter";

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

function walk(dir) {
  for (const name of fs.readdirSync(dir)) {
    const p = path.join(dir, name);
    if (fs.statSync(p).isDirectory()) walk(p);
    else if (p.endsWith(".mdx") || p.endsWith(".md")) {
      const { data } = matter(fs.readFileSync(p, "utf8"));
      if (data.draft) continue;
      const title = (data.title || "").trim();
      if (!title) { issues.push(`MISSING TITLE: ${p}`); continue; }
      if (seen.has(title)) issues.push(`DUPLICATE: ${p} == ${seen.get(title)}`);
      else seen.set(title, p);
    }
  }
}

walk("src/content/articles");
if (issues.length) {
  console.error(issues.join("\n"));
  process.exit(1);
}

prebuild——重复 + 缺失 title 都 fail CI。

Step 6:不可避免的重复就 noindex

某些重复是合法的(/login/404/about 类)。给它们加 noindex 而不是强行差异化——把”唯一 title 规则”聚焦在可索引、有自然流量潜力的页。

预防建议

  • per-page title 必填,没有 fail build(不要模板 fallback)
  • CI 断言:无两个可索引页同 <title>
  • 分页 / 语言 / tag 模板按构造就输出独特 title
  • 季度爬 + 审,找新 import / 迁移内容产生的重复
  • bulk-edit 脚本必须保留 per-page title;要重写 log + review
  • 靠 specificity(具体描述)差异化,不只是 append “v2”

相关阅读

标签: #内容运营 #站点质量 #站点审计 #排查 #重复标题