站点如果只做一种语言,hreflang 基本用不上;但只要出现过按语言或地区分目录、分子域、分域名的情况,它就会变成一个绕不开的细节。写得对,搜索引擎能把不同语言版本看成同一组内容,按用户的语言和地区给出更合适的入口;写错或漏写,轻则两个版本互相竞争,重则用户从搜索结果点进来,看到的是自己看不懂的语言。
先确认:你是否真的需要 hreflang
常见需要处理的场景有这几类:
- 主站中文,另设 /en/ 英文目录;
- 同一种语言面向不同地区,比如简体与繁体,或不同国家的分站;
- 用子域或多域名承载不同语言,例如 cn.example.com 与 www.example.com。
如果只是页面里偶尔出现几段外语引用,不需要为它单独标注。hreflang 用于整页内容语言不同的情况,不是一个“加了总没坏处”的标签。
基本写法与三个关键点
语言、地区与默认版本
标准写法是语言加可选地区,例如 zh-CN、zh-TW、en、en-US。语言用 ISO 639-1 两字母代码,地区用 ISO 3166-1 两位代码,中间用连字符连接。地区只在确实存在地区差异时才加,不必每个版本都补上国家代码。
另外建议为没有命中任何语言或地区的用户指定一个默认页,用 x-default 标注,通常指向语言选择页或主站首页。
最容易出错的几处
- 单向标注:A 指向 B,B 却没有指回 A。hreflang 要求相互声明,缺一边整组都可能失效。
- 指向不可索引的地址:hreflang 里的 URL 被 robots 规则、canonical 或状态码挡在索引之外。
- 和 canonical 打架:canonical 又指向另一个语言版本,等于告诉搜索引擎这几个版本其实是同一页。
- 代码写错:把 zh-CN 写成 zh_CN、zh-cn 或 cn,这类格式问题容易被直接忽略。
- 两套声明互相矛盾:head 里写一套对应关系,站点地图里写另一套,最后谁都读不准。
一次可执行的自查流程
- 列出现有语言和地区版本清单,确认每一页是否属于同一个内容组。
- 抽查若干组页面,逐条核对是否双向标注、URL 是否可直接访问并返回 200。
- 检查语言切换器:跳转后的地址是否就是 hreflang 里写的那个,而不是先跳到首页再让用户自己找。
- 确认 canonical 指向本语言版本的自身地址,而不是跨语言指向。
- 如果使用站点地图标注,核对站点地图中的 URL 与页面 head 中的声明是否一致。
- 改完后记录变更时间,隔一段时间观察抓取与索引情况,确认没有出现新的异常。
如果站点只有一种语言、一个地区版本,硬加 hreflang 只会增加维护成本,并不会带来额外收益。
与其他设置的配合
hreflang 不是独立生效的规则,它依赖几个前提:各语言版本都能被抓取、页面本身有清晰的标题和正文、内部链接能互相找到。若某个语言版本长期没有内容更新,只是机器翻译的空壳,即便标注正确,用户点进来也会很快离开,标注本身也就失去了意义。
同时要注意 URL 结构的一致性。语言目录、参数、结尾斜杠如果各版本规则不统一,排查时很容易漏掉一组对应关系,最好是先统一命名习惯,再补标注。
复查节奏
新增语言版本、调整目录结构、改版换域名时,都应该重新过一遍 hreflang。日常可以按季度抽查,重点看有没有新增页面漏标、旧页面改地址后没有同步,以及语言切换器是否还指向已经下线的旧地址。
把这份清单固定在运营文档里,每次动结构前先看一眼,比事后从日志里找问题要省力得多。