# 网站标题应该怎么写才不会全部重复？

URL: https://caijiao.org/posts/165
Source: docs/posts/165.md
Description: 标题重复不是因为用了模板，是因为模板里只有一个变量。需要对象、约束、输出三个变量位，前 60 个字符承载全部区分信息，并在构建期对整站标题做一次查重。

TinyWow 挂着 250 多个工具，10015.io 有 50 多个，Omni Calculator 覆盖 30 多种语言、页面以千计。这些站点没有一个在标题上互相撞车，原因是它们的模板里塞了不止一个变量。

![TinyWow 工具站首页截图](/images/2026-09/tinywow.com.png)

*TinyWow 首页把 AI Write 并进了工具矩阵，文本类任务和文件转换共用一个搜索框。*

标题重复这件事，根因从来不是"用了模板"，是**模板里只有一个变量**。

## 只有一个变量的模板，页数一多必然重复

最常见的一版模板长这样：`{工具名} - 免费在线工具 | 站点名`。

变量只有"工具名"一个。前二十页还行，因为工具名本身不重复；做到第二百页，你会发现"图片压缩 - 免费在线工具"和"图片压缩器 - 免费在线工具"同时存在，而它们指向两个功能几乎一样的页面。更糟的是，站点名占了标题后半段，把真正有区分度的信息挤到了会被截断的位置。

一个变量的模板还有个隐蔽问题：它让标题无法承载额外信息。用户搜的是"png 转 jpg"，月搜索量 87.6 万，你的标题只有"图片格式转换 - 免费在线工具"，连对象都没点明，点击率自然上不去。

更麻烦的是它会掩盖重复。两个功能一样的页面，工具名只差一个字，人工看标题时会觉得"不一样"，但对搜索引擎来说这两页的主体完全一致，其中一页迟早进入"已抓取未索引"。等你在 Search Console 里发现这个状态时，已经铺了几百页。

## 三个变量位才够：对象、约束、输出

我用的模板是 `{对象} {动作} - {约束或输出} | 站点名`，三个变量位各自独立。

对象填具体输入物：PNG 图片、小时工资、2100 平方英尺的房子。动作填用户要干的事：转 JPG、算年薪、估算造价。约束或输出填这一页区别于同类的地方：保留透明通道、按 52 周计算、含材料与人工。

三个变量位都填上之后，同一父目录下的页面标题两两不同，且前六十个字符里已经把三件事全说完了。

填的时候有个顺序要求：先填对象，再填动作，约束放最后。因为截断是从后面切，用户最先看到的必须是"这是个什么东西"。把站点名或形容词放在最前面，等于把最有区分度的信息留给了最可能被切掉的位置。

约束位是最容易被省掉、也最不该省的一个。它同时解决两个问题：让标题不重复，以及让搜索结果里的用户一眼判断这页是不是他要的。

## 前 60 个字符要装完所有区分信息

搜索结果里的标题按像素宽度截断，中文大致在 30 到 34 个字、英文 60 个字符上下。超过这个长度的部分在移动端大概率看不到。

站点名的位置建议放到末尾，甚至在页面数多起来之后直接去掉——品牌词有搜索量的站点才值得占这个位置。TinyWow 有 10.3 万的月搜索量带品牌词，它把站点名放哪都行；一个新站没有品牌搜索量，标题末尾那几个字是纯浪费。

## 多语言不是翻译，是重新生成

Omni 覆盖 30 多种语言，如果靠人工翻译标题，八千页乘以三十种语言是二十四万条，不可能维护。

做法是模板本身本地化：每种语言一套 `{对象}`、`{动作}`、`{约束}` 的词库，页面配置里只存 ID 和参数，标题在构建时按语言组装。加一门语言是加一份词库，不是翻译一批页面。

组装时还要处理语序。中文把约束放前面自然，英语里放中间更顺，德语里复合词会把对象和动作直接拼起来。模板因此不能是一句完整的话加三个插槽，得允许每种语言定义自己的组装顺序，否则组出来的标题语法正确但读着别扭，点击率会体现出来。

组装逻辑用 [React](/react/) 的组件来做很顺手——标题、描述、结构化数据读同一份页面配置，改一处三处同步。

## 构建期加一条查重，重复就让构建失败

人工检查在几百页规模就已经失效了。把校验放进构建流程：所有页面标题生成完之后，对整站做一次去重统计。

页面数据既然都存在 [SQLite](/sqlite/) 里，一条 SQL 就能查出重复的 title，把重复的页面 ID 打出来。我的阈值是零容忍——出现重复直接让构建失败，因为重复标题背后通常不是标题写错了，是两个页面功能重叠，那才是真问题。

顺手再做两条检查：标题长度超过 60 字符的页面列出来，标题里变量为空（配置漏填）的页面列出来。这三条校验写进 CI，比事后人工巡查有效得多。生成脚本本身用 [JavaScript](/javascript/) 写就行，和站点同语言，改起来不用切上下文。

校验不只在构建期跑。站点运营半年后回头再跑一次，往往会发现一批重复是"后加的页面"造成的——新类别和老类别在边界上撞了。这类问题只有靠定期重跑才能发现，靠人记忆是不行的。

标题是模板的产物，但模板不该是省事的地方——它是唯一一处每个页面都必须经过、且能被机器校验的地方。

真要省时间，省在别处：页面正文的说明段落可以按类别共用一个骨架，FAQ 可以只给前 50 个热门页面写。标题不行，它是搜索结果里唯一保证被展示的那一行。

---

*Omni Calculator 语言覆盖与页面规模来自其官网及 Semrush 2026 年 6 月估算；TinyWow 工具数量与关键词数据来自其官网及第三方估算工具。*
