多语言站只做翻译没用,
hreflang 才决定谁被收录。
英文版、西语版、葡语版内容一样只是语言不同,谷歌很可能只留一个、其余当重复页。hreflang 就是告诉它「这几页是同一份内容的不同语言版本,别互相打架」。
做了英文版、又加了两个语言版本,内容一字不差只是换了个语言,结果谷歌只收了一个,其余的搜都搜不到。这不是翻译质量问题,是它不知道这几页是同一份内容的不同语言版本,于是按重复内容处理,只留一个。hreflang 就是用来回答这个问题的。
只是翻译了一遍,为什么会被判成重复页?
搜索引擎判断重复内容,看的是内容相似度,不是语言标签。两个页面结构一样、段落一一对应、只是文字不同,在算法眼里相似度极高。如果站点自己不说清「这是同一份内容的不同语言版」,谷歌会挑一个当代表,其余的降权或者干脆不收。
很多多语言站就是死在这一步:页面底下加了个语言切换下拉,看起来挺完整,但 head 里什么都没有。搜索引擎爬到切换菜单,也不知道那几个页面是什么关系。
hreflang 说的是什么
它不是给人看的,是给搜索引擎看的声明。官方原话:
“Use hreflang to tell Google about the variations of your content, so that we can understand that these pages are localized variations of the same content.” “Google doesn't use hreflang or the HTML lang attribute to detect the language of a page; instead, we use algorithms to determine the language.”
两句都很关键。第一句说 hreflang 的用途:告诉谷歌这些页是同一内容的本地化版本。第二句是很多人搞反的地方——hreflang 不负责「告诉谷歌这页是什么语言」,语言是算法自己判断的;hreflang 只负责声明「这几个页面是一组」。
Google 搜索中心 · 本地化版本与 hreflang
写成 HTML 就是一行一个:
<link rel="alternate" hreflang="en" href="https://你的域名/en/"> <link rel="alternate" hreflang="es" href="https://你的域名/es/"> <link rel="alternate" hreflang="pt" href="https://你的域名/pt/"> <link rel="alternate" hreflang="x-default" href="https://你的域名/">
关键点:每一页都要写上整组,包括它自己。英文页里要有英文自己那一行,西语页里也要有英文那一行。这一组叫「双向互指」。
返回链接:最常见的错,也是代价最大的错
同一个页面里,官方把这一条单独列进了「常见错误」:
“Missing return links: If page X links to page Y, page Y must link back to page X. If this is not the case for all pages that use hreflang annotations, those annotations may be ignored or not interpreted correctly.”
如果 A 页指向 B 页,B 页就必须指回 A 页。只要有一页没做到,整组标注就可能被忽略——注意是「整组」,不是「那一页」。所以这种错误最坑:看起来只错了一处,实际全站的多语言声明作废。
Google 搜索中心 · 排查常见错误
实操上最容易漏的是「后来加的语言版本」。原本只做英文和西语,两组互相指好了;半年后加了葡语,只在新页面里写了三行,忘了回英文和西语页补。于是整组失效,而你在页面上看不出任何异常。
解决办法只有一个:把 hreflang 当配置生成,不要手写。站点有几个语言、每个语言的路径是什么,写在一处,每页渲染时统一输出全组。手写的多语言站,加第三个语种时几乎一定会漏。
子目录还是子域名?先定这个
| 方案 | 长这样 | 适合谁 |
|---|---|---|
| 子目录 | 你的域名/es/ | 多数外贸站。权重集中在一个域名上,配置简单 |
| 子域名 | es.你的域名 | 各语言由不同团队独立运营,或要分服务器部署 |
| 独立域名 | example.es | 本地化程度极深、要做当地品牌,成本最高 |
| 参数 | 你的域名/?lang=es | 不建议。参数容易被当成同一页的不同变体 |
选子目录的理由很实在:所有语言的权重都累积在同一个域名上,新语言版本能借到主站的信任度;部署上就是不同目录,没有额外的 DNS 和证书要管。代价是换语言时 URL 结构要一次定死,后期再改就是全站 301。
选子域名的理由通常是组织问题而不是技术问题——比如各市场有自己的运营团队,要各自的后台和发布流程。如果只是「觉得这样比较专业」,没必要。
canonical 指错了会怎样?
这是第二个高频错误。多语言站里,每页的 canonical 必须指向它自己,而不是指向英文母版。
原因:canonical 的语义是「这一页的代表版本是那个 URL」。你在西语页上把 canonical 写成英文页,等于告诉谷歌「这页不用收了,收英文那页就行」——西语版直接被自己否掉。hreflang 和 canonical 会打架,最后通常是 canonical 赢。
正确的组合是:canonical 自指 + hreflang 互指。前者说「我是独立页面」,后者说「我和那几页是一组」。两件事不冲突。
x-default 那一行别省
x-default 指定的是「没有匹配到任何语言时,把人送到哪」。通常是英文版,或者一个语言选择页。
省掉它的后果是:一个说法语的采购点进来,谷歌没有合适的版本可给,可能给一个它认为最接近的,也可能是你的西语版。有 x-default 至少能保证兜底到一个你自己挑的页面。
还有一个细节:语言代码只写语言、或者语言加地区,两种都合法。写 en 是「所有英语用户」,写 en-GB 是「英国英语用户」。如果你的英文版内容对英美通用,写 en 就够;硬拆成 en-US / en-GB 而内容其实一样,反而多出两组需要维护的互指关系。
另外,有些代码是保留给别的用途的,填了不生效——Google 明确说过 EU、UN、UK 这类在 hreflang 里不起作用。国家代码用 ISO 3166-1 两位,英国是 GB 不是 UK。
上线后怎么确认 hreflang 真的生效了?
三步,都不难:
- 看源代码。随便打开一个语言版本的页面,肉眼数 head 里有几行 hreflang——应该等于你支持的语种数加一行 x-default。
- 抽查互指。从英文页复制一个语言版本的地址,打开它,看它的 hreflang 里有没有英文那一行。漏了就是整组失效。
- 在 Search Console 里分版本看。GSC 支持按目录或子域过滤,把
/es/单独筛出来看收录和点击。如果一个语言版本长期零曝光,先怀疑 hreflang,再怀疑内容。
顺便把 sitemap 也用上:Google 支持在 sitemap 里给每个 URL 标 xhtml:link,一次声明全组语言版本。页面 head 里写一遍、sitemap 里写一遍,两边不冲突,而且 sitemap 那份能覆盖到 head 可能渲染不全的情况。
多语言不只是 SEO 问题
说回生意。做几个语种,不该由「觉得哪个市场大」决定,该由「询盘从哪来」决定。翻一下过去一年的询盘记录,按国家分组,看前三个是哪——这三个的语言版本值得做,第四个以后可以等。
还有个常被忽略的成本:语言版本不是翻译完就结束,而是要持续维护。产品参数改了、价格调了、新案例上线,每个语种都得同步一次。三个语种就是三倍的内容工作量,这一点在决定「做几个」的时候往往被低估。
我们怎么处理
我们的做法是把语言当成一份配置:支持哪几个语种、各自的路径前缀写在一处,构建时每页自动输出全组 hreflang,包括 x-default。加语种是加一行配置,不用去翻每一页的 head。
canonical 也由同一份配置生成,永远自指本页,不存在「顺手复制粘贴指错了」的可能。这两件事一旦交给生成器,那两个高频错误就从根上没有了。
内容层面要说清:我们不代做翻译。翻译的准确性得由懂产品的人把关,机器翻出来的参数表错一个单位,客户就不会再问第二次。我们做的是把结构、路径、标注这些技术活做对,让翻译出来的内容能被正确地收录和区分。
正在做多语言、或者做完了发现只有英文版有流量,把网址发我。我看一眼 head 和 sitemap,就能告诉你标注是漏了、还是指错了。
资料来源
- Google 搜索中心 · 本地化版本与 hreflang(互指要求、x-default、保留代码说明)
- Google 搜索中心 · 使用 canonical 合并重复网址
- Google 搜索中心 · 构建并提交 sitemap(xhtml:link 声明语言版本)