多語言站点的URL發現,麻烦往往不出在蜘蛛身上,而出在站点自己没把“谁是主、谁是副本”讲清楚。同一篇内容在中英文两套地址下都能打開,蜘蛛遇到多個候選入口时通常只會挑其中一個展開抓取,其余地址既消耗抓取预算,也容易让不同語言版本互相挤压,最後表現成“某個語言版迟迟不收錄”。
先定下語言與地区的URL结构
常见做法有三種,選定之後尽量不要再混用:
- 子目錄:example.com/zh-cn/、example.com/en/。權重集中在一個域名,配置與维護成本最低,多數站点适合這種。
- 子域名:cn.example.com、en.example.com。适合不同地区由不同团队獨立运营,但每個子域都要各自维護 robots.txt 與 sitemap,日誌也要分開看。
- 獨立域名:example.cn 與 example.com 並存。權重分散,跳轉與 hreflang 的配置成本最高,除非业務上确有必要。
需要留意的是,語言代碼尽量带地区後缀,例如 zh-cn、zh-tw、en-us,避免把所有中文流量都压到一個 zh 目錄里。目錄一旦上线並被收錄,後期改名意味着要處理成批重定向,越早定越好。
自動跳轉是最容易挡住蜘蛛的一环
不少站点會按訪客的 IP 归属地或 Accept-Language 請求头做 302 跳轉,把用戶推到“更合适”的語言版本。這個体驗優化本身没問题,問题出在實現方式上:
- 不要用 JavaScript 的 location.replace 做語言分發。蜘蛛拿到的是一個几乎空白的頁面,正文里的連結也就無從發現。
- 如果确實需要服務端跳轉,用 302 而不是 301。301 會被当作永久搬家,一旦判断失誤,修正周期很長。
- 蜘蛛的訪問通常来自固定的几個地区,且不带明确的語言偏好。要保證它在任何情况下都能拿到一個完整、可点、可讀的頁面,而不是被彈回某個目錄。
- 给用戶保留手動切換語言的入口,且切換後的地址要能直接複製分享,而不是只存在于 Cookie 或會话里。
hreflang 的三條底线
hreflang 的作用是告诉搜尋引擎“這些地址是同一内容的不同語言版本,請按語言展示给對應用戶”。寫法上最容易出错的三個点是:
- 互指:A 頁面标注了 B,B 頁面也要标注 A,單向标注等于没标。
- 自指:每個頁面都要包含指向自己的那條 hreflang,漏掉自指會让整组關系失效。
- x-default:為無法匹配語言偏好的訪客指定一個兜底版本,通常選主站或英文版。
還要清楚一点:hreflang 只解决“该给谁看哪個版本”,並不解决内容重复的合並問题。如果几個語言版本其實是机器翻译的同一段文字,检索表現依然會互相牵扯,這種情况下更该考虑的是要不要收錄。
把抓取入口整理干净
語言目錄定好之後,入口层面還有几件事值得顺手做掉:
- 按語言分別生成 sitemap,再用一個 sitemap index 匯總;文件里只放 200 狀態、可正常打開的規范地址。
- robots.txt 不要為了“省抓取”而屏蔽整個語言目錄,屏蔽之後蜘蛛连站内連結都看不到,日誌里會長期缺少该目錄的訪問记錄。
- 站内導航與頁脚的語言切換連結用普通 a 标簽,保持可抓取;不要把切換做成按钮加事件监听。
一份可以照着走的检查清單
- 語言目錄或子域的命名是否统一,没有中英目錄混排。
- 用不带語言偏好、不同地区 IP 的請求訪問首頁,返回的頁面是否完整可讀。
- 任意取一個内容頁,检查 hreflang 是否互指、自指、含 x-default。
- 查看服務器日誌中该語言目錄的抓取记錄,是否有稳定訪問。
- 分語言 sitemap 中的地址是否都能返回 200,且與頁面里的規范地址一致。
多語言站点的URL發現,本质是把入口收敛到有限、稳定、可解释的几個地址上,让蜘蛛不必猜。结构定得越早,後面要补的窟窿越少。