双语站的 hreflang 一旦写错,排名信号会被悄悄漏掉:translationKey 拼错、单向链接、缺自指,还有最经典的 zh 和 zh-CN 不一致。Google 的规则很直接——两个页面如果不互相指向,整条标注就直接被忽略(Google Search Central)。这篇教程用大模型去做你本来要人肉一行行盯的”上千行模式匹配”,再用一个免费的专用 hreflang 测试工具复核结果。产出是一份”坏对清单”CSV,你回到源仓库改,再对照渲染后的 HTML 验证。
一句话版
- 每页导出一行 CSV(
slug、lang、translationKey、canonical_url、渲染后的整段<link rel="alternate">),喂给长上下文模型配一份固定清单,回源修、重渲、再复核。 - 大模型抓五类结构性 bug:缺对、key 不匹配、locale 代码错、缺自指、缺
x-default。它不会检查 hreflang 的 URL 是否返回 200——那要爬虫来做。 - Google 的”国际定位报告”已经没了(2022 年废弃、之后移除)。截至 2026 年 6 月,你用 Screaming Frog、TechnicalSEO.com 的免费测试工具(能直接吃整份 sitemap),或 hreflang.org 来监控——不是 Search Console。
- 最适合 50 对文章以上的站。不到 50 对,跑一次 Screaming Frog 爬取比搭这套管道更快。
审什么,不审什么
这套管道检查的是 HTML 页面 <head> 里和 XML sitemap(<xhtml:link> 元素)里的 hreflang,不覆盖 HTTP header 形式——内容站很少用。大模型负责上千行的交叉比对;它没法抓取 URL,所以要另配一个爬虫确认每个 hreflang 目标确实返回 200。
适合双语 / 多 locale 内容站的拥有者和维护者——EN/ZH、EN/JA、EN+ES+FR 都行,Astro / Next.js / Hugo 都行。如果你已有 translationKey 或 i18n-key 字段连接翻译,工作流直接用。没有也行,第 1 步照样跑:slug pair(en/foo ↔ zh/foo)本身就是键。
什么时候跑?每批内容上线后(10 篇以上新增或翻译)、每次 SEO 推进前(外链或重交 sitemap),以及每次改 locale 代码或重命名 slug 之后。这些重命名恰恰是互指关系悄悄断掉的时刻。
五类 bug,各靠什么抓
Google 把 hreflang 当作”提示”而非”指令”——canonical 标签、内容相似度、哪个页面被索引,都可能盖过它。但一条断掉的标注集群会被直接忽略,所以这五类缺陷等于白白浪费信号。截至 2026 年 6 月,每一类在真实爬虫里对应如下:
| Bug | 为什么坏 | Screaming Frog 报告 |
|---|---|---|
| 缺对 | 文章只有一种语言;集群不完整 | Hreflang › Missing Return Links |
| key / slug 不匹配 | 同一 translationKey 解析到对不上的 slug | 表现为断掉的回链 |
| locale 代码错 | 用 zh 而非 zh-CN/zh-Hant;用下划线(en_US)而非连字符 | Hreflang › Incorrect Language & Region Codes |
| 缺自指 | 页面没有自己语言的 alternate | Inconsistent Language & Region Confirmation Links |
缺 x-default | 未匹配 locale 没有 fallback | Hreflang › Missing X-Default |
两条格式规则能解释大多数”代码错”。语言用 ISO 639-1(en、zh);可选的地区用 ISO 3166-1 Alpha-2,跟在连字符后面(en-GB、zh-CN)——绝不用下划线,也绝不单独写地区码(hreflang="US" 无效,因为 Google 不会替你推断语言)。整个值遵循 BCP 47。
开始前准备
- 写下你的策略。 大多数双语站对每个 locale 输出
<link rel="alternate" hreflang="en" href="..."/>,再加一条x-default。把你的确切标签记下来,等下对照渲染结果验证。 - 锁定一个中文代码。
zh、zh-CN、zh-Hans、zh-Hant选一个全站用到底。混着用是集群被忽略的头号原因。 - 用长上下文模型。 1000 行 CSV 加上渲染后的标签列,很容易超过 10 万 token。截至 2026 年 6 月,Claude Sonnet 4.6 和 Gemini 3.1 Pro 都是 100 万 token 上下文(Sonnet 4.6 是更便宜的主力,每 100 万 token 输入 / 输出 3 / 15 美元)。
具体步骤
-
导出 CSV。 一行一篇。列:
slug、lang、translationKey、canonical_url,以及那一页渲染后的整段<link rel="alternate">。一个读 content collection 的短 Node 脚本不到一分钟搞定。 -
用固定清单去 prompt 模型。 保持确定性——每次都用同一份 prompt,这样月度结果才能 diff:
审计这份 hreflang 配置。每行要标的问题:
1. 缺对:translationKey 相同但只有一种语言(按 translationKey 分组)
2. key / slug 不匹配:同 slug 不同 key、或同 key 但 slug 对不上
3. locale 代码错:不在 [en, zh-CN] 集合里;标出下划线和只有地区码的情况
4. 缺自指:该行没有自己语言的 hreflang
5. 缺 x-default
返回 TSV 列:issue, slug, lang, suggested_fix
-
回源修。 真正的修法只有两种:补缺失翻译,或改
translationKey。绝不要靠”删掉一条 hreflang 链接”来糊弄——审计看不到,但 Google 看得到。 -
重渲后复核。 用 Screaming Frog 重爬(免费版上限 500 个 URL;上面那些 hreflang 报告能直接导出坏行),或把 sitemap 的 URL 粘进 TechnicalSEO.com 的 hreflang 测试工具,一次性核对所有 alternate。再抽查 5 个有代表性的页面(HTML 视图):一篇热门 EN、它的 ZH 对、一篇只有 EN(也需要
x-default和自指)、首页、一个标签 / 索引页。 -
重交 sitemap。 更新后重交 Search Console;用 sitemap index 的话把所有子 sitemap 一起 ping。注意上限:单份 sitemap 最多 50,000 个 URL / 未压缩 50MB。现在已经没有 Search Console 的 hreflang 报告可盯了——改成重跑爬虫,确认错误数趋向 0。
扩到全站前先校准 prompt
别让一份新 prompt 直接上全站。先在一个子目录或标签上跑(30-50 篇),那是模型最准的规模;然后故意 plant 一个 bug——删一条回链、把代码换成 zh——看模型抓不抓得到。漏抓说明 CSV 或清单太薄。每次运行的 TSV 跟修复 commit 存在一起;diff 两个月的 TSV,就能看到哪类 bug 在偷偷回潮。等 prompt 在 plant 的 bug 上做到 100% 之后,再扩到全站。
完成后检查
- 重渲后随机开 3 个页面看
<head>:每页都要有自指 hreflang、所有兄弟 locale 的 alternate、一条x-default。 - 确认 hreflang 的 URL 返回 200 而不是 301 / 404——模型测不了,得靠爬虫或失链脚本。参见用 AI 找失效链接。
- 抽查每页的 canonical。hreflang 指向非 canonical URL 时整个集群会被静默忽略。
把它进流水线
- 把审计 prompt 存进仓库,每个 PR 改 > 10 篇文章就在 CI 里跑一次。
- 把”允许的 locale 代码”放在数据里,不要写死在 prompt 里——加第三语言时改起来方便。
- 把反复出现的失败变成 build 断言:同一个
translationKey坏两次,就在 build 里断言每个 key 必须正好出现在 N 个 locale。这就把 bug 从”审计能抓到”变成”build 直接拒绝上线”。
容易踩的坑
- 该用
zh-CN/zh-Hant却用了zh,或该用en-US却用了en_US。Google 当成不同(或无效)信号。 - 忘
x-default。未匹配 locale 的用户被分到最坏 fallback。 - hreflang 在
<head>但指向非 canonical URL——整个集群被静默忽略。 - 单向 pair:EN 链到 ZH 但 ZH 没链回。集群必须互指,否则 Google 直接丢弃。
- 审了线上 HTML 没审 sitemap。两边必须一致,冲突时两个都被忽略。
- 不看 HTML 就照搬 AI 的”修复”。模型偶尔会建议看起来对但其实错的 locale 代码。
FAQ
- hreflang 错 Google 会惩罚吗? 不会直接惩罚,但流量被分到错的 locale,该市场的 CTR 和转化会跌。Google 也确认过(2025 年 5 月)hreflang 是提示——canonical、内容相似度、索引情况都可能盖过它。
- Search Console 报告没了,现在去哪监控 hreflang? 国际定位报告 2022 年废弃、之后移除。截至 2026 年 6 月,用 Screaming Frog 的 hreflang 报告、TechnicalSEO.com 的免费测试工具(能吃整份 sitemap),或 hreflang.org。
- 是不是每页都要写 hreflang? 每个可索引、有翻译的页面都要:首页、分类页、文章页都算。
- 只有 EN 的页面怎么处理? 自指 EN,加一条
x-default指向自己。不要编一个不存在的 ZH 翻译。 - 模型多大概率会”幻觉”出一个问题? 干净 prompt 下大概 5% 假阳性。永远先核实再改。
- 没有
translationKey也能跑吗? 能。按 slug pair 约定(en/foo↔zh/foo)分组,告诉模型规则即可。