hreflang 的四类高发错误是:A 指向 B 但 B 没有回指 A、标记指向了不存在或不收录的页面、语言与地区代码用错或含糊、以及和 canonical 互相打架。自查方法很直接:把每个语言版本列成表格,逐一核对回指关系、目标页状态码与代码取值。
核心要点速览
- hreflang 出错时通常没有任何报错提示,只是这组标注在后台静默失效。
- 多语言标注必须是双向的,只有单向声明的一方等于没有声明。
- 被标注的页面必须可访问且可被索引,否则该条标注没有意义。
- 语言码与地区码是两个维度,混用会让搜索引擎无法判断受众。
- hreflang 与 canonical 的指向不一致时,这组多语言标注通常不会生效,需要逐一核对。
多语言站点做到一定程度就会遇到 hreflang。它不像 404 那样会立刻暴露问题,写错了页面照样打开、照样能被访问,只是搜索引擎不再按你期望的方式区分各个语言版本。
这也是它麻烦的地方:错误没有反馈。加上语言版本一多,标注数量成倍增长,人工核对的成本很高,很多站点上线之后就再也没有回头检查过。
下面按出现频率排出四类错误,每一类都说明成因与自查方法。这套检查不需要特殊工具,把语言版本列成一张表就能完成大部分核对。
需要先明确一点:hreflang 解决的是「同一个内容有多个语言或地区版本时,该给哪位用户看哪一版」,它不解决内容质量与收录本身的问题。如果某个语言版本压根没被收录,先处理收录,再回头看标注。
一、四类错误速查
| 错误类型 | 典型表现 | 自查方法 |
|---|---|---|
| 缺少双向回指 | A 声明了 B,B 没有声明 A | 把各语言版本的标注互相比对,检查是否成对 |
| 指向不存在或不收录的页面 | 标注里的地址返回 404、301 或被禁止索引 | 逐个访问标注中的地址,确认状态码与索引状态 |
| 语言地区码用错 | 只写语言不写地区,或地区与内容不符 | 核对每个版本的默认语言、货币与配送范围 |
| 与 canonical 冲突 | canonical 指向另一语言版本 | 检查每页 canonical 的值是否指向自身 |
这四类里,前三类靠人工核对就能发现大半,第四类需要单独看每个页面的 canonical 取值。核对频率建议与内容更新挂钩,而不是上线时做一次就算完。[1]
二、逐类说明与处理方法
光知道有哪几类错误还不够,处理时真正费时间的是判断某个具体标注到底算不算错。下面逐类补充判断标准与常见误判。
错误一:只做了单向声明
假设英文版页面声明了中文版地址,但中文版页面没有反向声明英文版,这组标注就是无效的。搜索引擎在理解多语言关系时依赖互相印证,单向声明无法构成一组完整的对应关系。
自查方式是做一张二维表:行是语言版本,列也是语言版本,把每个页面上实际声明的地址填进去,然后检查表格是否对称。不对称的格子就是问题所在。
错误二:标注指向了打不开或不收录的页面
标注里的地址必须是真实存在、可正常访问、并且允许被收录的页面。如果它返回错误状态、被重定向到别的地址,或者页面本身带了禁止索引的设置,这条标注就没有实际意义。
这种情况在站点改版后尤其常见:栏目结构调整了,旧的语言版本地址失效,但另一侧的标注还停留在旧地址上。所以每次改版之后,都应该把标注地址整体跑一遍。[2]
错误三:语言码与地区码混用或含糊
语言和地区是两个独立维度:语言描述内容用什么文字,地区描述面向哪个市场。只写语言,适用于所有使用该语言的地区;写语言加地区,则用于区分同一语言下的不同市场,比如同一种语言在不同国家使用的版本。
常见的误用是把地区当成语言来写,或者给一个明显只服务单一市场的页面写了过宽的语言标注。判断标准回到内容本身:页面上的货币、配送范围、联系方式指向哪里,标注就应该与之匹配。
错误四:和 canonical 互相冲突
多语言站点里最容易踩的一个坑,是在英文页面的 canonical 里填了中文版地址,理由是「内容基本一致」。这样一来,规范地址与多语言标注表达了两个互相矛盾的信号:一边说这是我的另一语言版本,一边说这个页面应该以那一版为准。
稳妥的做法是让每个语言版本的规范地址指向它自己,多语言关系交给标注去表达。两个机制各管一件事,不要混用。检查时逐页看 canonical 的取值,确认它指向的是当前页面本身。[3]
补充:标注的三种放置方式要保持一致
多语言标注可以通过页面头部标签、响应头或者站点地图来声明。三种方式都被支持,但同一站点混用多种方式、彼此内容不一致时,排查难度会明显上升。
更现实的做法是选定一种作为主方式,把它做成模板自动输出,避免人工在每个页面里手工维护。人工维护的标注是错误率最高的来源,尤其是在语言版本超过三四种之后。
三、一份可以照着做的自查流程
- 列出全部语言与地区版本把站点的语言版本、地区版本与各自对应的地址整理成一张清单,作为核对的底表。
- 检查成对关系逐个页面读出它声明的其他版本地址,验证对方页面是否也声明了回来,找出所有单向声明。
- 验证每个地址的状态逐一访问标注中的地址,确认返回正常状态、没有被重定向、页面允许被收录。
- 核对编码与规范地址对照页面实际服务的市场检查语言地区码取值,并确认每页的规范地址指向自身。[4]
小结:hreflang 的问题几乎都能靠一张对照表发现。把版本列全、把地址核对一遍、把成对关系检查一次,比事后猜测哪一条没生效要省事得多。
四、多语言站点的常见组织方式
标注之外,站点结构本身也会影响多语言版本的管理成本。常见的三种做法各有取舍,选择时主要看语言数量与后续维护的人手。
无论选哪种结构,都建议把多语言关系做成模板的一部分自动输出。人工维护几十上百个页面的标注,出错几乎是必然的。如果站点语言版本较多、内部又没有专人负责技术 SEO,把多语言结构规划与日常维护一起交给专业团队处理会更稳妥,像 光算科技 这类承接俄语等多语言站点建设的服务,值得先确认的是地址结构方案、标注的输出方式以及改版后的迁移安排,而不是先看展示案例的视觉风格。
子目录:最常见也最好维护
把不同语言放在同一个域名下的不同目录里,结构清晰、权重集中、标注关系也容易维护。缺点是各语言版本共用同一套服务器与配置,地区隔离程度有限。
对多数中小规模站点来说,子目录是默认选项。它不需要额外的域名管理成本,后续调整语言数量也更灵活。
独立域名与子域名
独立域名或子域名在地区运营、服务器就近部署、独立品牌策略上更灵活,代价是权重分散、证书与运维成本上升,语言之间的对应关系也更难维护。
如果采用这种结构,多语言标注就更不能手工维护。建议把对应关系集中配置在一处,由模板统一输出,避免各站各自为政。
内容本地化与翻译的区别
多语言站点还有一个与标注无关但同样重要的层面:内容是否真的做了本地化。直接翻译的页面在词汇、案例、支付方式、计量单位上常常与目标市场脱节,用户停留时间与转化都会受影响。
标注解决的是「给谁看哪一版」,本地化解决的是「那一版好不好用」。两者都做到位,多语言站点的投入才算完整。
参考来源
- Google:多语言与多地区页面(hreflang,英文) —— Google 官方关于本地化版本页面的文档,说明 hreflang 等标注如何区分多语言与多地区页面,是多语言站点 SEO 的官方依据。
- MDN:HTML link 元素(简体中文) —— MDN 中文技术参考,说明 link 元素及 rel 的 canonical、alternate、hreflang 等用法,可作为中文文章中规范标注的技术依据。
- Google 搜索中心:SEO 新手指南(英文) —— Google 官方 SEO 入门文档,说明搜索引擎如何发现、抓取与呈现网页,以及站点结构与内容优化的基本要求,可作为谷歌官方立场的引用来源。
- Google Search Console 帮助:网址检查工具(简体中文) —— Search Console 官方中文帮助文档,说明如何用网址检查工具查看单个网址的抓取与索引状态,适合在讲收录排查时引用。
常见问题
hreflang 写错了会有什么明显后果?
通常不会有明显报错,页面本身照常打开,问题体现在搜索结果的呈现上:本该展示给某个地区用户的语言版本没有出现,或者多个语言版本互相竞争同一个展示位。这类问题往往要等到流量结构异常时才会被发现,所以定期主动自查比等出问题更有效。
只有两种语言也需要写 hreflang 吗?
需要。语言版本数量多少不影响标注的必要性,只要同一内容存在多个语言或地区版本,就有区分受众的需求。语言版本少的情况下维护成本很低,把两个页面的标注做成模板自动输出即可,反而更不容易出错。
多语言标注可以不写回指吗?
不建议。多语言关系依赖互相印证,只有单向声明时,搜索引擎无法确认这一组对应关系是否成立。实际表现就是标注时灵时不灵,而这类问题恰恰最难排查,因为从单个页面上看没有任何异常。
标注地址和规范地址必须是同一个吗?
这是两个不同的机制:多语言标注回答「同一内容的其他语言版本在哪里」,规范地址回答「这组高度相似的页面里哪一个应该被优先收录」。每个语言版本的规范地址应指向自身,再由标注表达彼此的语言关系,两者不要混用。
站点改版后需要重新核对 hreflang 吗?
需要,而且是改版后必做的检查项之一。栏目结构调整、地址规则变更、页面合并都会让原有的标注失效,而这类失效不会有任何提示。建议把标注核对写进改版上线清单,与检查错误页面、重定向链一起完成。