hreflang 多語系標記:繁中、簡中與 x-default 的設定
同一份內容有多個語言版本時,hreflang 告訴搜尋引擎它們的對應關係,讓 使用繁體中文的人看到繁體版本,而不是隨機拿到簡體或英文版。
<link rel="alternate" hreflang="zh-Hant" href="https://example.com/zh-Hant/page">
<link rel="alternate" hreflang="zh-Hans" href="https://example.com/zh-Hans/page">
<link rel="alternate" hreflang="en" href="https://example.com/en/page">
<link rel="alternate" hreflang="x-default" href="https://example.com/page">單語系網站不需要這個
hreflang 的用途是在 多個語言版本之間 建立對應。只有一個版本就沒有對應對象,設定好 <html lang="zh-Hant-TW"> 就足夠。
語言代碼的寫法
格式是 語言 或 語言-地區,依 ISO 標準:
| 代碼 | 意義 |
|---|---|
zh | 中文(不分繁簡,太籠統) |
zh-Hant | 繁體中文(不分地區) |
zh-Hans | 簡體中文(不分地區) |
zh-TW | 台灣的中文使用者 |
zh-HK | 香港的中文使用者 |
zh-CN | 中國大陸的中文使用者 |
en | 英文(不分地區) |
en-US | 美國的英文使用者 |
ja | 日文 |
zh-TW 的意思是「台灣使用者」,不是「繁體字」
這是繁簡中文最容易犯的錯。zh-TW 的地區部分指的是 使用者所在地,所以:
- 香港與澳門的繁體中文使用者 不會 對應到
zh-TW。 - 在美國工作的台灣人,地區訊號也可能不是 TW。
若內容通用於所有繁體地區,用 zh-Hant 涵蓋範圍更廣。真的有針對台灣的內容(價格、法規、通訊方式)才用 zh-TW。
| 需求 | 建議代碼 |
|---|---|
| 通用的繁體內容 | zh-Hant |
| 通用的簡體內容 | zh-Hans |
| 台灣專屬內容(幣別、法規) | zh-TW |
| 香港專屬內容 | zh-HK |
| 同時要涵蓋 | zh-Hant 與 zh-Hant-TW 並列 |
必須雙向對應
單向宣告無效
每個語言版本都必須列出 完整的清單,包含自己在內。
原因是無法驗證:任何網站都可以聲稱自己是某個熱門頁面的語言版本。要求對方也認可,這個宣告才算成立。
所以三個語言版本,每一頁都放同樣的四行:
<!-- 在 /zh-Hant/page 這一頁 -->
<link rel="alternate" hreflang="zh-Hant" href="https://example.com/zh-Hant/page">
<link rel="alternate" hreflang="zh-Hans" href="https://example.com/zh-Hans/page">
<link rel="alternate" hreflang="en" href="https://example.com/en/page">
<link rel="alternate" hreflang="x-default" href="https://example.com/page"><!-- 在 /en/page 這一頁:內容完全相同 -->
<link rel="alternate" hreflang="zh-Hant" href="https://example.com/zh-Hant/page">
<link rel="alternate" hreflang="zh-Hans" href="https://example.com/zh-Hans/page">
<link rel="alternate" hreflang="en" href="https://example.com/en/page">
<link rel="alternate" hreflang="x-default" href="https://example.com/page">包含自己這件事常被漏掉
/en/page 那一頁也要列出 hreflang="en" 指向自己。少了自我宣告,整組對應可能被判定不完整。
x-default
它指定 「所有語言都對不上時該去哪一頁」。
<link rel="alternate" hreflang="x-default" href="https://example.com/">適合當 x-default 的頁面 | 說明 |
|---|---|
| 語言選擇頁 | 讓使用者自己選 |
| 自動偵測語言的入口頁 | 依瀏覽器語言導向 |
| 最通用的版本(通常是英文) | 退而求其次 |
不是必填,但沒有它時搜尋引擎只能自己挑一個當退路。
三種宣告位置
| 位置 | 適合 | 缺點 |
|---|---|---|
HTML 的 <link> | 一般網站 | 語言版本多時檔頭會很長 |
| HTTP 回應標頭 | PDF 等非 HTML 檔案 | 需要伺服器設定 |
| sitemap | 語言版本很多的大型網站 | 較不直觀,但檔頭乾淨 |
HTTP 標頭
Link: <https://example.com/zh-Hant/doc.pdf>; rel="alternate"; hreflang="zh-Hant",
<https://example.com/en/doc.pdf>; rel="alternate"; hreflang="en"sitemap
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
>
<url>
<loc>https://example.com/zh-Hant/page</loc>
<xhtml:link rel="alternate" hreflang="zh-Hant" href="https://example.com/zh-Hant/page" />
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page" />
</url>
<url>
<loc>https://example.com/en/page</loc>
<xhtml:link rel="alternate" hreflang="zh-Hant" href="https://example.com/zh-Hant/page" />
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page" />
</url>
</urlset>十種語言以上就改用 sitemap
十個語言版本表示每一頁的檔頭要放十一行 <link>。改寫在 sitemap 裡可以讓檔頭乾淨得多,也集中在一處好維護。
三種方式選一種就好,不要重複宣告。
和 canonical 的關係
每個語言版本的 canonical 都要指向自己
<!-- 在 /zh-Hant/page -->
<link rel="canonical" href="https://example.com/zh-Hant/page">
<link rel="alternate" hreflang="zh-Hant" href="https://example.com/zh-Hant/page">
<link rel="alternate" hreflang="en" href="https://example.com/en/page">錯誤的做法是把所有語言版本的 canonical 都指向英文版,那等於說「只收錄英文版」,其他語言就不會出現在搜尋結果。
兩者管的是不同層次:canonical 說「這一頁的正式網址是哪個」,hreflang 說「這一頁有哪些語言版本」。
網址結構的三種選擇
| 結構 | 例 | 優點 | 缺點 |
|---|---|---|---|
| 子目錄 | example.com/zh-Hant/ | 共用網域權重、好維護 | 無 |
| 子網域 | zh-Hant.example.com | 可分開部署 | 權重較分散 |
| 獨立網域 | example.tw | 地區訊號最強 | 成本高、權重完全分開 |
多數情況選子目錄
它共用主網域累積的權重,設定也最簡單。獨立網域只在有明確的地區營運需求(各地區獨立團隊、獨立金流)時才值得。
常見錯誤
這五種都會讓標記失效
| 錯誤 | 後果 |
|---|---|
| 沒有雙向對應 | 整組宣告可能被忽略 |
| 沒有列出自己 | 對應被判定不完整 |
| 用相對路徑 | 無效,必須是絕對網址 |
代碼寫錯(如 zh_TW 用底線) | 無效,hreflang 用連字號 |
| 指向的網址是轉址或 404 | 該筆對應被忽略 |
底線與連字號不要混淆
hreflang用 連字號:zh-Hant-TWog:locale用 底線:zh_TW<html lang>用 連字號:zh-Hant-TW
三個地方格式不同,複製貼上時容易出錯。
檢查清單
| 項目 | 標準 |
|---|---|
| 每個語言版本都列出完整清單 | 必備 |
| 清單包含自己 | 必備 |
| 用絕對網址 | 必備 |
| 代碼用連字號且符合 ISO 標準 | 必備 |
各版本的 canonical 指向自己 | 必備 |
有 x-default | 建議 |
| 三種宣告方式只用一種 | 建議 |
| 指向的網址都回傳 200 | 必備 |
<html lang> 與 hreflang 一致 | 建議 |
用 Search Console 驗證
Search Console 的國際目標定位報告會列出 hreflang 的錯誤,包含「缺少返回連結」這類雙向對應問題,那是人工檢查最難發現的一種。
常見問題
只有一種語言的網站需要 hreflang 嗎?
不需要。它的用途是在多個語言版本之間建立對應關係,只有一個版本就沒有對應對象。單語系網站設定好 <html> 標籤的語言屬性就足夠了。
為什麼一定要雙向對應?
因為單向宣告無法驗證。任何網站都可以聲稱自己是某個熱門頁面的語言版本,若不要求對方也認可,這個機制就會被濫用。所以每個版本都必須列出完整的清單,包含自己在內。
繁體中文的代碼該寫什麼?
建議寫 zh-Hant 表示繁體,或 zh-TW 指定台灣地區。要注意 zh-TW 的意思是「台灣使用者」而非「繁體字」,香港與澳門的使用者不會對應到它。若內容通用於各繁體地區,用 zh-Hant 涵蓋範圍更廣。
x-default 是什麼?
它指定「所有語言都對不上時該去哪一頁」。適合放語言選擇頁,或最通用的那個版本。它不是必填,但沒有它時搜尋引擎只能自己挑一個當退路。
hreflang 和 canonical 會衝突嗎?
不會,兩者管的是不同層次。每個語言版本的 正規網址 都應該指向自己,而語言標記則負責宣告版本之間的關係。錯誤的做法是把所有語言版本的正規網址都指向同一個語言,那會讓其他版本不被收錄。