GEO-078·第 07 期·技术底座·78 / 132
多语言 URL 与 hreflang 的正确姿势
语言子目录、子域名、ccTLD 差的不是排名,而是谁还能维护一张覆盖全部语言版本的 hreflang 矩阵。本文给出结构取舍表、五个高频错误的识别法、一条能进 CI 的生成与校验流程,以及两套系统各写一半标签时的修法。
本期主线跨市场:多语言、本地化与区域语义
周一的需求评审上,做家居照明的出海团队要上日本站。市场负责人问的是“用子域名还是子目录、看起来像不像本地品牌”,工程负责人问的是“下个月还要加法语,这一堆语言标签谁来维护”。半小时没有结论,因为两个人算的不是同一笔账。
多语言站最稳的结构是语言子目录、自引用 canonical,再加一张由同一源头生成的完整 alternates;URL 形状可以让步,hreflang 矩阵一旦分家,剩下的标签都只是装饰。
三种 URL 结构,选的是运维成本
URL 结构是一道运维题,不是 SEO 分数题:选那个能让所有语言版本共用一份配置的结构。
hreflang 的正确性依赖一个前提——你能同时看到全部语言版本。ccTLD 把版本拆给不同域名,子域名拆给不同 host,子目录留在一个仓库里。谁能一次拿到全量清单,谁的标签就不容易漏。
| 结构 | 好处 | 代价 | 什么时候选 |
|---|---|---|---|
语言子目录 /de/ | 一个仓库、一次部署,矩阵只有一处生成 | 需要 i18n 路由,缓存与静态资源按前缀分开 | 一个团队维护 3–6 个语言市场,默认选它 |
子域名 de.brand.com | 可以交给不同团队、不同技术栈 | 每个 host 是独立抓取单元,日志、证书、robots 各配一套 | 历史遗留,或前端确实做不了语言路由 |
ccTLD brand.de | 本地主体、支付与法务最顺,地区信号最强 | 域名数量乘以每个域名的验证与运维,矩阵散在 N 处 | 本地公司、税务或平台资质要求本地域名 |
新站的默认答案是子目录。选 ccTLD 的理由应该是法务或支付,不是“看起来更本地”;选子域名的理由应该是组织现实,不是技术偏好。先把做哪个市场定下来(市场进入的六个变量),结构才谈得下去。
hreflang 是一张矩阵,不是一个标签
标签本身不难写,难的是让全组标签来自同一个源头。
规则是硬的:一个语言簇里,每个成员都要列出包括自己在内的所有成员。少一条,引擎就无法确认对应关系,退回默认版本或按页面语言去猜。AI 检索侧更简单,它取到一个 URL,就用那个 URL 的语言组织答案;德语页不在簇里,德语提问就拿英语页回答。
所以矩阵的键是“页面身份”,不是 URL:同一个 SKU、同一个类目算一行,语言与地区算列。行和列定下来,标签才有地方生成,也才知道哪些格子是空的。
x-default 单独说一句。它标的是“买家语言不在列表里时给哪一版”,可以指向语言选择页。常见误用是把它设成最大的市场,想当成默认推荐位;那不是兜底,是把兜底当广告位。
五个错误,校验工具只查语法
多数校验工具查的是标签语法与成对关系,查不了目标返回什么、页面上有没有入口、各语言的代码是不是同一口径;所以“0 报错”只是及格线。
| 错误 | 长什么样 | AI 侧结果 |
|---|---|---|
| 不自引用 | 每页只列其他语言 | 该版本被排除在簇外 |
| 单边指向 | A 列了 B,B 没列 A | 标注被丢弃,对应关系不成立 |
| 指向跳转或 404 | 迁移后标签没跟着改 | 簇里有一条断链,对应关系不成立 |
| 代码不统一 | 一处 zh-CN、一处 zh-Hans,大小写混用 | 两个版本被当成不同语言 |
| 只有标签没有入口 | 标签齐全,但没有静态链接,sitemap 里也没有 | 爬虫找不到,标签等于没写 |
前四个是配置错误,改标签就能修;第五个是结构错误,只能补链接和 sitemap 条目。它也是最常见的一个,因为标签在源码里,入口却由模板和导航决定,两边常常不是同一个人负责。通路怎么补,多语言抓取一致性里拆得更细。
五步把它做成流水线
别在每套模板里手工写 hreflang;从矩阵生成标签,再加一道会失败的检查。
- 定 page key:同一商品、同一类目在所有语言下共用一个键。工程负责,标准是矩阵里没有无主 URL。
- 定结构并写进架构文档:哪个前缀、哪个 host 归哪个团队。工程与增长共同签字,标准是加第四个语言时不用再开会。
- 从矩阵生成三处输出:页面 head、sitemap、语言切换器的静态链接。工程负责,抽 20 条三处必须完全一致。
- 在 CI 里校验五项:自引用、双向闭合、目标返回 200、代码合法、
x-default唯一。工程负责,标准是故意改坏一条,流水线必须失败。 - 上线后抽样复测:用该语言提问,看引用落地页的语言前缀。增长负责,口径沿用AI 可见度基线。
第 4 步是唯一能防止回退的环节。没有 CI 保护的标签,三个月后一定有人改坏,而且改坏时没人会发现。
示例:两个系统各写一半
示例:一个做厨房小家电的品牌(假设场景),德语、法语站在主站仓库的 /de/、/fr/,日本站由代运营放在 jp.brand.com。两边标签都由各自的模板生成:主站不知道子域存在,子域只列了自己和英语页。两套校验工具各查一遍,都是 0 报错。日语提问的引用落地页却常常是英语页,法语页倒是出现过几次——差别不在内容质量,在于法语页恰好和英语页在同一个模板里,双向闭合。
修法有两条。彻底的一条是把日本站迁到 /ja/,旧 URL 301 到新 URL,hreflang 与 sitemap 同批更新;止血的一条是让两边从同一张导出的矩阵生成标签,把跨 host 的成员补齐。前者动结构,后者动流程,可以并行。验收只看一件事:抽 20 个 URL,页面 head、sitemap、语言切换器三处指向的 alternates 完全一致,且每个目标返回 200。
边界:什么时候别动 URL
只有一个语言市场时,不要提前铺语言页,也不要写 hreflang。
两个语言版本内容本来就不同——不同 SKU、不同价格、不同卖点——它们不是同一页的变体,不该进同一个簇。先判断“是不是同一页”,再谈标签。
官网结构管不到平台内。在 Amazon、Shopee 成交的品类,语言与地区由平台处理,官网的 URL 形状与那些答案无关。
站点连抓取都没过时,hreflang 修得再整齐也没有页面可给,先修可访问性,再谈结构。
用 ccTLD 的老站、历史结构改不动时,别为了统一做全站迁移。把 canonical 与 sitemap 对齐,URL 形状留在原地。
别把语言切换器当 hreflang。切换器服务的是已经到站的人,表达的是偏好;它不告诉引擎这些页面互为版本,也不解决抓取。
这个月先做一件事:抽 20 个非默认语言的 URL,列三列——该页列了哪些 alternates、sitemap 里有没有这一条、页面上能不能点到静态链接。三列对不上的那一行,就是本月要修的第一批。这条线归在技术底座主题页,抓不到页面时先看AI 爬虫能不能进来。