做了多語言或者多地区版本之後,很多站点會遇到一種情况:同一份内容在索引里冒出好几個地址,用戶從搜尋结果点進来,看到的却不是他想要的語言版本。這通常不是“收錄不了”的問题,而是几個版本之間的關系没有理清。版本之間關系混乱,重复内容、語言错位、展現語言不符這些現象就會一起出現。
一、先分清是版本關系問题還是 URL 结构問题
這两種情况表現很像,但處理顺序不一样。URL 结构問题,是同一個語言下同一篇内容對應了多個地址;版本關系問题,是不同的語言版本在抢同一個查询。可以先從几個現象入手判断:
- 只有一個語言版本被大量记錄,其他版本几乎没有痕迹
- 同一篇文章在索引里出現两三個不同後缀的地址
- 搜某個語言的關鍵詞,返回的却是另一語言的頁面
- 切換語言之後地址變了,但内容指向的還是原来那一份
二、三種常见 URL 结构,各有各的代價
子域名
比如 en、jp 各占一個子域名。好處是版本之間隔离清楚,服務器和模板可以分開管;代價是連結權重分散,新版本從零開始积累,互相之間的信号传递要靠 hreflang 和站内連結补。
子目錄
比如 /en/、/jp/。主域集中,權重容易叠加,是多數中小站点更省事的選擇;代價是目錄規則必须统一,尾斜杠、大小寫、預設語言的位置都要一次定清楚,否則同一個頁面會裂成几個地址。
參數或地区後缀
用 ?lang= 這類參數区分,最容易出現重复地址。如果必须用參數,至少要让不同語言有各自的規范地址,並且不要让參數组合被内鏈大量扩散。
三、hreflang 能做什么,不能做什么
hreflang 是给搜尋引擎的提示,用来說明某個語言或地区對應哪個地址。它不阻止抓取,也不等同于 canonical,更不能保證一定被采用。常见的几個要求:
- 版本之間要相互指向,不能只從主版本指出去
- 每個版本也要包含指向自身的 hreflang
- 語言代碼按規范寫,地区代碼可選但不要臆造
- 如果存在一個通用版本,用 x-default 指過去
四、版本之間不要互相 canonical
這是多語言站点里比較常见也比較致命的一處:英文頁的 canonical 指向中文頁,或者反過来。這样等于告诉搜尋引擎“這几個地址里只留一個”,另一個版本會慢慢從索引里登出。正确的做法是每個語言版本的 canonical 指向自己,版本之間的關系交给 hreflang 去表達。
五、自動跳轉和語言切換連結的坑
按 IP 或浏览器語言做自動跳轉,看起来對用戶友好,但蜘蛛通常只會看到預設版本,其他版本就失去了被發現的机會。如果确實要跳,尽量让跳轉可逆,並保證每個版本都有稳定的直達地址。
語言切換連結也有類似的問题:如果它靠脚本渲染,或者寫法上没有可抓取的 href,蜘蛛顺着頁面爬不到其他版本。切換入口應该是一组真實的連結,能直接点開、能被抓到。
六、一個可执行的检查顺序
- 先定一個預設版本,明确它承担什么角色
- 检查 URL 结构是否统一,大小寫和尾斜杠是否一致
- 检查 hreflang 是否双向指向,並且包含自身
- 检查 canonical 是否指向同語言版本,而不是指向別的語言
- 检查語言切換入口是不是可抓取的連結
- 检查 sitemap 是否覆盖了各個版本的規范地址
- 用站内查询观察各版本的收錄與展現是否和预期一致
多語言收錄的重点不是把每個版本都推上去,而是让每個版本只出現在它该出現的查询里。
調整之後不要急着下结论,观察一段時間各版本的收錄變化。如果某個版本始终没有记錄,先回到抓取和連結發現這两個环节,看看它是不是根本没被蜘蛛走到,而不是直接归因于頁面质量。