多语言站点最常见的状况是:默认语言被抓得不错,其他语言版本要么压根没在日志里出现过,要么只进来一两个首页。问题往往不在 hreflang 本身,而在于蜘蛛第一次走到站点时,看不太清各语言版本之间的关系。
URL 结构决定蜘蛛的起点
子目录(/en/、/de/)、子域名(en.example.com)、独立域名是三种常见做法。对蜘蛛来说,子目录最省事:同一域名内的链接天然互相传递,发现成本最低;子域名和独立域名则需要在各自站点内单独建立入口,否则很容易出现某个语言版本长期无人问津。
不管选哪种,关键是同一语言始终用同一套结构,别出现 /en/ 和 /english/ 两个目录并存的情况——那等于把一份内容拆成两条抓取路径。
hreflang 是信号,不是通道
hreflang 说明“这个页面有其他语言版本”,但它本身不负责发现。如果 B 语言页面没有任何内链指向,只靠 hreflang 声明,被抓到的概率依然很低。
- 互相引用:A 页面指向 B,B 页面也要指回 A,只写一边基本无效。
- 包含自身:每个页面通常也要写上自己语言版本的 hreflang。
- x-default:指定一个兜底版本,通常是默认语言或英文页面。
- 保持一致:hreflang 中的地址要和该页 canonical、内链地址对得上,否则蜘蛛会犹豫该走哪条。
Sitemap 与内链的分工
Sitemap 适合把各语言版本的完整清单一次性交出去,尤其是不在主导航里的深层页面。可以在 Sitemap 里用 xhtml:link 标注语言版本,也可以按语言拆成多个 Sitemap,各自维护 lastmod。
内链则负责日常发现。主导航的语言入口、页脚的语言链接、文章内的相关版本链接,这几处加起来,基本能保证蜘蛛在抓某一语言时顺手走到其他语言。
语言切换器与自动跳转的坑
不少站点的语言切换器是一个下拉菜单,选项由 JavaScript 拼接,蜘蛛看不到链接。改成普通的 a 标签是最省事的做法。
另一个坑是按 IP 或浏览器语言自动 302 跳转。蜘蛛的抓取节点通常在国外,如果它请求首页时被跳到一个带语言前缀的地址,可能就再也没走到其他版本;更麻烦的是跳转目标不稳定,日志里会看到同一个 URL 反复出现不同落点。
给蜘蛛留一个可以直接访问、不依赖 cookie 和 IP 判断的默认入口,比在跳转逻辑上做优化更有效。
机器翻译与空语言版本
- 整站机翻但未校对,页面之间相似度过高,容易被当作低质量或重复内容处理。
- 某语言只翻译了导航和页脚,正文仍是原文,属于典型的空壳页面。
- 某语言下大量页面返回 200 却没有实质内容,建议先 noindex 或暂时不放进 Sitemap,等内容补齐再放出来。
可以按顺序核对的几件事
- 每种语言是否有独立、稳定的 URL 目录,且没有重复结构。
- hreflang 是否双向、是否包含自身、是否与 canonical 一致。
- 语言切换器是否为可抓取的 a 标签。
- Sitemap 是否覆盖全部语言,lastmod 是否按语言各自维护。
- 是否存在基于 IP 或 cookie 的强制跳转,蜘蛛能否直达默认版本。
- 某语言的页面是否有内链入口,而不只是存在于 Sitemap 里。
做完这几步,看到的不一定是抓取量暴涨,更可能是各语言版本的抓取分布变得均匀,日志里少了那些“只来一次就再没出现”的地址。