多語言站点最常见的状况是:預設語言被抓得不错,其他語言版本要么压根没在日誌里出現過,要么只進来一两個首頁。問题往往不在 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 里。
做完這几步,看到的不一定是抓取量暴涨,更可能是各語言版本的抓取分布變得均匀,日誌里少了那些“只来一次就再没出現”的地址。