先分清“语言版本”和“语言入口”
多语言站点常见的日志形态是:默认语言一天被访问几百次,/en/、/ja/ 这类目录几天才出现一次。多数时候不是蜘蛛对语种有偏好,而是入口不可见——语言切换器是一个 button,或者靠 JS 拼出 URL 再跳转,机器拿不到可点的链接,自然走不到那个语言版本。
切换器要用真实链接
语言切换写成一排普通的 a 标签,指向各语言首页或当前页面对应的语言版本;每个语言页面都能链到其他语言版本,形成互链;切换器出现在 HTML 里,不要依赖异步插入。这三条做到,多语言抓取的问题会少掉一大半。
语言目录怎么摆:子目录、子域名还是参数
- 子目录(example.com/en/):权重集中,内链传递直观,是多语言站点里比较常见的选择。
- 子域名(en.example.com):抓取上更接近独立站点,需要各自准备入口和 Sitemap,跨站内链的传递会弱一些。
- 参数(example.com/?lang=en):容易和其他参数搅在一起,规范化处理更麻烦。
- 独立域名:运营成本高,抓取上也各管各的,适合本地化程度很深的场景。
用哪种形式没有标准答案,关键在一致性:每种语言版本都要有一个稳定、唯一、不带多余参数的 URL,并且这个 URL 从入口到详情页一路都能点得到。前缀一变、尾斜杠一变、大小写一变,日志里就会拆成好几份,核对起来非常费劲。
hreflang 不是抓取指令
hreflang 表达的是几个 URL 之间的语言与地区关系,它影响展示和归并判断,但不会替代入口链接。常见的写法问题有:
- 只写单向:A 指向 B,B 没有指回 A,双向缺失容易被忽略。
- 语言代码写错,或者在 zh-CN 与 zh-Hans 之间混用,地区代码本身不存在。
- 指到的地址是 404、跳转目标,或者又被 canonical 指到了另一个 URL。
- 缺少 x-default,默认语言版本没有被标注。
- 试图用 hreflang 去纠正 canonical,两者指向不一致时信号互相抵消。
比较稳妥的做法是:每个语言页面在 head 里列全所有语言版本(包含自身)加 x-default;改版换目录后回头核对一遍,别留下指向旧路径的标注。
让每种语言都有可走的路径
- 导航和页脚放语言入口,链接分别指向各语言首页,而不是一个切换按钮。
- 每个语言版本都有自己的栏目页和列表页,不要只翻译首页,栏目页仍停留在默认语言。
- 语言内部做好内链:相关阅读、上下篇、标签页,让蜘蛛顺着链接能走进详情层。
- 面包屑带上语言前缀,逐级可点,层级关系更清楚。
Sitemap 按语言分片,核对更方便
- 每个语言一个 Sitemap,只放该语言的 URL,避免一个文件里混着几十个语种。
- 再用 Sitemap index 汇总,提交后可以按语言分别观察抓取情况。
- Sitemap 里的 hreflang 标注(xhtml:link)可以和页面上的标注互相印证,但不要只依赖它。
- 内容更新频繁时,分片也方便单独调整 lastmod,不用整包重写。
怎么核对:从日志看每种语言的抓取
- 按路径前缀(/en/、/ja/)分组统计蜘蛛访问量,看是不是只有默认语言有量。
- 看被抓 URL 的来源:如果其他语种页面的日志里几乎没有站内来源,说明内链入口太弱,只有 Sitemap 在推。
- 确认语言切换器是不是唯一入口——它一旦是 JS 按钮,等于没有入口。
- 检查默认语言的 canonical 是否覆盖到了其他语言版本,导致别的语种被抓却不被当作独立页面。
- 看状态码:语言目录 302 回默认语言、参数版本反复 301 跳转,都会让抓取分散在无效地址上。
多语言站点的抓取问题,多数不是“机器不懂语言”,而是“找不到可点的路”。先把链接做出来,再谈各种标注信号。
落地顺序可以这样安排:先保证每种语言有独立且可点的入口目录;再补齐导航、面包屑和列表页内链;然后处理 hreflang 与 canonical 的一致性;最后用 Sitemap 分片和日志分组做核对。抓取是逐步推进的过程,改完之后按路径前缀看趋势,比只盯总量更有参考价值。