多語言站点最常见的状况是:預設語言版本抓得挺勤,其他語言版本却長期停在“已發現未抓取”。排查之後往往發現不是服務器問题,而是蜘蛛從預設語言頁出發後,找不到一條稳定的 HTML 路径走到其他語言版本。hreflang 本身不创造入口,它只在你已经把各版本都暴露出来的前提下,帮助搜尋引擎理解它們之間的關系。
蜘蛛發現各語言版本的三條路
實际能用的入口基本就三種,條件允许时最好都配上,而不是只靠其中一種。
- 頁面内鏈:語言切換器用真正的 a 标簽,每個語言對應一個可直接訪問的 URL,不要用按钮加 onclick 拼出来。
- Sitemap:可以放在同一個 Sitemap 里,也可以按語言分片;每個語言的 URL 都要能被獨立抓取,不要只在預設語言 Sitemap 里寫几行 hreflang 注释。
- 站点地图索引:語言多、URL 量大时,用索引文件把各語言的 Sitemap 列清楚,方便蜘蛛按分片抓取。
語言切換器的寫法决定了蜘蛛能走多遠
下拉菜單加 JS 跳轉是最常见的坑。蜘蛛执行脚本的能力和时机都不确定,很多时候它只看到一個不能点的 select,或者只能抓到預設語言。更麻烦的是用 cookie 或 IP 自動 301 到預設語言:蜘蛛從 /en/ 進来被跳到根路径,反复几次之後,它可能就不再尝试這個分支。
如果确實需要自動跳轉,至少保證每個語言 URL 直接返回 200 和對應語言内容,跳轉只發生在用戶第一次訪問根路径时。
語言切換器最好在頁头和頁脚各放一份,让各個語言版本互相連結形成閉环,而不是只從預設語言單向往外指。
目錄结构怎么選更利于抓取
- 子目錄 /en/、/ja/:抓取路径集中在一個域名下,内鏈和 Sitemap 都好管理,多數站点可以優先考虑。
- 子域名 en.example.com:分隔更彻底,但需要單獨维護抓取入口和 Sitemap,容易出現一邊抓得勤、一邊没人管的情况。
- 參數 ?lang=en:最容易产生大量近似 URL,需要在 canonical、hreflang 和站内連結上保持一致,否則重复版本會持續消耗抓取资源。
hreflang 的常见寫法問题
- 只寫單向:A 頁寫了自己和 B 頁,B 頁没有寫回来,關系不閉环,判断會打折扣。
- 指向不能訪問的 URL:hreflang 目标返回 302、404 或被 robots 屏蔽,标注等于白寫。
- 缺少 x-default:没有預設版本声明时,語言選擇只能交给搜尋引擎自己猜。
- 代碼不規范:寫成 en-UK 之類的随意组合,或者把地区碼当成語言碼使用。
- 只在 Sitemap 寫一半:頁面和 Sitemap 中的 hreflang 不一致,两邊容易互相矛盾。
让每個語言版本都有回程
抓取路径不只要進得去,還要出得来。英文頁的面包屑如果指回中文首頁,而中文首頁又没有明顯指向英文頁的連結,蜘蛛很容易在這個分支上打轉。每個語言版本最好有獨立的導航和面包屑,至少在頁脚保留一组指向其他語言版本的連結。
用日誌和 Sitemap 做交叉检查
想確認問题出在哪,可以先做三件事:
- 看服務器日誌里各語言版本的抓取次數比例,是否只有預設語言在被抓。
- 抽查 Sitemap 中的語言 URL,確認返回 200、内容語言正确、canonical 指向自身。
- 用抓取工具在不带脚本的情况下跑一遍語言切換器,看能不能点到其他語言版本。
顺序上,先把每個語言版本的 HTML 入口和回程連結做扎實,再补 hreflang 與 Sitemap 分片。入口不通,關系标注再規范,也不會凭空带来額外抓取。