hreflang 設了等於沒設:一個中英雙語網站的六個設定錯誤檢討
hreflang 設了沒效,最常見的原因是缺少回連、語言代碼寫錯、網址不是標準網址,以及 x-default 指錯地方。逐頁確認每個語言版本都互相指向、也指向自己,代碼用正確的「語言加地區」格式,大部分問題就能排除。
案例背景:一個中英雙語網站的示範情境
以下是示範情境,公司與網站都是為了說明而設定的。
一家台灣的工業零件製造商,官網有繁體中文與英文兩個版本。中文放在網址根目錄,英文放在 /en/ 底下。外包工程師上線時加了 hreflang。三個月後,業務反映國外客戶用英文搜尋品牌名,出現的還是中文首頁。
我們把設定一頁一頁拆開來看,找到六個錯誤。它們不是同時出現在每一頁,而是散在不同的模板裡。下面依照發現的順序整理。
檢查的起點是業務那句抱怨。我們先在 Search Console 看英文品牌字的搜尋結果顯示的是哪一頁,再回頭打開那一頁和它對應的中文頁,比對兩邊的 head。從症狀倒推設定,比從設定一行一行往下讀快得多。
先說 hreflang 是什麼。它是告訴 Google「這一頁還有哪些語言或地區版本」的標記,讓搜尋結果顯示適合使用者的那個版本。它不會讓排名變高,也不會讓流量變多。它只負責把對的版本給對的人。
Google 對多語與多地區網站有專門的文件,可以從Google 搜尋中心的 SEO 入門指南往下找到國際化網站的章節。下面的檢討都以那份文件的規則為準。
錯誤一:中文頁指向英文頁,英文頁沒有指回來
中文首頁的 head 裡寫了 en 指向 /en/。英文首頁用的是另一套模板,工程師忘了加,結果成了單向標記。
Google 用雙向確認。A 頁說 B 是它的英文版,B 頁也要說 A 是它的中文版。沒有回連,這組標記可能被忽略。
修正方式:每一個語言版本都要列出整組所有版本,包含自己。兩種語言就是每頁兩行,三種語言就是每頁三行。「包含自己」這一點最容易漏,很多人以為只要列出其他語言就好。
這個錯誤的根源在流程。網站有幾套模板,就要有幾份檢查紀錄。只檢查首頁,等於只檢查了一套模板。
錯誤二:語言代碼寫成國家代碼
英文版寫了 hreflang=”en-UK”,中文版寫了 hreflang=”tw”。兩個都是錯的。
語言代碼用 ISO 639-1,地區代碼用 ISO 3166-1 Alpha 2。地區不能單獨出現,一定要接在語言後面。英國的地區代碼是 GB,不是 UK。台灣的繁體中文寫 zh-TW,單寫 tw 會被當成無效值。
| 寫法 | 對或錯 | 原因 |
|---|---|---|
| zh-TW | 對 | 語言 zh 加地區 TW |
| tw | 錯 | 只有地區,沒有語言 |
| en | 對 | 只指定語言,不限地區 |
| en-UK | 錯 | 英國的地區代碼是 GB |
| en-GB | 對 | 語言加上正確的地區代碼 |
| zh_TW | 錯 | 中間要用連字號,不是底線 |
底線這一項很常見。不少系統內部的語系設定寫成 zh_TW,工程師直接拿來輸出。輸出到 hreflang 時要轉成連字號。
另外要想清楚是否真的需要地區。如果英文版是給所有英語使用者看的,寫 en 就好,不必寫 en-US。地區代碼只在你真的為某個地區準備了不同內容時才加,例如不同的幣別、運費或聯絡窗口。
錯誤三:hreflang 指向的網址不是標準網址
中文頁的 hreflang 寫 http,英文頁寫 https。有幾頁指向帶著追蹤參數的網址。另一批產品頁,hreflang 指向的網址會再轉址到新的路徑。
hreflang 裡的網址要寫完整網址,包含 https 和網域。它應該是那個版本的標準網址:能直接回應、沒有轉址、沒有設成 noindex。指向轉址前的舊網址,或指向被 canonical 指去別處的網址,訊號就會互相打架。
canonical 也要一起看。每個語言版本的 canonical 應該指向自己。不要把英文版的 canonical 指到中文版。canonical 是在說「這頁的正本是誰」,英文版說正本是中文版,等於告訴 Google 英文版不必收錄,hreflang 再怎麼寫都救不回來。
canonical 設定失敗的其他情況,可以參考canonical 標籤被 Google 忽略的原因檢討。
錯誤四:x-default 指錯了地方
工程師把 x-default 指向英文首頁。但英文版其實只翻了一部分產品。結果是使用其他語言的訪客,被送到內容不完整的英文版。
x-default 的意思是:沒有符合的語言時,該給誰看哪一頁。它通常指向語言選擇頁,或是內容最完整、最能服務多數訪客的版本。它不是必填,但要用就要想清楚預設的人是誰。
以這個示範情境來說,國外詢價的客戶多半讀英文。最後我們把 x-default 留在英文首頁,但先把英文版的產品頁補齊。判斷的依據是內容完整度,不是哪個語言比較重要。
錯誤五:三種設定方式混用,彼此打架
hreflang 可以寫在 HTML 的 head、HTTP 標頭,或網站地圖裡。這個網站同時用了 head 和網站地圖。網站地圖是外掛自動產生的,裡面的語言代碼和 head 不一致。
一個網站選一種方式就好。中小企業用 WordPress 的話,多數多語外掛會在 head 自動輸出。選了它,就把網站地圖裡的 hreflang 關掉,避免兩邊各說各話。PDF 這類沒有 head 的檔案,才需要考慮 HTTP 標頭。
還要確認 hreflang 真的在 head 裡。有些主題或外掛會在 head 前段插入不屬於 head 的元素,解析時可能提早結束 head,後面的標記就落到 body,失去作用。只看「檢視原始碼」不夠,要用開發者工具看渲染後的結果。
錯誤六:沒翻完的頁面也放進 hreflang 組合
英文版有一批產品頁只翻了標題,內文還是中文。外掛照樣幫它們加上 en 的標記。
Google 判斷頁面語言靠內容,不是靠你標的代碼。標成英文、內文是中文的頁面,會讓整組標記失去可信度。這類頁面要嘛補完翻譯,要嘛先不放進組合,也可以暫時設成 noindex,等翻完再開放。
翻譯頁也要符合內容品質的要求。機器翻完沒有人看過的頁面,對讀者幫助有限,相關原則見建立有用內容的官方說明。
六個錯誤一次對照
把六個錯誤放在一起看,會發現它們的症狀很像,原因卻各不相同。下表可以當成排查時的對照表。
| 錯誤 | 常見症狀 | 修正方向 |
|---|---|---|
| 缺少回連 | 某些語言版本在搜尋結果中從不出現 | 每頁列出整組版本,包含自己 |
| 代碼錯誤 | 標記被當成無效,等於沒設 | 語言用 ISO 639-1,地區用 ISO 3166-1 Alpha 2 |
| 非標準網址 | Google 選了別的網址當正本 | 寫完整網址,canonical 指向自己 |
| x-default 指錯 | 其他語言訪客進到內容不完整的頁面 | 指向語言選擇頁或最完整的版本 |
| 設定方式混用 | 不同工具讀到的語言關係不一致 | 一個網站只選一種方式 |
| 未翻譯頁入組 | 標成英文的頁面卻是中文內容 | 補完翻譯或先移出組合 |
排查時建議照表由上往下。前三項影響的是整組標記能不能成立,後三項影響的是成立之後給對人看。
修正之後,怎麼驗證設定真的生效?
修正後我們做了三件事。
- 每一套模板挑一頁,用瀏覽器開發者工具確認渲染後的 head 裡有完整一組 hreflang,包含自己。
- 用站內爬蟲工具的免費版爬一次,匯出每頁的 hreflang,檢查回連是否成對、代碼是否有效、目標網址是否直接回應 200。
- 在 Search Console 用網址檢查工具,看 Google 選定的標準網址是不是我們設定的那一頁。
搜尋結果不會立刻改變。Google 要重新爬取每一頁,才會確認這組關係。這段期間不要再改設定,不然很難判斷是哪一次修改起了作用。
如果你的網站同時有繁體、簡體或多個華語地區版本,規劃會更複雜。可以先讀中文網站跨境規格書:語言標記與簡繁分版的設定,把架構定好再動標記。
適用與不適用的情況
這篇的檢查方式,適用於已經有兩個以上語言或地區版本、而且各版本內容大致對應的網站。
不適用的情況有三種。網站只有一種語言,不需要 hreflang。只翻了介面、內容沒翻的網站,先處理內容比處理標記重要。各語言版本內容完全不同的網站,例如英文版只放公司簡介、中文版是完整的電商,它們不算互相對應的版本,不該硬湊成一組。
技術設定牽涉主題與外掛,動手前先備份,一次改一項。需要協助評估多語網站架構,可以參考冠誠數位行銷的服務項目,或到常見問題看看其他人問過什麼。
