你的網站做了繁中、日文、德文好幾個語言版本,台灣的搜尋流量卻怎麼衝都衝不動,反而英文版一枝獨秀,這種情況我看過太多次。多數人第一時間會去改內容、加關鍵字,但真正的病灶往往藏在一行你平常不會去看的標籤裡:canonical。我是吳承學,做 SEO 二十年,這篇要用一個真實的慘案,把 canonical 指錯到英文首頁會發生什麼事、以及 canonical 跟 hreflang 到底該怎麼搭配講透。
1. 一個把所有語言版本都指向英文首頁的慘案
先講案例。我曾經協助分析一款電子簽章 SaaS 的多語系網站,對方在台灣、日本、德國都有在地化的版本,內容也翻得很用心。但流量報表就是很怪:非英語市場的自然搜尋幾乎起不來。掃過原始碼才發現問題,所有語言版本,包括繁中的 /zh-tw/、日文的 /ja/、德文的 /de/,它們的 canonical 標籤全部指向同一個英文首頁。
1.1 canonical 指錯,等於叫 Google 忽略你的在地版本
canonical 這個標籤的作用,是告訴 Google「這一頁的權威版本是哪一個網址」。當繁中頁的 canonical 指向英文首頁,你等於親口跟 Google 說:「繁中這頁不是正版,英文首頁才是。」Google 照做,把繁中、日文、德文頁全部當成英文首頁的重複內容,索引時直接略過,權重全數集中到英文版。台灣使用者搜尋繁中關鍵字時,你精心翻譯的繁中頁根本沒被當成獨立頁面看待。
1.2 為什麼這種錯特別難被發現
我在實務上看過這類問題拖很久才被抓出來,原因是頁面在瀏覽器裡看起來一切正常,內容顯示、切換語言都沒問題,肉眼完全看不出異常。canonical 藏在 <head> 裡,除非你主動去看原始碼或用工具掃描,否則不會察覺。很多網站是用同一套模板產生所有語言頁,模板裡的 canonical 寫死成英文首頁,結果一錯就是全站錯。
2. canonical 的正確原則:每個語言版本都指向自己
修正的核心觀念只有一句話:每個語言版本的 canonical 應該指向該頁自己,而不是別人。
2.1 self-referencing canonical 是多語系的地基
繁中頁的 canonical 就指向繁中頁的網址,日文頁指向日文頁,以此類推。這叫 self-referencing canonical,是多語系網站的地基。地基沒打好,上面疊再多 hreflang 都是空的。我的做法是先確認每一個語言版本都能自我指涉,再往下做 hreflang,順序不能顛倒。
2.2 只修 canonical 不加 hreflang,效果還是有限
這裡要澄清一個常見誤會:很多人以為把 canonical 改成指向自己就沒事了。實際上,如果只修 canonical 卻沒補上 hreflang,Google 雖然不再把各語言頁當成重複內容,但它仍然不知道這幾個頁面「彼此是同一份內容的不同語言版本」。少了這層對應關係,Google 可能在錯誤的市場放送錯誤語言的頁面。canonical 解決的是「哪個是正版」,hreflang 解決的是「哪個版本給哪個地區的人看」,兩者要一起做才完整。
3. hreflang 要寫在 head 裡,而且每個連結都要對應
我在實務上看過有網站只在 <html lang="zh-tw"> 上標了語言屬性,就以為多語系 SEO 做完了。這其實只做了一半。
3.1 html lang 屬性的權重很低
<html lang="zh-tw"> 只是告訴瀏覽器這頁的語言是繁體中文,對輔助工具與使用者體驗有幫助,但對 Google 的多語系 SEO 來說,這個屬性的權重很低。它不能取代 hreflang。真正能讓 Google 建立語言對應關係的,是寫在 <head> 裡、每個語言版本都互相指涉的 <link rel="alternate" hreflang="...">。
3.2 放在 sitemap 不如放在 head
hreflang 有三種實作位置:HTTP header、sitemap、以及 HTML 的 head。有些網站把 hreflang 放在 sitemap 裡,這技術上可行,但我的做法是優先放在每一頁的 head。理由很單純:head 裡的標記跟頁面綁在一起,爬取當下就能被讀到,除錯時打開原始碼就看得見,不用另外去比對 sitemap 有沒有同步。放 sitemap 一旦哪天忘了更新,問題又很難查。
3.3 正確的 head 標記長這樣
一個繁中頁,head 裡該同時具備 self-referencing canonical 與完整的 hreflang,實務上會像這樣:
<html lang="zh-TW">
<head>
<!-- 1. canonical 指向自己 -->
<link rel="canonical" href="https://www.example.com/zh-tw/" />
<!-- 2. hreflang 告訴 Google 各語言版本的對應 -->
<link rel="alternate" hreflang="zh-TW" href="https://www.example.com/zh-tw/" />
<link rel="alternate" hreflang="ja" href="https://www.example.com/ja/" />
<link rel="alternate" hreflang="de" href="https://www.example.com/de/" />
<link rel="alternate" hreflang="en" href="https://www.example.com/en/" />
<link rel="alternate" hreflang="x-default" href="https://www.example.com/en/" />
</head>
3.4 別漏掉 x-default
上面那組標記裡的 x-default 常被漏掉。它的意思是「如果使用者的語言與地區都不在我列出的清單裡,預設給他看哪一頁」。通常會指向英文版或一個語言選擇頁。少了 x-default,對於不在你目標市場的使用者,Google 只能自己猜要顯示哪個版本,結果不一定理想。
4. canonical 與 hreflang 的分工與常見錯誤
把兩者的角色與常見錯誤放在一起對照,你會更清楚問題出在哪。
| 項目 | canonical | hreflang |
|---|---|---|
| 要回答的問題 | 這頁的權威版本是哪個網址 | 這份內容有哪些語言版本、各給誰看 |
| 正確做法 | 每個語言版本指向自己 | 列出所有語言版本並互相指涉 |
| 建議放置位置 | 該頁 head | 該頁 head(優先於 sitemap) |
| 做錯的後果 | 在地版本被當重複內容忽略 | 在錯的市場放送錯的語言 |
| 能否單獨使用 | 可以但不完整 | 需搭配正確 canonical 才有效 |
4.1 hreflang 必須雙向對應
hreflang 有一條鐵律:對應關係必須雙向。繁中頁指向日文頁,日文頁也一定要回指繁中頁。只要有一邊漏掉,Google 就會判定這組對應無效而忽略它。我在實務上看過網站只在首頁做了完整對應,內頁卻各做各的,結果內頁的多語系關係全數失效,這種局部正確反而最難察覺。
4.2 語言與地區代碼別寫錯
hreflang 的值要用有效的語言代碼,必要時加上地區代碼,例如 zh-TW、en-US。常見的錯誤是把地區代碼當語言代碼用,像是寫成 zh-tw 大小寫混亂或用了不存在的代碼。這些寫錯的標記會被 Google 直接忽略,建議上線前用 hreflang 檢測工具跑一次。
4.3 canonical 與 hreflang 不能互相打架
最後一個雷:canonical 指向的網址,必須跟 hreflang 裡列出的該語言網址完全一致。如果繁中頁 canonical 指向自己,hreflang 卻把繁中版寫成另一個網址,兩個標籤互相矛盾,Google 收到衝突訊號後多半兩個都不採信。一致性在這裡不是講究,是能不能生效的前提。
5. 常見問題
5.1 canonical 全部指向英文首頁,大概多久會影響流量
影響是持續累積的,不是某一天突然發生。當各語言版本被判定為重複內容,它們在對應市場的排名會逐漸掉下來,非英語市場受創最深。修正之後也需要 Google 重新爬取與索引才會回穩,通常要數週到數月,愈早發現愈好。
5.2 只把 canonical 改成指向自己,流量就會回來嗎
會改善,但通常不夠。canonical 修正後在地頁不再被當重複內容,這是止血;但要讓 Google 正確地把對的語言送到對的市場,還需要補上雙向的 hreflang。兩件事一起做,恢復的效果才完整。
5.3 hreflang 放在 sitemap 跟放在 head 有差嗎
兩者都被 Google 支援,效果理論上相近。但我偏好放在 head,因為它跟頁面綁在一起,爬取當下就讀得到,除錯時打開原始碼直接看得見。放 sitemap 一旦忘了同步就很難查,維護成本比較高。
5.4 x-default 一定要加嗎
強烈建議加。它處理的是那些語言地區都不在你清單內的使用者,替他們指定一個預設版本。沒有 x-default,Google 只能自行判斷要顯示哪個語言頁,結果不見得符合你的預期。
5.5 只有一種語言的網站需要做 canonical 嗎
需要。就算只有單一語言,self-referencing canonical 仍能幫你收斂同一頁的不同網址變體,例如有無斜線、帶不帶參數的版本,避免同一份內容被拆成多個重複頁分散權重。它是每個網站都該有的基本設定。
5.6 怎麼確認 canonical 跟 hreflang 都設對了
我的做法是三管齊下:打開頁面原始碼確認 head 裡的標籤、用 hreflang 檢測工具跑一輪抓語法與雙向對應的錯誤、再看 Search Console 的國際定位報告有沒有回報衝突。三個訊號都乾淨,才算真的設對。
