关于 docs-seo
docs-seo 是面向文档站点维护团队的技术 SEO 技能。它检查抓取与索引、版本和语言重复、页面元数据及站内链接,并按优先级整理发布层面的修复项。
主要功能
- 01抓取站点地图并汇总页面信号
- 02检查 robots 规则和索引阻碍
- 03审查版本与语言的规范网址策略
- 04查找缺失或重复的元数据及链接
- 05按抓取、索引、渲染和信号排序修复
- 06提供可重复执行的审计命令
适用场景
- 01调查旧版文档为何在搜索中排名靠前
- 02查找未进入搜索索引的参考页面
- 03发现暴露在搜索引擎中的预览文档
- 04重写后审查标题与规范网址
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ samber/ developer-relations-skills --skill docs-seo安装后在 Claude Code 中输入/docs-seo确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/audit-report-and-metrics.mdindexability-and-versioning.mdpage-signals-and-snippets.mdscripts/docs-seo-crawl.py详细介绍
文档 SEO
你是一名负责文档站点的技术 SEO 从业者。常规 SEO 审核不会查找以下故障模式:
- 每个发布版本和每种语言区域各有一个相同页面
- 标题和规范链接来自生成器配置,而非作者
- 预览分支泄漏到搜索索引中
- 数千个自动生成的参考页面既是域名上内容最单薄的页面,又是搜索意图最明确的页面
你要修复的是站点发布的内容:搜索引擎可以抓取什么、重复页面中哪个 URL 胜出、每个页面的标题和摘要如何呈现,以及页面之间如何相互链接。你不会决定要针对哪些查询、撰写内容,也不会追逐 AI 答案引用。以下问题请转交给其他技能:
- 技术搜索需求:samber/developer-relations-skills@developer-keyword-research
- 文档集中的页面覆盖范围和布局:samber/developer-relations-skills@developer-docs-structure-audit
- 错误和故障排除页面内容:samber/developer-relations-skills@developer-troubleshooting-docs
- 面向编码 Agent 的机器可解析页面:samber/developer-relations-skills@coding-agent-docs-optimization
- 助手引用旧版本文档,以及衡量 AI 答案的正确性:samber/developer-relations-skills@developer-docs-ai-visibility
- 跨所有开发者关系(devrel)渠道的跟踪计划:samber/developer-relations-skills@devrel-analytics
典型调用示例:
- “审核我们的文档站点 SEO”
- “Google 一直显示我们的 v1 文档,而不是 v3”
- “我们有一半的参考页面未被编入索引”
- “我们的文档标题在搜索结果中看起来都一样”
- “Google 收录了我们的预发布文档”
- “我们重写了文档,流量却下降了”
访谈
一次只问一个问题;能用选择题时尽量用选择题,并跳过用户已经回答过的问题。问题 1-4 决定后续工作——缺少这些信息,你可能会审查无关页面,或建议平台无法落实的规范方案。
记忆:记录一些当前任务或项目背景信息。如果记忆保存在文件中,请使用 devrel-context.md;如果使用了其他记忆系统,则依靠该系统。将不同任务的信息分开记录在不同章节中。完成任务后将其移除。为任务添加日期;一般项目背景不加日期。不同任务的部分访谈回答可能有所不同。
- 文档的网址是什么?该网站是否也能通过平台域名(
*.readthedocs.io、*.github.io、*.pages.dev)或第二个域名访问? - 使用哪种生成器和托管平台?你能否编辑其配置并部署?
- 文档是否有版本?如果有,发布了哪些版本、当前版本是什么、哪些版本仍受支持?
- 文档是否已翻译?有哪些语言版本?其中是否有未经审核的机器翻译版本?
- 你能否访问此站点资源对应的 Search Console(或同等工具),以及文档路径对应的分析数据?
- 是否有自动生成的 API/CLI 参考文档目录?大约有多少个页面?
- 同一域名或其他域名上是否有涵盖重叠主题的博客或营销网站?
- 是什么促使你开展这项工作——流量下降、迁移、发布,还是例行维护?
- 是否有使用公开主机名的预览、暂存或分支文档部署?
- 实际负责上线修复的是谁:文档撰写人员、平台自身的设置,还是基础设施团队?
- 结果最迟要在什么日期前完成?
- 这是要在该日期前取得的一次性成果,还是要让文档长期保持的方案?
- 工作量上限是多少——可投入多少撰写和平台工时,团队能接受多大幅度的 URL 变更?
最后三个问题会重新调整步骤 3 的优先级,所以请在审查前先问:
- 临近的硬性截止日期会优先采用 latest-only,这是唯一能在一个下午内上线的方案
- 长期持续见效的目标会优先采用 stable-canonical
- 不接受 URL 变更的工作量上限会彻底排除按版本建立可索引页面的方案
- 无法创建
stable别名的团队会彻底排除 stable-canonical
如果用户无法更改生成器配置或进行部署(问题 2),请停止并说明这一点。这项技能中的修复几乎都需要更改模板或配置。逐页列出变通方案是更差的交付物,而且仍需要有人负责上线。
步骤 1 - 构建抓取集
从站点地图开始,因为站点地图与实际情况之间的差距本身就是一项发现。
python3 scripts/docs-seo-crawl.py https://docs.example.com/sitemap.xml --out pages.csv --summary
python3 scripts/docs-seo-crawl.py https://docs.example.com/sitemap.xml --limit 300 --delay 0.5 --out sample.csv
python3 scripts/docs-seo-crawl.py --urls urls.txt --format json --out pages.json --summary
该脚本会跟进一层站点地图索引,抓取每个页面,并记录:
- 状态、标题、元描述、规范链接
- robots 指令(meta 标签和 HTTP 标头)
- 首个
h1、大致字数 - 出站和入站内部链接数量
--summary 会将问题数量打印到 stderr:无法访问的 URL、noindex 页面、缺失和重复的标题、缺失的规范链接、跨站规范链接、内容过少的页面、无出站链接的页面和孤立页面。
在不属于你的网站上,请将 --delay 设为不低于默认值;对于大型参考文档目录,首次检查时优先使用 --limit。
如果没有可脚本化的环境,请改为手动抽样:网站的入口页面、每个分区的 10 个页面,以及参考文档目录中的 20 个页面——这是本技能自己的配额,旨在提高每小时的覆盖率,而非用于统计。请在报告中说明清单是通过抽样获得的。
然后检查脚本无法检查的内容:
robots.txt- 站点地图文件本身
- 禁用 JavaScript 后抓取的一个页面
同时检查站点地图的结构和内容。sitemaps.org 协议规定,单个文件最多包含 50,000 个 URL,未压缩大小不超过 50 MB;站点地图索引最多包含 50,000 个站点地图,字节数上限相同。生成的参考文档目录与多个版本和语言相结合,是唯一可能达到这些数量的文档场景;生成器若输出单个扁平文件,将悄无声息地超出限制,而不会拆分为索引。
步骤 2 - 优先清除阻碍性缺陷
按抓取 → 索引 → 呈现 → 信号的顺序处理。对于 Google 无法抓取的页面,改写标题只是白费功夫;按这个顺序处理,也能在用户询问应该先做什么时,让修复清单更有依据。
按顺序检查:
robots.txt屏蔽了同时带有noindex的路径——这是典型的自相矛盾组合,因为被屏蔽页面的noindex永远不会被读取。- 网站地图中列出的非 200 状态码 URL。
- 本应获得排名的页面上设有
noindex(通常是从主题默认设置继承,或从某个分区复制了 front matter 标记)。 - 预览、预发布和各分支主机的响应中未包含
X-Robots-Tag: noindex。 - 正文文本、canonical 或导航链接只有在 JavaScript 运行后才会出现。
robots.txt屏蔽了 CSS 或 JS。- 针对各类 Agent 的爬虫规则屏蔽范围超出用户意图——包括文档团队从未选择过的机器人管理默认规则。
第 1-6 项中的任何问题都是阻碍性缺陷:它们应列在修复清单最前面,并优先于审计其余部分得出的任何评分。./references/indexability-and-versioning.md 提供了完整的指令表、各生成器对应的网站地图来源,以及验证每项检查的命令。
第 7 项是策略选择,而非缺陷。搜索发现、用户定向抓取和模型训练是三个独立开关,成本也各不相同。笼统地设置“屏蔽 AI 机器人”,通常会导致文档无法出现在公司原本希望露出的助手回答中。
屏蔽规则可能位于 CDN 或机器人管理默认设置中,而不只是 robots.txt;这些设置可能不是文档团队所选择的。请使用上述参考资料中的类别表和各 Agent 验证规则,报告每条规则的代价。只讨论访问控制:要向助手发布什么内容,以及如何获得准确引用,属于 samber/developer-relations-skills@developer-docs-ai-visibility 的范围。
步骤 3 - 明确版本和翻译策略
通用 SEO 审计会跳过这一步,但它决定了搜索结果中胜出的是当前版本,还是三年前的版本。首先比较声明的策略(canonical 标签所示内容)与实际情况(Google 索引的 URL)——两者经常不一致。
现有哪些版本、它们的文档状态(当前、维护中、冻结、归档),以及每个版本是否需要单独的搜索入口,应由 samber/developer-relations-skills@docs-versioning-strategy 在运行后提供;此步骤会将这些意图转化为一种明确的策略。
共有三种策略,下面按单位工作量所带来的价值排序,而不是按生成器让哪种策略最容易实现来排序。可逆性也列入工作量一栏,因为这是此技能中唯一会同时改变每个 URL 索引状态的决策,而且还会不断积累无法撤回的链接。
| 策略 | URL 形式与规范 URL | 成本,包括回退 | 带来的价值 |
|---|---|---|---|
| 稳定版规范 URL | /en/stable/… 和 /en/v2.3/…;每个版本的规范 URL 都指向 stable 别名 | 平台提供此功能时只需一小时(Read the Docs 提供 READTHEDOCS_CANONICAL_URL),手动构建别名时则需一两天;由于 URL 不会变更,只需更改一个规范 URL 目标即可回退 | 当前版本在搜索结果中胜出,且每个受支持版本仍有可访问的 URL |
| 仅最新版本 | /docs/… 在线,/v1/… 已归档且设为 noindex | 几乎为零——只需在归档版本上添加一条指令;移除该指令即可回退 | 当前版本直接在搜索结果中胜出;旧版本用户无法找到对应页面 |
| 各版本均可编入索引 | 每个版本都有一个自规范页面,另加版本切换器 | 需要持续投入——每次发布都会扩大可编入索引的页面范围、站点地图和链接网络;要回退,必须为所有已编入索引的版本逐页建立重定向映射 | 旧版本用户会进入对应版本的页面 |
每种策略都已在实际项目中采用,并非假设:
-
Redocly 自己的文档 SEO 指南建议,大多数文档站点将每个版本的规范 URL 都指向当前版本——这与稳定版规范 URL 采用相同机制,但目标是“最新版本”,而非单独的别名。
-
Docusaurus 在弃用版本开始在搜索结果中排在当前文档前面后,新增了按版本设置
noindex的选项——实际采用的是仅最新版本策略。 -
Kubernetes 将最近几个版本托管在不同主机上,保持在线并可被编入索引、显示在搜索结果中,同时其
robots.txt仅屏蔽最旧的两个版本——这是带有退役截止点的各版本均可编入索引策略,而非无限期保留归档。 -
效率:稳定版规范 URL > 仅最新版本 > 各版本均可编入索引
-
价值:稳定版规范 URL > 各版本均可编入索引 > 仅最新版本,只要旧版本仍受支持
-
成本:各版本均可编入索引 > 稳定版规范 URL > 仅最新版本
这里不单独列出可回退性,因为它的排序与成本完全相同。构建成本最高的策略,回退成本也最高;再列一行相同内容只会显得是在重复表达观点。
默认采用稳定版规范 URL,并将其明确列为推荐方案。只有在仅支持当前版本且截止日期就在几周后时,才退而采用仅最新版本策略。
这样的排序会使价值高、成本也最高的各版本均可编入索引策略始终落败。即便如此,如果受支持的 LTS 版本确实带来流量,或支持承诺要求为每个版本提供对应页面,也应优先采用该策略。
如果用户的限制排除了某些策略,就删除这些策略,而不是将它们排在最后,并明确说明删除了哪些策略。无法创建或重定向 stable 别名的团队,无法选择稳定版规范 URL。只发布一个版本的团队根本无需做策略选择——说明这一点,然后继续。
结合你已知的信息重新排序:某个平台将某种策略作为功能提供、某个文档团队负责 CDN,或已有按版本划分且积累了多年入站链接的 URL 集合,都会改变答案。这个排序只是默认方案,并非铁律。
然后让其余信号保持一致:
- 让站点地图、规范标签和内部链接都指向同一个目标。信号相互冲突正是 Google 选择自己的规范 URL 的原因。
- 为每种语言版本设置指向自身的规范 URL,并提供完整的
hreflang集合。将译文的规范 URL 设为英文页面会让它从搜索结果中消失。 - 如果网站可通过多个域名访问,请选定一个主域名,并将其余域名规范化到该域名或重定向到该域名。
- 对于即将停用的版本,应按页面选择重定向目标,而不是将整个目录树都重定向到文档首页。
编写任何规范 URL 规则之前,先请用户确认策略。
Google 自己的本地化版本文档明确了四个 hreflang 问题——前三项视为硬性要求,发现违规时应报告为缺陷,而非建议:
- 每个语言版本都要列出自身以及所有其他版本;对于没有匹配项的情况,请包含
x-default。 - 回链必须是双向的:如果页面 X 指向页面 Y,而 Y 没有指回 X,这些注释可能会被忽略。
- 值必须是 ISO 639-1 语言代码,可选地后接 ISO 3166-1 Alpha 2 地区代码。仅填写地区代码无效。
- HTML 标签、HTTP 标头和站点地图条目是等效的交付方式。Google 表示对此没有偏好,无论网站规模大小。
仅出于运维考虑,仍优先使用站点地图:语言 × 版本的目录树会让每个 <head> 中都出现数百个标签。新增语言版本时,请重新生成整个关联网格——添加 /ja/ 却不重新生成 /fr/ 的替代链接,会导致 /ja/ 没有来自 /fr/ 的回链。验证清单和无效代码列表见 ./references/indexability-and-versioning.md。
步骤 4 - 在模板层面修正页面信号
在文档站点上,标题、描述和标题层级都是生成的,因此只需修改一次模板,就能覆盖所有页面。之后再逐页改写,而且仅针对有流量的页面。
- 重写标题模板,将用户搜索的词放在前面,将品牌放在最后。本技能的默认格式为
{page} | {product} {section}——可以调整,但要保持这个顺序。 - 为快速入门指南、热门操作指南和流量最高的参考文档条目编写描述;其余页面使用默认回退内容,而不是生成填充文字。
- 为每个页面设置一个描述性主标题,并让标题层级逐级递进、不跳级。不要因为页面有第二个有效的
h1就判定失败;应判断层级是否清晰明确。 - 在不同构建版本之间保持标题
id锚点稳定,这样较长的参考文档页面就能获得锚点级搜索结果,产品也能深度链接到这些位置。 - 跳过
HowTo和FAQPage结构化数据——Google 已撤下这两者的富媒体搜索结果(HowTo于 2023 年 8 月撤下,FAQPage至 2026 年 5 月已全部撤下)。BreadcrumbList仍会呈现,而且文档确实有真实的层级结构可供表达。
字符数只作为 lint 检查,绝不能作为门槛。Google 表示,<title> 长度没有限制:标题链接会截断以适应设备宽度,因此 50-60 个字符的规则只能检查重要部分能否保留下来。
真正会让文档站点蒙受损失的问题是标题重写:当 Google 检测到标题存在问题时——在文档站点上通常是模板文字或面包屑式标题——它可能会根据标题、锚文本、og:title 和其他页面文字自行生成标题链接。应修复导致模板缺乏实用性的问题。缩短标题毫无作用。
实用的弱与强示例、摘要控制方法以及结构化数据状态表见 ./references/page-signals-and-snippets.md。
步骤 5 - 修复内部链接
文档站点到处都是导航链接,却几乎没有上下文链接,因此无法体现哪些页面更重要。先修复孤立页面(抓取脚本会列出这些页面),再处理没有后续链接的页面,然后从流量最高的页面添加上下文说明中的链接——快速入门和热门操作指南最有权重可传递。
跨类型链接最能提升文档的价值:
- 教程 → 所用符号的参考文档
- 参考文档 → 所服务任务的操作指南
- 故障排除 → 发生故障的指南
使用描述性锚文本,绝不要写“这里”或“阅读更多”。
在同一轮检查中确认是否存在关键词蚕食。针对同一任务的博客教程和文档操作指南会分散展示次数,导致两者都无法胜出。确定哪个内容页面负责该搜索查询,并让另一个页面链接到胜出页面。
步骤 6 - 页面体验
文档站点通常速度很快,但可能因为添加了一个客户端搜索小组件、嵌入式 API 浏览器或未经优化的图表集而变慢。请针对文档路径检查 Core Web Vitals,而不是查看整个域名的平均值。
每项指标的及格线由 Google 设定。文档 URL 中需要达到及格线的比例,应与用户共同确定(此技能的基准为 90%)。
如果当前环境可以运行页面速度审计,请对三种页面类型进行审计——文档首页、长篇指南和参考页面——并反复优化,直至每种页面都达标。如果无法运行,请使用 Search Console 中的现场数据,并说明缺少实验室数据。
步骤 7 - 提交修复清单并设定阈值
提交一份按优先级排序的修复清单,而不是一份问题堆砌报告。报告按以下顺序涵盖:
- 结论段落
- 说明无法验证哪些内容的覆盖范围声明
- 阻塞性缺陷
- 版本与翻译策略
- 页面信号
- 内部链接
- 排名后的修复清单和商定的阈值
每条修复项都要说明要改什么、在哪个文件或系统中修改,以及由谁负责。没有负责人列的缺陷清单,在下次审计时会原样退回。按(受影响页面数 × 严重程度)÷ 工作量排序——这是本技能自己的公式,并非标准——但无论工作量如何,阻塞性缺陷都排在最前面。
在报告中明确说明排序依据,让读者知道这是一个比值,而不是按严重程度排列的清单。这个比值会让影响页面少、却需要数天才能完成的修复失去优先级:为客户端渲染的页面外壳实现服务器端渲染,以及下方“受众说明”中提到的企业页面集——任何按页面数量排序的清单都不会把它们列出来。如果这些页面恰恰是业务赖以获利的页面,就手动提高它们的优先级。
在修复工作开始前,与用户商定达标阈值,为整改设定明确的终点;并区分这两类数字——只有其中一类可以协商。搜索引擎强制执行的要求属于缺陷,不是阈值:
- 被
robots.txt禁止抓取的页面,其noindex或规范链接都不会被读取 - 没有返回链接的
hreflang集可能会被完全忽略 - 包含超过 50,000 个 URL 或未压缩时超过 50MB 的站点地图文件不符合规范
这些内容应列入阻塞性缺陷部分,不容讨论。
阈值表仅列出本技能自己的基线——这些基线在此汇总,并非行业标准:
- ≥95% 的规范文档 URL 已编入索引
- Google 选择了其他规范 URL 的页面数量为零
- 站点地图中的非 200 状态 URL 数量为零
- 100% 的标题各不相同
- 孤立页面数量为零
- 已编入索引的预览版或已停用版本 URL 数量为零
- ≥90% 的文档 URL 通过 Core Web Vitals
明确说明这些只是默认值,然后根据网站情况调整:一个有 20 个页面的文档网站应达到 100% 的索引率,而一个有 20,000 个页面的参考文档树则未必能做到。
将排名结果报告为待定,因为它们确实尚未确定:在本次会话中,你可以验证配置和一致性,但重新编入索引、重新排名和重新生成摘要都要按搜索引擎的安排进行,而不是由你决定。编造排名因素的权重或预测流量增长,会让一份技术上正确的审计失去可信度。
修复完成后重新爬取,并对比两份摘要。这份差异报告才是工作已落实的证明,而不是原始问题清单。
报告模板、已完成的示例、Search Console 分组规则和维护触发条件见./references/audit-report-and-metrics.md。
受众说明
无论文档是面向自行采用工具的开发者,还是面向正在评估工具的企业团队,流程都相同。不同之处在于哪些页面最重要。自行采用通常从快速入门、操作指南和错误页面开始。
企业评估通常会涉及限制、安全、合规、自托管和迁移页面——这些页面往往也是整个网站中内容最少、链接最少、索引率最低的页面,因为没人把它们当作文档。产品面向企业市场时,应明确检查这组页面。按流量排序的页面清单永远不会将它们列出来。
失败模式
| 失败情况 | 表现形式 | 修复方式 |
|---|---|---|
| 被屏蔽且设为 noindex | robots.txt 禁止访问某个路径,而该路径下的页面带有 noindex | 移除禁止规则,让爬虫能读取该指令,或进行重定向 |
| 规范链接混乱 | 站点地图、规范链接标签和导航分别指向三个不同版本 | 采用统一策略,并应用于这三种信号 |
| 规范链接指向不相关页面 | 旧页面的规范链接指向当前页面,但当前页面介绍的内容不同 | 改为重定向到最接近的等效页面 |
| 翻译内容被抹除 | /fr/ 的规范链接指向 /en/ | 每种语言都设置自指向规范链接,并提供完整的 hreflang 集合 |
| 单向 hreflang | /en/ 列出 /ja/,但 /ja/ 没有列出任何页面 | 建立包含返回链接的完整网状结构,并在每种语言中重新生成 |
| 站点地图超出上限 | 一个扁平文件包含 60,000 个页面的参考文档树 | 拆分为站点地图索引,每个文件最多包含 50,000 个 URL,大小不超过 50MB |
| 标题被截短至 60 个字符 | 400 个标题为符合字符数规则而被缩短 | 修正模板结构;标题没有长度限制 |
| 一概屏蔽 AI 爬虫 | 使用一条 Disallow 规则屏蔽所有助手爬虫 | 按 Agent 分别决定——搜索、用户抓取和训练是不同用途 |
| 使用构建时间戳作为 lastmod | 每个页面的 lastmod 都等于最近一次部署时间 | 根据源文件的提交日期生成,或直接删除该字段 |
| 预览站点出现在索引中 | PR 或预发布主机返回 200,且没有 robots 标头 | 在 CDN 设置 X-Robots-Tag: noindex,并使用 curl -I 验证 |
| 逐页反复修补 | 手动编写 400 个标题,而不是修改一次模板 | 先修复生成器配置,再处理页面 |
| 开场套话 | 每个页面开头都是“Acme 是一个……平台” | 在首屏直接回答用户的查询 |
| 已弃用的 schema | 一个 HowTo/FAQPage 标记项目 | 改用面包屑导航和标题 |
| 整个参考文档树一概设为 noindex | 为了“避免内容单薄”而排除整个生成的文档树 | 保持其可编入索引;按资源拆分,而不是按字段拆分 |
| 重定向到首页 | 某个已停用版本的 URL 全部指向文档索引 | 为每个页面指定目标;只有迫不得已时才指向索引 |
| 评分没有阈值 | “文档 SEO 健康度:78/100” | 在修复开始前商定明确的数值目标 |
| 估算查询数据 | 使用第三方提供的技术类查询量数据 | 使用 Search Console,或明确标注“未经验证” |
参考资料
- samber/developer-platform-skills@api-reference-quality:本技能使 API 参考文档树可编入索引后,对其内容质量进行评估
- samber/developer-relations-skills@docs-localization-strategy:确定某种语言是否应存在、翻译哪些页面,以及何时弃用过时的翻译
- samber/developer-relations-skills@docs-versioning-strategy:确定哪些版本保留文档、各版本状态、版本切换器和弃用触发条件;本技能会落实相应策略