做多語言或多地区站点时,URL 结构往往在項目早期就定下来了,後期想改成本很高。對搜尋蜘蛛来说,它需要知道同一篇内容的各個語言版本分別對應哪個 URL,以及在不同地区應该展示哪一個。這件事没處理好,常见的结果是两個版本互相竞争,或者某一個版本長期没有抓取记錄。
三種常见的 URL 组织方式
先選结构,再谈配置。三種方式各有代價,没有绝對最優:
- 子目錄(example.com/zh/、example.com/en/):部署最简單,共用同一套服務器和證书,權重集中在一個域名下。代價是各語言版本共用技術栈,以後要單獨迁走某一個語言时,需要连带處理目錄級的重定向。
- 子域名(en.example.com):可以獨立部署、獨立配置 CDN 策略,某個版本出問题时影响面較小。代價是需要在搜尋平台分別驗證站点,連結權重也要跨子域传递。
- 獨立國家域名(example.de):地区信号最明确,但每個域名都要單獨维護證书、解析、监控,成本和运维负担最高,适合本地化投入較大的情况。
不管選哪種,關键是同一個頁面的每個語言版本都用一個稳定、可被抓取的 URL,避免同一版本通過多套地址訪問。
hreflang 的寫法與常见错誤
hreflang 的作用是告诉搜尋引擎:這些 URL 是同一内容的不同語言或地区版本,請按用戶情况選擇展示。寫法上有几個容易出错的地方。
必须双向互指
A 頁面标注了 B 是它的英文版,B 頁面也要标注 A 是它的中文版;同时每個頁面都要自引用,即在自身的 hreflang 列表里包含自己。只寫單向引用,整组标注有可能被忽略。
x-default 的用途
x-default 用来指定当用戶的語言和地区都不匹配时的兜底版本,一般指向主語言版本或語言選擇頁。它不替代其他條目,而是作為补充。
放在哪里
可以寫在 HTML 的 head 里,也可以放在 XML 站点地图中,選一種並保持一致即可。條目多、模板不统一时,站点地图通常更容易批量维護。注意語言地区代碼要寫規范,比如 zh-CN、zh-Hant、en、en-GB,不要寫成中文描述。
自動跳轉與語言切換器的坑
常见的副作用来自两處:一是按 IP 或浏览器語言做自動跳轉,二是語言切換器用脚本或表單提交實現。
- 自動跳轉如果對爬虫也生效,可能让搜尋引擎只看到一個版本,其他語言的 URL 逐渐不再被抓取。更稳妥的做法是跳轉只對真實用戶生效,或者用不跳轉的語言選擇頁作為入口。
- 語言切換器應该輸出可点击的連結,直接指向對應語言的 URL,而不是靠脚本改寫地址。脚本跳轉對連結發現没有帮助。
- 不要用 cookie 或 localStorage 记錄的語言偏好去改變服務端返回的版本。爬虫没有這些狀態,會拿到和用戶不同的頁面。
- 不要用 robots.txt 直接屏蔽其他語言目錄,這會让那些 URL 失去被抓取的机會。
和 canonical、站点地图的配合
一個常见誤区是让英文版 canonical 指向中文版,希望“集中權重”。多語言版本之間是翻译關系,不是重复内容,每個語言版本 canonical 指向自己即可,跨語言合並反而會让另一個版本难以被展示。真正需要 canonical 合並的,是同一語言下因為參數、大小寫或歷史遗留产生的多套地址。
站点地图方面,如果 hreflang 寫在站点地图里,要保證其中出現的 URL 都能返回正常狀態;已下线的語言版本及时從站点地图和 hreflang 列表中移除,避免留下指向 404 的标注。
上线前可以過一遍的清單
- 每種語言是否都有獨立、稳定、可被抓取的 URL。
- hreflang 是否双向互指,並包含自引用。
- x-default 是否指向合理的兜底版本。
- 自動跳轉是否只對用戶生效,是否影响爬虫获取其他版本。
- 語言切換器是否為可点击的連結。
- 各語言版本的 canonical 是否指向自身。
- 站点地图中的 hreflang 與頁面 URL 是否一一對應且可訪問。
- 服務器日誌中是否能看到爬虫訪問各語言目錄的记錄。
多語言站点的 URL 問题通常不是配置一次就能收尾的,語言增删、内容迁移、模板調整都會带来新的不一致。比較務實的做法是把它放進定期检查的清單,用服務器日誌和站点地图做交叉核對;發現某個版本長期没有抓取记錄时,先查連結入口和 hreflang 标注,再考虑其他原因。