多语言或多地区站点最容易出问题的地方,往往不是翻译质量,而是同一套内容在搜索引擎眼里分不清谁是谁。hreflang 就是用来做这件事的:说明同一主题的多个语言、地区版本之间的关系,让合适的人看到合适的版本。
它本身不保证收录,也不保证排名,但配置混乱时,确实会让蜘蛛在几个版本之间反复判断,甚至把流量集中到一个并不合适的语言页上。
自查一:标注是不是双向的
最常见的问题是单向标注。A 页面写了指向 B,B 页面却没有回指 A。hreflang 需要双向确认,只有一边标注时,这组关系通常会被忽略,等于白写。
如果语言版本较多,人工逐条核对容易漏。建议把每个版本的 head 片段导出成表,一行一个 URL,把 hreflang 列对齐检查,一眼就能看出谁缺了回指。
自查二:语言与地区代码写得对不对
- 语言用 ISO 639-1 两字母代码,如 zh、en、ja;地区用 ISO 3166-1 两位代码,如 CN、US、HK。
- 只有语言差异、没有地区差异时,写语言代码就够了,不要为了显得精确随手加一个不存在的地区码。
- 避免同一语言版本同时出现 en 和 en-US 两套指向,容易造成自我冲突。
- 代码大小写不敏感,但书写风格要统一,方便后续维护和排查。
自查三:x-default 有没有落位
x-default 是兜底项:当访客的语言和地区都不在列表里时,展示哪个版本。通常是国际版或语言选择页。缺了它不会立刻报错,但会让首次到访的人和蜘蛛少一个默认落点。
自查四:被指向的 URL 是不是可用的
hreflang 指向的页面应当可抓取、返回正常状态码,并且内容真实存在。常见问题包括:
- 指向 301、302 的中间地址,而不是最终 URL。
- 目标页被 robots.txt 拦截,或被 noindex 标记。
- 目标页需要登录或受地区限制才能打开。
- 页面已经下线,hreflang 却还留着。
这些情况都会让语言关系断掉。定期把 hreflang 里出现的 URL 抽出来,跑一遍状态码与可抓取性检查,比事后靠猜省事得多。
自查五:和 canonical 有没有打架
一句话原则:每个语言版本的 canonical 指向自己。不要把各语言版本的 canonical 全都指到主语言页,那等于告诉搜索引擎其余版本都是重复内容,hreflang 想表达的关系也就被抵消了。
canonical 回答哪一个是正本,hreflang 回答给谁看哪一本,两者角色不同,不要互相顶替。
自查六:标注方式是否统一
常见做法有三种:HTML head 中的 link 标签、HTTP 响应头、XML 站点地图。选其一或组合使用都可以,但同一站点内最好保持一致,避免漏标、错标。如果是纯 JS 动态注入,要确认蜘蛛执行脚本后能拿到完整的 head 内容。
自查七:语言切换器别只做假链接
页面上的语言切换按钮,有的是用 JS 直接跳转,有的用下拉框触发请求。对访客也许没影响,但缺少可抓取的 a 标签链接时,蜘蛛就找不到这些语言版本的真实入口。给每种语言一个可点击的真实链接地址,是最省心的做法。
收尾
多语言站点的 hreflang 不必一次做到完美。先把双向互指、代码规范、canonical 不自相矛盾这三件事理清,就已经能消掉大部分混乱。剩下的细节,可以在每次新增语言版本时顺手补齐。