hreflang:27 个首页里只有 10 个声明了,2 个漏了 x-default

hreflang 是唯一能告诉引擎「哪个版本归哪批读者」的标记。2026-08-17 读了 30 个首页:能读到的 27 个里 10 个声明了,其中 2 个没有 x-default。

抓取与收录4 分钟读完2012 次阅读
hreflang:27 个首页里只有 10 个声明了,2 个漏了 x-default

实测 · 2026-08-17 · 30 个站 · 单次快照

样本与口径:与我们做 robots.txt、sitemap 两次调查完全相同的 30 个站。每站首页一次请求,浏览器 User-Agent,2026-08-17。3 个站拒绝了我们,所以下面的分母是 27。这一次抓取同时供本批另外四篇用,同一份数据,各问各的问题。

做出海独立站的人迟早要上多语言,而 hreflang 是唯一能告诉引擎「哪个版本归哪批读者」的标记。27 个能读到的首页里只有 10 个声明了它,其中 8 个带 x-default。真正扎眼的不是那 17 个没写的——它们大多本来就只有一种语言——而是 Notion:报了 22 个语种,却没有 x-default

谁声明了,声明了多少个

数量差得很远。Stripe 首页一口气声明 89 个,BBC 只有 2 个。这个数字说的是站的规模,不是实现质量。

站点声明数x-default
stripe.com89
shopify.com66
figma.com34
notion.com22没有
slack.com16
cloudflare.com10
nytimes.com9
github.com8
webflow.com4
bbc.com2没有

怎么测的

提取规则在抓取前写死,看到结果之后一条没改。

  1. https://{域名}/ 发一次请求,跟随重定向,用桌面浏览器的 User-Agent。
  2. 从返回的 HTML 里取出每一个同时带 hreflang 属性的 <link rel="alternate">
  3. 数总数、数去重后的值,并记录里面有没有 x-default

我们读的是服务器交付的那份 HTML。前端脚本后注入的标签这个方法看不见——而不执行页面的爬虫同样看不见。

漏掉 x-default 是最贵的那种漏

x-default 告诉引擎:当读者不属于任何一个已声明的语种时,该给他哪一版。没有这一行,落在声明范围之外的读者拿到哪一版由引擎决定,你说了不算。

Notion 值得单看。22 个语种是认真做过本地化的规模,偏偏少了那一行管「其余所有人」的声明。BBC 只报 2 个,同一个洞,波及面小得多。

🔴 用 IP 跳转代替 hreflang,是出海站最容易踩的那个坑

这一节既是本次测量的局限,也是一个结论。我们的出口 IP 归属日本大阪,于是有两个站在返回 HTML 之前就先把我们送走了。

请求的地址实际拿到的
stripe.comstripe.com/jp
slack.comslack.com/intl/ja-jp/

所以这两家的 hreflang 是从日语页上数出来的,不是美国读者看到的那一页。它们的 canonical 也指向日语地址——对我们拿到的那个页面来说这是对的,只是那不是我们要的页面。

对做出海的人这条尤其要紧:国内建站习惯按地区跳转,但爬虫是从固定国家出口的,主流 AI 引擎公布的爬虫 IP 段大多落在美国。你用 IP 跳转做地区分发,爬虫这辈子只会看到其中一个版本,另外几个版本它根本不知道存在。hreflang 和 IP 跳转是两套机制在解同一个问题,只有前者是说给引擎听的。

这次没查的

我们没有验证互相回指。一组 hreflang 只有在它点名的每个页面都反过来指回整组时才算有效,光验 Stripe 一家就要再抓 89 个地址。我们每站只抓了一页,所以只能说这 10 组声明存在,说不了它们自不自洽。

引擎拿它们做了什么,我们也不知道。声明是输入,最后展示哪一版是站外观察不到的决定。

你该怎么查自己的 hreflang

三步,按性价比排。

  • 声明了不止一个语种,就确认 x-default 在。一行的事,省掉一次猜。
  • 用 curl 取一次自己的首页,数一下 alternate 有几个。做了多语言却数出 0,说明标签是前端注入的,爬虫看不到。
  • 别拿 IP 跳转代替 hreflang。它把每个爬虫都锁死在它出口国那一版上。
  • 别声明自己并没有提供的语种。点名一个 404 的地址,比不声明还糟。

如果你还在决定先上哪几个语种,那是另一个问题——关键词挖掘那篇讲了为什么每个语种要各选各的词,而不是把英文词翻过去。同一批 27 个首页在结构化数据上的表现,写在多数首页根本没有结构化数据里。把这些检查在整站范围内做完、而不是一页一页手动查,正是 QueryWin 在做的事。

常见问题

hreflang 会影响 AI 答案吗?

这次没测,所以不下结论。hreflang 可验证的作用是告诉搜索引擎哪个语言版本属于哪批读者。AI 引擎是读这个标签、还是直接从正文判断语言,站在外面观察不到。

声明 89 个是不是太多了?

你真有 89 个就不多。长清单的代价是页面体积,以及维护——每一条都得一直活着。Stripe 那份加载正常。

只有一种语言要不要加?

不用。这里 27 个站有 17 个一条没声明,多数就是单语言站。这个标签是用来消歧的,没有歧义就没有它的事。

标签放哪儿?

放在这一组里每个页面的 HTML head 里,或者写进 sitemap。两种都有文档;放 head 的好处是一条 curl 就能验。

hreflang:27 个首页里只有 10 个声明了,2 个漏了 x-default