爬虫审计报「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 类型 | 修法 |
|---|---|
| 模板 fallback | title: 改必填、缺失 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”