SEO 完整攻略

探索 SEO 的最佳實踐,提升網站能見度與流量。

多國語系設定 (Hreflang)

針對不同地區的搜尋結果,讓內容不被誤解。

多國語系設定 (Hreflang)

Hreflang 基礎知識:為什麼你需要多國語系設定?

Hreflang 何謂?基本概念與使用情境

什麼是 hreflang?

在多國語系的網站上,搜尋引擎需要知道每一頁對應哪個語言、哪個地區,才能把正確版本送給正確的使用者。這就是 hreflang 的職責:它是一組 HTML 或 sitemap 標籤,告訴搜尋機器人「這頁是台灣中文、英美英文、香港繁體」等等。

為什麼你需要 hreflang?

  1. 避免重複內容:若同一個產品在多個語言頁面中使用相同的關鍵字,搜尋引擎會把它看成重複內容。hreflang 讓搜尋機器人知道這是不同版本,而非惡意抄襲。
  2. 提升使用者體驗:當你在台灣用手機搜尋「手錶」時,看到的結果會自動跳到繁體中文頁面;若你在英國搜尋同樣關鍵字,就顯示英文版本。
  3. 正確索引地區差異:有些產品只在特定國家販售或法規不同,hreflang 讓搜尋結果能根據地區顯示符合條件的頁面。

hreflang 的語法格式

<link rel="alternate" hreflang="zh-Hant-TW" href="https://example.com/tw/" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />
<link rel="alternate" hreflang="en-US" href="https://example.com/us/" />

說明:

  • hreflang 值由兩個部分組成,第一個是 ISO 639‑1 語言代碼(如 zh、en),第二個是 ISO 3166‑1 alpha‑2 地區代碼(如 TW、GB)。若沒有指定地區,搜尋引擎會把它視為「所有地區」的版本。
  • 自己參照:每一個語言/地區都必須包含對自身的 hreflang 標籤,否則搜尋機器人會認為缺少資訊,可能導致排名下降。

使用情境範例

1️⃣ 電商平台:多國商品頁面
  • 台灣版https://shop.com/tw/iphone-14
  • 美國版https://shop.com/us/iphone-14
  • 英國版https://shop.com/uk/iphone-14

每個頁面都放入對應的 hreflang 標籤,讓搜尋引擎能把「iPhone 14」的台灣中文、英美英文版本分別送給不同地區的使用者。

2️⃣ 新聞網站:多語系新聞稿
  • 簡體中文(中國大陸):https://news.com/zh-cn
  • 繁體中文(台灣、香港):https://news.com/zh-tw
  • 英文https://news.com/en-us

在首頁或每篇文章的 <head> 裡放入 hreflang,搜尋機器人就能辨識正確語言版本,避免台灣讀者被重定向到簡體中文版。

3️⃣ 旅遊網站:區域化目的地頁面
  • 台北(繁體中文):https://travel.com/zh-tw/taipei
  • Taipei (English)https://travel.com/en-us/taipei
  • 台北(簡體中文)https://travel.com/zh-cn/taipei

這樣設定後,搜尋結果會根據使用者所在國家顯示最合適的語言版本。

常見錯誤與排查清單

  • 漏掉自我參照:每個頁面都要包含指向自身的 hreflang 標籤。
  • 地區代碼寫錯:如把 GB 寫成 UK,搜尋機器人會視為未知地區。
  • 語言代碼不對:例如用 zh 代表繁體中文,而不是 zh-Hant,雖然大多搜尋引擎都能辨識,但最好還是精準寫法。
  • 重複標籤:同一頁面內出現兩個相同 hreflang 的 <link>,會造成混亂。
檢查工具
  • Google Search Console → 「國際搜尋」→「語言/地區」報告,可以檢視是否有錯誤或漏掉的版本。
  • Screaming Frog SEO Spider:在「HTML」標籤中查看 hreflang 標籤完整性。
  • Hreflang Tags Checker(線上工具):直接輸入 URL,快速看到所有設定。

小結

Hreflang 就是搜尋引擎的『語言導向貼紙』:它告訴搜尋機器人「這一頁是台灣中文、英美英文」等資訊。正確使用 hreflang 能避免重複內容問題,提升不同地區使用者的體驗,也能讓你在國際市場上更容易被找到。

最後記得:每次更新語言版本或新增地區時,都要同步更新 hreflang 標籤,保持資訊一致。祝你 SEO 之路順利、網站訪客多多!

在 XML Sitemaps 裡加上 Hreflang:一步步教學

在多國語系的網站中,正確告訴搜尋引擎每個頁面的目標地區與語言非常重要。Hreflang 可以幫助你避免內容重複、提升使用者體驗,也能讓特定地區的使用者看到最適合的版本。
然而若僅在 HTML 標頭或連結中加上 hreflang,搜尋引擎仍需額外時間來抓取。將它放進 XML Sitemap 之後,索引速度會更快、覆蓋率更完整,也是最佳做法之一。

步驟一:確認網站已正確設定 hreflang

在每個頁面的 <head> 裡,必須有相對應的 <link rel='alternate' ...> 或者在 URL 參數中加上語言標籤。舉例來說,台灣版與美國英文版可寫成:
<link rel='alternate' hreflang='zh-tw' href='https://example.com/zh-tw/' />
<link rel='alternate' hreflang='en-us' href='https://example.com/en-us/' />

步驟二:在 Sitemap 裡加入 XML namespace

打開 sitemap.xml,確認 <urlset> 標籤加上 xhtml 命名空間:
<urlset xmlns='http://www.sitemaps.org/schemas/0.9' xmlns:xhtml='http://www.w3.org/1999/xhtml'>

步驟三:為每個 URL 加入 hreflang 連結

在 <url> 節點內,插入多個 xhtml:link 標籤,每一個代表不同語系的對應頁面。範例如下:

<url>
  <loc>https://example.com/zh-tw/</loc>
  <xhtml:link rel='alternate' hreflang='zh-tw' href='https://example.com/zh-tw/' />
  <xhtml:link rel='alternate' hreflang='en-us' href='https://example.com/en-us/' />
</url>

步驟四:確保每個語系頁面都互相對應

為避免搜尋引擎判斷錯誤,所有的 hreflang 連結必須彼此指向同一組頁面。例如台灣版要指向英文版、日文版等;英文版也要回到台灣版。若缺漏或不對稱,會造成重複內容警告。

步驟五:驗證與提交

  1. 使用 Google Search Console 的「XML sitemap」功能,上傳你的 sitemap.xml。
  2. 在「國際目標」工具中檢查 hreflang 是否正確顯示。若有錯誤,系統會列出問題網址及建議修正方式。

常見陷阱與小技巧

  • 不要忘記在 sitemap.xml 裡加上 xhtml:link 的命名空間;沒有這個 namespace,搜尋引擎不會認識 hreflang。
  • 語言代碼要正確:使用 ISO 639‑1(如 zh、en)與 ISO 3166‑1 alpha‑2 國家碼(如 tw、us)。
  • 保持一致性:如果你同時在 robots.txt 與 sitemap.xml 提供相同網址,務必確保兩邊的 hreflang 資訊一致。

小結

將 hreflang 放進 XML Sitemap 不僅能縮短搜尋引擎抓取時間,更能提升跨國搜尋結果的相關性。只要依照上面步驟,確保命名空間、對應關係與驗證,每個語系頁面都能在正確的位置被找到。

HTML 標籤裡的 hreflang:語法與範例

為什麼要使用 hreflang

當你網站有多國語系的內容時,搜尋引擎需要知道哪一個版本適合哪位使用者。hreflang 可以告訴搜尋引擎:"這段網頁是用英文、繁體中文或日文寫成的,並且針對哪些地區顯示最合適"。

如果不設定 hreflang,Google 可能會把同一個網址重複列入搜尋結果,造成使用者看到錯誤語言版本,甚至被判斷為內容重複。這樣不但影響 SEO,也讓使用者體驗變差。

簡單來說:

  • 定位 針對不同國家/地區的搜尋人群顯示最適合的語言版本
  • 避免重複內容 讓 Google 知道這些頁面是相互關聯、但不是完全一樣
  • 提升點擊率 使用者更可能點進看到自己熟悉語言的結果

語法與範例

在 HTML <head> 區塊裡放置 <link> 標籤,告訴搜尋引擎各個語言版本的網址。基本格式如下:

<link rel="alternate" hreflang="<語言代碼>-<地區代碼>" href="<完整網址>"/>
// 例如:
<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/"/>

常見的語言 & 地區代碼
  • zh-Hant-TW : 繁體中文 (台灣)
  • zh-Hans-CN : 簡體中文 (中國)
  • en-US : 英文 (美國)
  • ja-JP : 日文 (日本)
範例:一個多語系首頁

<!-- 主要網頁(預設) -->
<link rel="alternate" hreflang="x-default" href="https://example.com/"/>

<!-- 台灣繁體中文 -->
<link rel="alternate" hreflang="zh-Hant-TW" href="https://example.com/tw/"/>

<!-- 美國英文 -->
<link rel="alternate" hreflang="en-US" href="https://example.com/us/"/>

<!-- 日本日文 -->
<link rel="alternate" hreflang="ja-JP" href="https://example.com/jp/"/>

重要提示

  • 每個語言版本必須都有對應的 <link>。若某一頁只有英文,還是要加上 x-default 或其他語言版本。
  • 使用正確的 URL 結構:最好保持相同的路徑結構,只改變前置子目錄或檔名,例如 /tw//us/ 等。
  • 不要在 <body> 內放置 hreflang,只能寫在 <head>

最佳實務與檢查清單

  1. 確認所有語言版本都已部署:如果你只想針對台灣繁體中文和美國英文,確保這兩個網址真的存在且內容完整。

  2. 使用 x-default 指定預設頁面:搜尋引擎在找不到合適語言時會退回到此頁面。通常放在網站根目錄或主網頁。

  3. 保持 hreflang 的對稱性:若 A 指向 B,B 必須也指向 A。例如台灣繁體中文頁面標記 zh-Hant-TW 并連結回美國英文頁面的 en-US 標籤。

  4. 使用 Google Search Console 檢測:在「搜尋外觀」>「多語系」可以看到 hreflang 的實際效果,並發現錯誤或遺漏。

  5. 避免使用相同 URL 但不同語言的內容:如果兩個網址只差文字顯示而其他結構完全相同,搜尋引擎可能還是會視為重複。確保每個版本都提供獨特、地方化的內容。

  6. 定期驗證語言代碼正確性:尤其在新增新國家或地區時,要確認 ISO 639‑1(語言)與 ISO 3166‑1 α2(國家)編碼無誤。

  • 完成以上步驟後,將網站提交給搜尋引擎重新抓取。通常會在數天內看到多國語系設定的效果。

測試 Hreflang 的工具與方法:Google Search Console、Screaming Frog 等

為什麼要測試 Hreflang

在多國語系網站裡,Hreflang 標籤告訴搜尋引擎哪個頁面對應哪些地區與語言。若設定錯誤,使用者可能會看到不相關的內容,甚至被視為重複內容而被降權。

測試 Hreflang 的好處:

  • 確認標籤正確寫入、沒有拼字或語言代碼錯誤;
  • 檢查是否有相互引用的錯漏,避免搜尋引擎無法辨識正確版本;
  • 捕捉跨域連結問題,保證國際化索引順暢。

在 Google Search Console 檢查 Hreflang

1️⃣ 登入 Google Search Console 並選擇對應的網站屬性。
2️⃣ 從左側功能表點擊「國際目標設定」>「Hreflang 標籤」。
3️⃣ 系統會列出已被抓到的 Hreflang 標籤,並顯示是否有錯誤或警告。

常見錯誤範例

  • 語言代碼拼寫錯誤(例如 zh-TW 應該是 zh-Hant);
  • 目標網址不完整,缺少協定;
  • 標籤相互引用不對稱。

若有「錯誤」或「警告」,點擊後可以看到具體頁面與建議修正方法。

使用 Screaming Frog 分析 Hreflang

Screaming Frog 是一款桌面爬蟲,能快速抓取網站並輸出完整的 hreflang 資訊。

設定步驟
1️⃣ 開啟 Screaming Frog,進入「Configuration」>「Custom」>「X‑path」。
2️⃣ 在 X‑path 規則中加入以下 CSS 選擇器:link[rel='alternate'][hreflang];這樣爬蟲就會抓到所有 hreflang 標籤。
3️⃣ 點擊「開始」進行網站爬取,完成後選擇「Export」>「All Inlinks」。

輸出範例(CSV 格式):

URL Hreflang Link Target URL
https://example.com/zh-tw/ zh-Hant-TW link[rel='alternate'] https://example.com/zh-hk/

在 Excel 或 Google Sheets 裡,你可以利用篩選功能快速檢查:

  • 是否所有 target URL 都存在;
  • 是否有重複或遺漏的 hreflang;
  • 是否有「x‑default」設定且指向正確。

若發現問題,可在 Screaming Frog 裡直接編輯原始碼,或將錯誤列表回傳給開發團隊修正。

CMS 與程式碼實作:如何在 WordPress、Drupal、Shopify 上部署 Hreflang?

WordPress 內建設定:使用「Polylang」或「WPML」的 Hreflang

這篇文章將說明如何在 WordPress 上利用 Polylang 或 WPML 插件自動產生 hreflang 標籤,並提供快速檢查清單與常見問題排除。
若你正在擴展網站至多國市場,正確設置 hreflang 是提升搜尋能見度的關鍵步驟,以下將逐步帶你完成設定流程。

1️⃣ 簡介:Hreflang 在多國語系網站的關鍵角色

在全球化時代,使用者往往會以自己的母語來搜尋。若你嘅網站未正確告訴搜尋引擎「這個頁面有哪幾種語言版本」,就可能被錯誤索引,導致排名下降或重複內容問題。WordPress 的 Polylang 與 WPML 兩款熱門多國語系插件,都內建支援 Hreflang 標籤,省下自行撰寫程式碼的麻煩。

2️⃣ Polylang 的 Hreflang 實作

  1. 安裝並啟用
  • 前往「外掛」→「新增」,搜尋 Polylang → 安裝並啟用。
  1. 設定語言
  • 在「語言」頁面依序加入你想支援的語系(如 zh-TW、en-US)。
  1. 自動插入標籤
  1. 驗證
  • 使用 https://search.google.com/search-console 的「URL 檢查」工具,輸入頁面網址,即可看到 Hreflang 標籤。

3️⃣ WPML 的 Hreflang 實作

  1. 安裝並啟用
  • 從 WordPress 外掛庫下載 WPML Multilingual CMS,包含「WPML String Translation」與「WPML Media Translation」。
  1. 設定語言與網址結構
  • 在 WPML → 語言中選擇「以子目錄方式」(zh-tw, en-us)。
  1. 開啟 Hreflang 功能
  • 前往 WPML → 設定 → 進階設定,勾選「在頁面標題上加入 hreflang 標籤」。
  1. 範例輸出

<link rel="alternate" hreflang="zh-TW" href="https://example.com/zh-tw/page1/" />
<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/page1/" />

  1. 測試
  • 透過「Google Search Console」的「結構化資料測試工具」確認標籤正確。

4️⃣ 常見誤區與排錯

  • 語系代碼不一致:記得使用 ISO 639‑1 + 國家/地區代碼(zh-TW、en-US)。
  • 子目錄未同步:若網站 URL 結構改動,務必更新 WPML 或 Polylang 的設定。
  • 重複標籤:確保每個語言版本只產生一次 <link rel="alternate">

5️⃣ 快速檢查清單

步驟 成功指標
插件已啟用且無錯誤訊息 ✔️
所有語言頁面都有 hreflang 標籤 ✔️
Search Console 無「重複內容」警示 ✔️

6️⃣ 資源連結

主題模板中注入 hreflang:PHP 與 Liquid 範例

主題模板中注入 hreflang:PHP 與 Liquid 範例

在多國語系的網站裡,hreflang 標籤告訴搜尋引擎每一個頁面對應的語言與地區。若你是用 WordPress、Drupal 或 Shopify 等 CMS,最直接、維護方便的做法,就是把這些標籤塞進主題模板,而不是在每個文章裡手動寫。

以下先說明兩種常見環境:

  • PHP:大多數自訂 WordPress 主題或 Drupal 範本都以 PHP 為主要語言。你只需要在 header.php 或相對應的模板檔案裡寫一段程式,動態產生 <link rel="alternate" hreflang="...">
  • Liquid:Shopify、Jekyll 這類採用 Liquid 的平台,則可透過變數與迴圈同樣做到自動化。Liquid 語法更貼近 Markdown,寫起來也比較輕鬆。

PHP 範例:WordPress 主題模板

下面的程式碼示範了在 WordPress header.php 裡加入 hreflang 的做法。先假設你已經把各語系對應的網址列成陣列,接著使用 foreach 產生標籤。

// 1. 定義各語系對應的 URL
$hreflang_links = [
'zh-Hant-TW' => get_permalink(), // 本頁本身的台灣繁體中文網址
'en-US' => str_replace('tw', 'us', get_permalink()), // 假設 US 版位於 /us/ 路徑
'ja-JP' => str_replace('tw', 'jp', get_permalink()),
'fr-FR' => str_replace('tw', 'fr', get_permalink()),
];

// 2. 迴圈輸出 <link> 標籤
foreach ($hreflang_links as $lang => $url) {
echo '<link rel="alternate" hreflang="' . esc_attr($lang) . '" href="' . esc_url($url) . '">', PHP_EOL;
} // 這樣會在 <head> 裡產生四行標籤

如果你想把語系資料放到自訂選項或多國語系插件(如 WPML、Polylang)裡,只要調整 $hreflang_links 的來源即可。這樣每次更新內容時, hreflang 會跟著自動同步,免除手動維護的麻煩。

Liquid 範例:Shopify 主題模板

在 Shopify 裡,你可以把語系資料寫成一個 JSON 陣列放進 config/settings_data.json 或直接寫在模板變數裡。下面示範的是在 theme.liquid<head> 區塊加入 hreflang。

{% comment %} 假設你已經有一個叫 site.translations 的設定 {% endcomment %}
{{ 'translations' | json }}

// 1. 定義語系對應網址(示範使用 storefront API)
{%- assign hreflang_links =
{
'zh-Hant': shop.url,
'en-US': shop.url | append: '/us',
'ja-JP': shop.url | append: '/jp',
'fr-FR': shop.url | append: '/fr'
} -%}

// 2. 輸出 <link> 標籤
{% for lang, url in hreflang_links %}
<link rel="alternate" hreflang="{{ lang }}" href="{{ url | escape }}">
{% endfor %}

在 Shopify 裡,Liquid 的迴圈語法很簡潔,而且你不必擔心 PHP 的安全性問題。只要把上述程式碼塞進 theme.liquid 或其他主題檔案,你就能一次產生所有 hreflang 標籤。

小結

  • PHP:適合 WordPress、Drupal 等傳統 CMS,利用陣列+迴圈快速生成標籤。
  • Liquid:適用 Shopify、Jekyll,語法更接近 Markdown,維護上也相當直覺。

把 hreflang 放進主題模板不只是 SEO 的小技巧,更是長期維護的好習慣。只要你把語系資料整理成結構化陣列(JSON、PHP 陣列等),再用迴圈產生 <link>,未來任何頁面都能自動擁有正確的 hreflang 標籤。

希望這份範例能幫你快速上手!

動態生成 hreflang 的技巧:API、JSON-LD 方式

API 先行取得 hreflang 資料

在多國語系網站裡,hreflang 標籤可以告訴搜尋引擎每個頁面對應的語言與地區。若網站內容經常更新,或是有大量頁面需要維護,手動寫入 <link rel="alternate"> 會很麻煩。

使用 API 的好處:

  • 集中管理:把所有語系對應資料放在一個服務端點,一次更新即可同步到所有頁面。
  • 即時性:每次請求都能拿到最新的 mapping,避免因緩存而產生錯誤。
  • 可擴充:若未來新增語言,只要在 API 裡加一筆資料就好,前端不需要改動任何程式碼。
建立 hreflang API
  1. 先決定 API 回傳格式,例如 JSON:
{
  "en-US": "/en-us/page.html",
  "zh-TW": "/tw/page.html",
  "fr-FR": "/fr/page.html"
} 
  1. 在伺服器端(例如 Node.js、PHP、Python)寫一個簡單的路由,回傳上述 JSON。

  2. 為安全與效能,可在 API 內部加入快取機制,例如 Redis 或檔案快取,避免每次請求都跑資料庫。

把 API 資料寫進 <head>

前端可以用 fetch 取得 JSON,再動態產生 <link> 標籤:

// 假設 API 位址為 /api/hreflang
fetch('/api/hreflang')
.then(res => res.json())
.then(data => {
const head = document.head;
Object.entries(data).forEach(([lang, url]) => {
const link = document.createElement('link');
link.rel = 'alternate';
link.hrefLang = lang;
link.href = url;
head.appendChild(link);
});
})
.catch(err => console.error('Hreflang API error:', err));

這段程式碼可以放在每個頁面的 <head> 內,或是透過模版系統(如 Twig、Blade)預先載入。

常見問題與解決方案
  • 跨域 (CORS):若 API 與前端不在同一個網域,需要在伺服器回傳 Access-Control-Allow-Origin: *,或是設定允許的來源。
  • 資料同步延遲:如果頁面已經產生且被搜尋引擎抓取,更新後的 hreflang 可能不會立即反映。建議在 API 回傳時加入 Last-Modified 標頭,並在 sitemap 裡標註更新時間。
  • 語言代碼錯誤:務必使用 ISO 639‑1 + ISO 3166‑1 的結合格式(如 en-US、zh-TW)。若有自訂代碼,搜尋引擎可能無法辨識。

JSON‑LD 方式直接嵌入 hreflang

除了 <link rel="alternate"> 的傳統寫法,Google 也支援使用 JSON‑LD 內建的 WebPage schema 與 urlTemplate,這樣可以把多國語系資訊封裝在一個 <script type="application/ld+json"> 裡。

為什麼要用 JSON‑LD?
  • 結構化資料:搜尋引擎會先解析 JSON‑LD,了解頁面屬性與語言關係。
  • 減少 HTML 改動:所有 hreflang 資訊集中在一段腳本裡,避免大量 <link> 標籤造成的臃腫。
  • 更易維護:前端只需要替換 JSON 內的 URL 或語言列表即可。

範例結構

{
  "@context": "https://schema.org",
  "@type": "WebPage",
  "url": "https://example.com/zh-tw/page.html",
  "inLanguage": "zh-TW",
  "name": "範例頁面",
  "alternateName": ["Example Page"],
  "sameAs": [
    {
      "@id": "https://example.com/en-us/page.html",
      "inLanguage": "en-US"
    },
    {
      "@id": "https://example.com/fr-fr/page.html",
      "inLanguage": "fr-FR"
    }
  ]
} 
在 WordPress / Drupal 等 CMS 裡動態產生 JSON‑LD
  • WordPress:在主題的 functions.php 裡寫一個 filter,抓取當前頁面語言並組裝上述結構,再印出 <script type="application/ld+json">

// 取得目前頁面的 URL 與語系(以 WPML 為例)
$url = get_permalink();
$lang = apply_filters('wpml_current_language', NULL);

// 建立多國語系對應表(可從 API 取)
$alternates = [
['@id' => 'https://example.com/en-us/page.html', 'inLanguage' => 'en-US'],
['@id' => 'https://example.com/fr-fr/page.html', 'inLanguage' => 'fr-FR']
];

$data = [
'@context' => 'https://schema.org',
'@type' => 'WebPage',
'url' => $url,
'inLanguage'=> strtoupper($lang),
'name' => get_the_title(),
'sameAs' => $alternates
];

echo '<script type="application/ld+json">'. json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) .'</script>';

  • Drupal:利用 Twig 模板,在 node.html.twig 裡使用 {{ page.url }} 及自訂變數產生 JSON‑LD。

注意事項

  • 正確的語言代碼:JSON‑LD 與 hreflang 一樣,必須使用 ISO 標準。若資料來源有誤,搜尋引擎可能忽略此段結構。
  • 避免重複標籤:如果同時使用 <link rel="alternate"> 與 JSON‑LD,確保兩者資訊一致,以免造成混淆。
  • 測試工具:可用 Google 的「結構化資料測試工具」或「Rich Results Test」確認 JSON‑LD 是否被正確解析。

常用插件快速上手:Yoast SEO、Rank Math 等的 Hreflang 功能

常用插件快速上手:Yoast SEO、Rank Math 等的 Hreflang 功能

如果你在 WordPress 上經營多國語系網站,Hreflang 是讓搜尋引擎知道各個版本對應關係的重要設定。幸好市面上有兩款超人氣的 SEO 外掛:Yoast SEO 與 Rank Math,它們都內建了自動產生 Hreflang 的功能,只要幾步驟就能搞定。

以下以實際範例說明,如何在 WordPress 站台上快速啟用並驗證這兩款插件的 Hreflang 功能。

前置作業:確認網站已設定多國語系

  • 在 WordPress 後台,先安裝並啟用一個多國語系外掛(例如 Polylang、WPML 或 qTranslate)。

  • 將每篇文章或頁面建立好不同語言版本,例如:

  • 確認每個語言版本都已正確連結,並且在「網址設定」中啟用「子目錄」或「子網域」的做法,以便 Hreflang 能辨識。

Yoast SEO:一鍵產生完整的 Hreflang 標籤

  • 安裝並啟用 Yoast SEO(建議使用最新版)。
步驟 1: 開啟多國語系支援
  1. 前往 <strong>SEO → 搜尋外觀</strong>
  2. 點擊「多國語系」分頁,將開關打到「是」。
  • Yoast 會自動偵測你已安裝的多國語系插件並列出可用選項。選擇你正在使用的插件(例如 Polylang)。
步驟 2: 設定 hreflang 規則
  • 在同一個分頁,勾選「自動產生 Hreflang 標籤」與「為每個語言版本標記正確的 hreflang」。
步驟 3: 儲存並檢查結果
  • 點擊右上角「儲存變更」。

你可以在任何一篇多國語系文章的原始碼裡看到類似以下的標籤:

<link rel="alternate" hreflang="en" href="https://example.com/en/about">
<link rel="alternate" hreflang="zh-TW" href="https://example.com/zh-tw/about">
<link rel="alternate" hreflang="ja" href="https://example.com/jp/about">

  • 若你想確認 Hreflang 是否正確,建議使用 Google Search Console 的「國際搜尋」工具或第三方檢測工具。

Rank Math:輕鬆設置並自訂 hreflang 表示方式

  • 安裝並啟用 Rank Math(同樣建議最新版)。
步驟 1: 啟用多國語言支援
  1. 前往 <strong>Rank Math → 一般設定</strong>
  2. 在「功能」區塊找到「多國語言(Hreflang)」,將開關打到「是」。
  • Rank Math 會自動偵測你已安裝的多國語系插件,並顯示可用選項。確認後點擊儲存。
步驟 2: 自訂 hreflang 標籤輸出
  • 前往 <strong>Rank Math → 搜尋引擎優化 (SEO) → Hreflang</strong>

    • 在「全域設定」中,你可以選擇是否使用 linkmeta 標籤;預設為 link
    • 若你需要支援更多語言或自訂國家代碼,可在此欄位手動加入,例如:zh-HK, en-GB 等。
步驟 3: 檢查實際輸出
  • 打開任何一篇多國語系文章,查看原始碼,你會看到像這樣的標籤:

<link rel="alternate" hreflang="en" href="https://example.com/en/about">
<link rel="alternate" hreflang="zh-TW" href="https://example.com/zh-tw/about">
<link rel="alternate" hreflang="ja" href="https://example.com/jp/about">

  • 若你想確認標籤是否符合 Google 的要求,請使用「國際搜尋測試工具」或第三方檢查器。

常見問題與排錯小技巧

  1. Hreflang 標籤沒有顯示:確定你已在 Yoast 或 Rank Math 的設定中啟用「自動產生」選項,並且多國語系插件已正確安裝。若還是沒出現,試著重新整理頁面或清除快取。

  2. 標籤中的 href 錯誤:這通常發生於使用子網域時,網址結構不一致。請確認多國語系插件的「URL 結構」設定與 Hreflang 標籤所用的一致。

  3. 搜尋引擎仍顯示錯誤:在 Google Search Console 的「國際搜尋」報告中,檢查是否有「缺少 hreflang 參考」或「重複設定」。若有,可進一步手動加入 <link rel="alternate"> 標籤於主題的 header 檔案。

  4. 多語言內容不一致:確保每個版本都有完整對應,否則搜尋引擎可能會將某些頁面視為重複內容。

小結與後續步驟

  • Yoast SEO 與 Rank Math 都能輕鬆產生 Hreflang 標籤,關鍵是先確定多國語系插件已正確安裝並設定。
  • 透過 Google Search Console 的「國際搜尋」報告持續監控,確保標籤保持最新且符合規範。

最後提醒:Hreflang 僅是跨國 SEO 的一環,還需要配合 hreflang 的語言代碼正確、網域或子目錄結構清晰,以及持續更新內容。祝你在多國市場順利發展!

排除 Hreflang 常見錯誤:從驗證到實際解決方案

最常見的 4 種 hreflang 錯誤與避免方式

以下整理了最常見的四種 hreflang 錯誤,以及實際上避免這些錯誤的方法。

1️⃣ 缺少自己語言版本的標籤

當你為多國站台設定 hreflang 時,往往會忘記為目前頁面本身加上一個自我參照(self‑ref)或是漏掉某一個地區版本。搜尋引擎會將此視為「重複內容」的潛在風險,可能導致該頁面被降權。

<link rel="alternate" href="https://example.com/zh-tw/" hreflang="zh-TW">
<link rel="alternate" href="https://example.com/en-us/" hreflang="en-US">
// 缺少 zh-HK 或 zh-CN 的標籤,或是忘記為本頁加上自我參照

避免方式

  • 先列出所有預計支援的語言/地區編碼,確保每個都出現在 hreflang 列表中。
  • 每一頁都要自行引用,例如在台灣版頁面加上 hreflang="zh-TW"

2️⃣ hreflang 與 URL 結構不一致

有時候你可能會把語言標籤寫對,但實際的網址卻跟這個標籤不相符,例如將台灣版頁面標記成 zh-CN,或是把英文美版標記為 en-GB。這樣搜尋引擎就無法判斷哪一個 URL 是哪種語言,結果會造成「混淆」。

<link rel="alternate" href="https://example.com/zh-tw/" hreflang="zh-CN"> <!-- 錯誤:標籤與網址不符 -->
<link rel="alternate" href="https://example.com/en-us/" hreflang="en-GB">

避免方式

  • URL 與 hreflang 必須一一對應;若使用子域名、路徑或查詢參數,確定兩者的關係清晰。
  • 建議建立「語言檢測表」,把每個 URL 的實際內容與預期語言做一次比對。

3️⃣ 不對稱的自我參照 (self‑ref) 或缺少回傳標籤

一個頁面只宣告「它有別人版本」卻沒有宣告自己是「這個語言」。例如台灣版頁面只列出 en-US、ja-JP 等,而沒說明 hreflang="zh-TW",或是英國版頁面只列出 zh-CN。搜尋引擎會把它當成一組不完整的 hreflang 集合,容易錯誤地將兩個不同語言的頁面視為同一份內容。

// 台灣版頁面:缺少自我參照
<link rel="alternate" href="https://example.com/en-us/" hreflang="en-US">
<link rel="alternate" href="https://example.com/ja-jp/" hreflang="ja-JP">

避免方式

  • 所有頁面都必須包含自己的語言標籤。
  • 使用「自我參照」的同時,確保所有對應版本也互相引用彼此。

4️⃣ 使用錯誤的語言/地區代碼或拼寫錯誤

ISO 639‑1(語言)與 ISO 3166‑1α2(國家)規範是固定不變的。常見錯誤有:

  • zh_cnen_us(使用小寫或缺少中劃線)。
  • ja-jp 拼成 jp-jajapan 等。
  • 混用簡化字和繁體字的區別,導致同一地區被分割。

<link rel="alternate" href="https://example.com/zh-tw/" hreflang="zh_cn"> <!-- 小寫且缺少 hyphen -->
<link rel="alternate" href="https://example.com/en-us/" hreflang="en-GB"> <!-- 地區錯誤 -->

避免方式

  • 使用官方文件確認每個代碼的正確寫法;常見代碼表可參考 IETF 官方或 Google Search Console 的建議。
  • 在專案開發初期就建立「語言編碼規範」檔,並在 CI 步驟中做校驗。

總結表

錯誤類型 常見表現 避免重點
缺少自己語言版本 沒有自我參照或漏掉某個地區 列出所有支援的語言,確保每頁都有自己標籤
URL 與 hreflang 不一致 標籤寫對但網址不符 確認 URL 路徑/子域名與 hreflang 完全匹配
不對稱的自我參照 只宣告他者版本,缺少自身標籤 所有頁面都要互相引用彼此
語言/地區代碼錯誤 小寫、缺少 hyphen 或混用簡繁字 使用官方 ISO 規範,建立 CI 檢查流程

工具推薦

  • Google Search Console → hreflang 工具:能快速看到哪個頁面缺失或錯誤。
  • Hreflang Checker(第三方):輸入 URL,即可列出所有標籤並檢查一致性。
  • CI 斷言腳本:在專案中加入簡易 Node / Python 腳本,驗證每個 .html 檔的 hreflang 是否符合規範。

使用 Google Search Console 與第三方工具驗證 Hreflang:步驟說明

這篇教學將帶你一步步透過 Google Search Console 與第三方工具,驗證網站的 hreflang 標籤設定是否正確。
我們會先說明在 GSC 裡能看到哪些錯誤訊息,再示範如何利用 Screaming Frog、Ahrefs 等工具做更深入的檢查與比對。

使用 Google Search Console 與第三方工具驗證 Hreflang:步驟說明

在多國語系網站中,hreflang 標籤告訴搜尋引擎每個頁面對應的語言與地區。若設定不當,可能導致重複內容、排名下降甚至被 Google 降權。以下分別說明如何利用 GSC 與第三方工具檢查並確定 hreflang 正確無誤。

步驟一:在 GSC 內確認 hreflang 設定
  • 登入 https://search.google.com/search-console,選擇你想驗證的屬性。<br/>- 從左側選單點擊「國際化」→「語言與地區」。這裡會列出所有被 Google 索引且含 hreflang 的 URL 及其對應關係。

若有錯誤,Google 會以紅色顯示並附上錯誤類型,例如:

  • 不一致的 hreflang:同一個 URL 在不同語言版本中宣告的 hreflang 不相符。<br/>- 缺少 hreflang:頁面沒有任何 hreflang 標籤,或標籤未正確連結到其他語言版本。
步驟二:使用「網址測試工具」檢查單一頁面
  • 在 GSC 左側選單點擊「覆蓋範圍」→「URL 測試」。<br/>- 輸入你想確認的 URL,按下「提交測試」。

Google 會顯示該頁面的 hreflang 標籤內容,並告知是否被索引。若標籤缺失或格式錯誤,畫面上會以紅色提示。

步驟三:利用第三方工具進一步檢查
  1. Screaming Frog SEO Spider<br/> - 下載並安裝(免費版可抓取 500 個 URL)。<br/> - 在「設定」→「爬蟲」中啟用「語言 & hreflang」選項。<br/> - 輸入網站根域,開始抓取。<br/> - 抓完後點擊「報表」→「hreflang」。可看到每個頁面宣告的 hreflang 與實際 URL 的對照表。

  2. Ahrefs Site Audit(或 SEMrush SEO Checker)<br/> - 建立一個新的 Site Audit 專案,輸入網站 URL。<br/> - 在「技術」報表中尋找「Hreflang Errors」。<br/> - 這些工具會列出缺失、重複或錯誤的 hreflang 標籤,並附上修正建議。

步驟四:分析結果與修正建議
  • 不一致的 hreflang:檢查每個語言版本的標籤,確保它們都互相宣告對方。<br/> 例如,台灣版 https://example.com/zh-tw 應宣告 hreflang="en-us" href="https://example.com/en-us",同時英美版也要宣告回台灣。

  • 缺少 hreflang:在該頁面頭部加入完整的 <link rel="alternate" hreflang="xx-YY" href="...">。<br/> 你可以先用 GSC 或第三方工具提供的 URL 列表,批量生成標籤。

  • 循環引用:避免 A 認定 B 為同一語言,而 B 又認定 C,最後回到 A。保持宣告鏈條的單向性即可。

小結

透過 GSC 與 Screaming Frog、Ahrefs 等工具,你可以快速定位 hreflang 的錯誤類型並進行修正。記得在完成修改後,再次使用 GSC 的「網址測試」或「國際化報表」確認問題已消失,確保搜尋引擎能正確理解你的多語系網站。

同一語系重複內容:如何正確設定 canonical + hreflang

同一語系重複內容:如何正確設定 canonical + hreflang

在多國語系網站中,最常見的錯誤之一就是同一語言下出現大量重複內容。這通常是因為網址參數、追蹤碼、或不同的檔案結構造成的。雖然 Google 已經能夠辨識大部分情況,但如果不正確使用 canonical 與 hreflang,仍會影響搜尋結果與排名。

為什麼同一語系重複內容會成問題

  • 讓爬蟲分散抓取資源,降低整體收錄效率。
  • 造成關鍵字競爭,同一頁面被多個 URL 收錄時,排名可能被稀釋。
  • 使用者在搜尋結果中看到相同內容的不同連結,會產生混淆與不信任感。

canonical 與 hreflang 的角色分工

  • canonical:告訴爬蟲哪一個 URL 是「主」版本。所有重複或變體都應指向此主 URL,避免內容被視為重複。
  • hreflang:告訴搜尋系統同一語言/區域的多個版面互相對照。它不會取代 canonical,而是補充語意資訊,以便在不同地區顯示正確版本。

常見錯誤與其後果

  • 把所有同語系頁面都設為相同的 canonical:這樣即使有 hreflang 標記,搜尋引擎仍會將多個版本合併成一個,造成地區版位被忽略。
  • 只在主 URL 放置 hreflang,而其他變體沒有:Google 可能無法正確判斷各語言之間的關聯,導致跨國搜尋結果混亂。
  • 使用動態參數 (e.g. ?utm_source=…) 作為 canonical:這會把追蹤碼視為主 URL,使得其他參數化頁面無法聚合到正確版本。

正確設定步驟

1️⃣ 辨識重複集合:先利用 Google Search Console 或網站內部搜尋,找出同一語言下不同 URL 但內容相同的頁面。常見例子:

  • /zh-hant/product?id=1234
  • /zh-hant/product?sessionid=abcd
    2️⃣ 選擇主版本:通常以乾淨、無參數且易於分享的 URL 為主,例如 /zh-hant/product/1234
    3️⃣ 加入 canonical 標籤:在所有非主版本頁面中,放入指向主 URL 的 <link rel="canonical" href="https://example.com/zh-hant/product/1234">
    4️⃣ 確保 hreflang 放置完整:無論是主版本還是變體,都應在 <head> 內包含對所有語言/區域版面的 hreflang 標記,例如:
<link rel="alternate" href="https://example.com/zh-hant/product/1234" hreflang="zh-Hant-TW">
<link rel="alternate" href="https://example.com/en-us/product/1234" hreflang="en-US">
<link rel="alternate" href="https://example.com/jp-jp/product/1234" hreflang="ja-JP">

5️⃣ 測試驗證:使用 Google Search Console 的「URL 檢查」功能,輸入主版本 URL,確認搜尋引擎能正確讀取 canonical 與 hreflang 標籤;同時利用第三方工具(如 Screaming Frog)抓取並檢視標記是否一致。

測試與確認

  • URL 檢查:在 Google Search Console 裡輸入主 URL,查看「頁面索引」報告,確保沒有重複內容警示。
  • hreflang 工具:Google 提供的 hreflang 標籤測試工具,能顯示各語言版面之間的連結關係是否完整。
  • 網站抓取:使用爬蟲軟體抓取多個版本,確認每個頁面的 <head> 中都有相同的 hreflang 標籤;若有缺漏,請回到步驟 4 修正。

小結

  • canonical 與 hreflang 雖然都處理「不同 URL 的關係」,但目的不一:canonical 針對內容重複問題,hreflang 則是語言/區域定位。
  • 在同一語系下使用 canonical 時,一定要保留 hreflang 標籤於每個版本,避免搜尋引擎忽略地區差異。
  • 定期檢查網站的 URL 結構與標籤設定,確保沒有因新增參數或重寫規則而造成新的重複問題。

只要遵循這套流程,就能把同一語系的重複內容帶入正確的搜尋體驗,同時也讓使用者在不同地區看到最貼切、最適合自己的頁面。

快取導致 Hreflang 被忽略?緩存層面排查技巧

在多國語系網站中,Hreflang 標籤告訴搜尋引擎每個頁面的目標語言與地區。但若快取機制未正確處理,這些標籤可能被忽略,造成搜尋結果錯亂。

快取層面排查技巧

  1. 檢查 CDN 或代理伺服器的快取設定
  • 確認是否將 <link rel="alternate" hreflang=…> 標籤所在的 HTML 頁面設為長期快取。若是,搜尋引擎機器人可能只抓到第一次快取的版本。

  • 例:在 Cloudflare 的 Page Rules 裡,將 Cache Level 設成 Bypass Cache on Cookie 或使用「Edge Cache TTL」設定為較短時間,並開啟 “Respect Existing Headers”

  1. 確認 HTTP 回應頭中的快取相關標頭
  • Cache-Control: no-cache, must-revalidate

  • Pragma: no-cache

  • 如果這些標頭缺失,瀏覽器或搜尋機器人可能會使用已存在的快取版本。

  1. 觀察伺服器端的 Vary 標頭
  • Vary: Accept-Language, Cookie

  • 當你在同一個 URL 上提供多語言內容時,必須告訴快取系統「根據這些標頭變化」才重新產生。

  1. 利用 curl 或瀏覽器 DevTools 觀察實際回應
  • 範例:

  • curl -I https://example.com/zh-tw/page.html

  • 查看 x-cache-status(若使用 Varnish)或類似的自訂標頭,確認是否為 HITMISS

  1. 清除快取並重新測試
  • 在 CDN 控制台執行「Purge URL」或「Purge Everything」。

  • 之後使用 Google Search Console 的 URL 檢查工具,手動索引該頁面,看是否仍顯示錯誤。

  1. 確保 robots.txt 或 meta 標籤不阻擋搜尋機器人抓取不同語言版本
  • 例如:<meta name="robots" content="noindex, nofollow"> 可能會讓搜尋引擎忽略 Hreflang。
  1. 測試多國語系標籤的完整性
  • 使用 Screaming Frog 或 Sitebulb 的「Hreflang」功能,產生報告並確認每個頁面都有對應的 <link rel="alternate" hreflang=…>。若缺失,快取層可能只傳送了一個版本。

常見錯誤排除範例

  • 案例 1:CDN 預設快取所有頁面

    • 解決方案:在 CDN 中為 Hreflang 標籤所在的頁面加上 Cache-Control: private, max-age=0 或使用「Edge Cache TTL」設定為 0 秒。
  • 案例 2:伺服器回傳相同的 HTML 給所有語言

    • 解決方案:在後端程式碼中根據 Accept-Language 或 URL 前綴動態產生對應的 <link rel="alternate" hreflang=…>,並加入正確的 Vary: Accept-Language

小結

  • Hreflang 被快取忽略,多半是因為快取層沒有考慮到語言差異。透過檢查 HTTP 標頭、調整 CDN/伺服器設定,以及定期清除快取,即可讓搜尋機器人正確讀取多國語系標籤。

進階策略:多國語系 + 地區設定、Canonical 同步與跨平台一致性

同一國家不同語言的處理方式

同一國家不同語言的處理方式

在搜尋引擎面對同一個國家但多種語言的網站時,正確設定 hreflang 與 canonical 能幫助爬蟲判斷哪一版內容最適合使用者,同時避免重複內容被視為作弊。

1. 為何需要 hreflang?

  • 確保使用者看到的語言版本與其瀏覽器設定或地理位置相符。
  • 防止同一篇文章以不同語言重複,降低被搜尋引擎判定為 duplicate content 的風險。

2. hreflang 與 canonical 的協調

  • hreflang:告訴搜尋引擎此頁面有多個語言版本,並指出每個版本的目標國家/地區。
  • canonical:指向「主體」或「首選」版,以避免內容重複被拆分成多個獨立索引。

兩者搭配時,常見做法是:

  • 每一個語言版本都在 <head> 放置對應的 hreflang 標籤,並且指向所有其他版本(含自己)。
  • 同時,在每個頁面加上 canonical 指向 同語言、同國家 版的原始 URL。例如,日文版會把 canonical 指向 https://example.jp/ja/page.html

3. 範例:日本網站同一國家不同語言

以下為 index.html 的 hreflang 標籤範例:

<link rel="alternate" hreflang="ja-JP" href="https://example.jp/ja/page.html">
<link rel="alternate" hreflang="en-US" href="https://example.jp/en/page.html">
<link rel="alternate" hreflang="zh-CN" href="https://example.jp/zh-cn/page.html">
<link rel="canonical" href="https://example.jp/ja/page.html">

在 sitemap.xml 裡,同一個頁面的多語言版本也要列出:

<url>
  <loc>https://example.jp/ja/page.html</loc>
  <xhtml:link rel="alternate" hreflang="en-US" href="https://example.jp/en/page.html" />
  <xhtml:link rel="alternate" hreflang="zh-CN" href="https://example.jp/zh-cn/page.html" />
</url>
<url>
  <loc>https://example.jp/en/page.html</loc>
  <xhtml:link rel="alternate" hreflang="ja-JP" href="https://example.jp/ja/page.html" />
  <xhtml:link rel="alternate" hreflang="zh-CN" href="https://example.jp/zh-cn/page.html" />
</url>
<url>
  <loc>https://example.jp/zh-cn/page.html</loc>
  <xhtml:link rel="alternate" hreflang="ja-JP" href="https://example.jp/ja/page.html" />
  <xhtml:link rel="alternate" hreflang="en-US" href="https://example.jp/en/page.html" />
</url>

4. 跨平台一致性檢查表

  • 桌面版與手機版:兩者必須共用相同的 hreflang 與 canonical 標籤。若手機版使用 rel=amp,也要在 AMP 頁面加入相同標籤。
  • 多域名或子域名:如 example.comjp.example.comen.example.com,每個域名都應該包含完整的 hreflang 列表,並將 canonical 指向各自語言版本的主頁面。
  • CMS 版型切換:使用 CMS 的多語言模組時,要確保在生成任何 HTML 時自動插入正確標籤。可透過模板或插件完成此步驟。

常見陷阱

  • 漏掉 hreflang:若只設定 canonical,搜尋引擎可能把多語言版當成重複內容;請務必在每個頁面加上完整的 <link rel="alternate">
  • canonical 指向錯誤:如果 canonical 指向了另一個語言版本,就會造成索引混亂。確認指向相同語言、相同國家或地區的 URL。

小結

正確的 hreflang 與 canonical 配合,能讓搜尋引擎清楚知道每一種語言版本的目標受眾,同時避免重複內容問題。只要在設計網站結構時就把這兩個標籤納入考量,再透過定期檢查與修正,就能確保多國、多語言站點在搜尋結果中表現穩健。

地區定位(e.g., US vs. CA)與 hreflang 的結合

地區定位與 hreflang 的結合說明

在多國語系網站上,單純設定語言(如 zh‑TW, en‑US)往往不足以精準對應不同地區的搜尋需求。若你同時要面向美國(US)與加拿大(CA)的使用者,就必須把「地區」跟「語言」一起考量,才能避免內容重複、降低跳失率、提升搜尋排名。

舉例來說:

  • 美國的使用者習慣用 "USD" 進行付款,搜尋關鍵字常帶 "credit card";
  • 加拿大則偏好「CAD」與「Visa」並列,且搜尋時會加上 "shipping to Canada"。

若只設定 en‑US 與 en‑CA 而不加入區域標記,就可能讓 Google 把兩國的頁面混在一起,導致美式內容被加拿大使用者看到,而結果不符合他們需求。

如何寫 hreflang 與 geotargeting 的結合標籤

  • 語言+區域<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/">
  • 純語言(無特定區域)<link rel="alternate" hreflang="en" href="https://example.com/en/">

如果你想讓 Google 只在美國顯示 us.example.com,而加拿大則顯示 ca.example.com,可以在各自頁面加上 geotargeting 標籤:

<link rel="alternate" hreflang="en-US" href="https://us.example.com/">
<link rel="alternate" hreflang="en-CA" href="https://ca.example.com/">

另外,若使用 Sitemap 方式管理,你可以在 sitemap.xml 裡加入 <xhtml:link> 標籤,同時配合 <?xml version="1.0" encoding="UTF-8"?>。示例:

<![CDATA[

   <url>
     <loc>https://example.com/en-us/</loc>
     <xhtml:link rel="alternate" hreflang="en-US" href="https://us.example.com/"/>
     <xhtml:link rel="alternate" hreflang="en-CA" href="https://ca.example.com/"/>
   </url>

]]>

常見錯誤與排除技巧

  • 重複 hreflang:確保每一個語言/區域組合在整站只出現一次,否則搜尋引擎會混淆。

  • 缺少自我參照:所有 hreflang 列表都必須包含自己的 URL,Google 會用這項來判斷完整性。例如,美國頁面應該同時列出自己(en‑US)以及其他相關語言/區域。

  • Canonical 與 hreflang 衝突:若你在某頁使用 <link rel="canonical"> 指向另一個語言版本,Google 會把這兩者視為同一內容。確保 canonical 僅對相同語言/區域的主頁面指向,而非跨語言。

小結表格

站點 hreflang geotargeting 目的 範例 URL
US en-US 美國 提供美式購物體驗 https://us.example.com/
CA en-CA 加拿大 支援加拿大貨幣與稅務 https://ca.example.com/
全球 en 無區域 針對不特定國家使用者 https://example.com/en/

Canonical 與 Hreflang 的協調:避免 SEO 冲突

在多國語系網站中,Canonical 與 Hreflang 雖說都是搜尋引擎優化的關鍵工具,但若兩者設定不一致,就會產生「衝突」,導致頁面被視為重複內容或無法正確呈現給不同地區使用者。
本文將以實際案例說明,如何在設定時先確認 Canonical 的主體,再同步 Hreflang 標籤,最後用工具驗證兩者協調得宜,以免讓搜尋引擎和使用者都產生困擾。

Canonical 與 Hreflang 的協調:避免 SEO 衝突

為什麼兩者會衝突?
  • Canonical 用來告訴搜尋引擎「這裡是最正確、最主要的版本」,若同一內容在多個語言頁面都有,搜尋引擎就可能只抓取其中一個。
  • Hreflang 則是在告訴搜尋引擎「這些頁面針對不同國家或語言使用者」;如果 Hreflang 指向的 URL 與 Canonical 不一致,搜尋引擎會感到困惑:到底哪一個是主頁?
先確定重點頁面,設定 Canonical
  • 步驟 1:挑選每個產品或文章最適合的「主版本」(通常是針對全域使用者的原始語言)。
  • 步驟 2:在該主版本的 <head> 加入 <link rel="canonical" href="https://example.com/zh-hant/product-123">
  • 步驟 3:其他地區或語言頁面,使用相同 URL 作為 Canonical,但依照 Hreflang 的規則指向各自的本地化頁面。
同步 Hreflang 與 Canonical

以下是一段典型的標記範例:

  • 主頁 (繁體中文) :
<link rel="canonical" href="https://example.com/zh-hant/product-123">
<link rel="alternate" hreflang="en-us" href="https://example.com/en-us/product-123" />
  • 英文頁面 :
<link rel="canonical" href="https://example.com/zh-hant/product-123">
<link rel="alternate" hreflang="zh-Hant" href="https://example.com/zh-hant/product-123" />

這樣的做法讓搜尋引擎知道:無論使用者點進哪個語言版本,最終內容都是同一篇,而 Hreflang 則告訴它們該顯示哪一版本給哪些使用者。

常見錯誤與修正建議
  • 重複的 Canonical:不同語言頁面都設定各自 URL 為 Canonical,搜尋引擎會把所有版本視為獨立主頁。解決方法是統一指向原始語言頁面。
  • 缺少 Hreflang 或錯位:如果某個語言頁面沒有相對應的 <link rel="alternate" hreflang=…>,搜尋引擎就無法辨識其目標族群。確保每個版本都至少有一條完整標籤。
  • 使用子域或子資料夾不一致:如 zh-hant.example.comexample.com/zh-hant/ 混用,會造成重複內容。選擇一種結構並在全站統一使用。
工具檢查與驗證
  • Google Search Console:利用「HTML 標記」工具查看 Hreflang 是否正確解析。
  • Screaming Frog SEO Spider:設定抓取時開啟「Canonical」與「Hreflang」屬性,檢視是否有不一致的情況。
  • Command Line (curl + grep):快速驗證特定 URL 的 <link> 標籤,例如 curl -s https://example.com/zh-hant/product-123 | grep -i hreflang

小結

Canonical 與 Hreflang 雖各自負責不同層面,但在多國語系網站中,它們必須「手牽手」協作:先確定主頁的 Canonical,再同步每個地區版的 Hreflang,最後用工具驗證無誤。只要遵循這三步,搜尋引擎就能順利辨識內容,使用者也不會因重複或錯位標籤而迷失方向。

多語系 CMS 在大型站群中的實務操作與最佳化

為什麼大型站群需要多語系 CMS

在全球化的今天,網站如果只提供單一語言,很容易失去大量潛在客戶。透過多語系 CMS(內容管理系統),可以一次性管理不同語言版本,確保文字、圖片、連結都保持同步,減少人工錯誤。

URL 與資料結構設計

  • 子域名:例如 zh.example.comen.example.com。優點是域權重分離;缺點是需要額外維護多個 DNS 記錄。
  • 子目錄:例如 example.com/zh/example.com/en/。較易設定,且所有頁面共享同一個主網域權重。

範例 URL(子目錄):

  • 商品頁: https://www.example.com/zh/product/12345
  • 文章頁: https://www.example.com/en/blog/how-to-use-cms

Hreflang 實作技巧

  1. HTML 標籤(放在 <head>):
<link rel="alternate" hreflang="zh-Hant-TW" href="https://www.example.com/zh/product/12345" />
<link rel="alternate" hreflang="en-US" href="https://www.example.com/en/product/12345" />
  1. XML Sitemap(建議同時使用):
<url>
  <loc>https://www.example.com/zh/product/12345</loc>
  <xhtml:link rel="alternate" hreflang="en-US" href="https://www.example.com/en/product/12345" />
  <xhtml:link rel="alternate" hreflang="ja-JP" href="https://www.example.com/ja/product/12345" />
</url>
  1. 注意事項:
  • hreflang 必須包含完整語言與地區代碼(例如 zh-Hant-TW)。
  • 所有版本必須相互鏈結,否則搜尋引擎會視為孤立頁面。

Canonical 與跨平台同步

在同一個產品可能存在多個語言與地區版本時,需要確定哪一個是「原始」或「首選」版。建議:

  • 每個語言版本都設置自己的 canonical,指向該語言的主頁面。
  • 例如:
<link rel="canonical" href="https://www.example.com/zh/product/12345" />
  • 若有多平台(如 Web、APP)同一內容,請在 APP 內部也放置相同的 canonical,確保搜尋引擎不重複抓取。

性能優化與快取策略

  • CDN:將靜態資源(圖片、JS、CSS)分發到全球節點,降低延遲。
  • Lazy Load:對於長頁面,只在用戶滾動至該區域時載入圖像,可減少首屏渲染時間。
  • 壓縮與合併:使用 Gzip 或 Brotli 壓縮 HTML、CSS 與 JS,並盡量將檔案數量降到最低。
  • 瀏覽器快取:在 HTTP 標頭中設定 Cache-Control: max-age=31536000(1 年),讓重複訪客直接使用本地緩存。

常見錯誤排除與測試工具

  • Google Search Console:在「國際定位」報告中查看 hreflang 錯誤。
  • Hreflang Checker:輸入 URL,即可顯示所有已設置的 hreflang 與其對應頁面,方便快速確認是否完整相互鏈結。
  • Screaming Frog SEO Spider:抓取網站後,使用「國際化」功能查看語言版本分佈與 canonical 設定,特別適合大型站群的全域檢查。

案例分享:某電商站群的實戰經驗

  • 背景:台灣本土電商公司欲擴展至日本、韓國及美國市場。網站原先只有繁體中文,後來新增日文、韓文、英文。
  • URL 策略:採用子目錄方式(example.com/zh/example.com/en/ 等),因為主域權重較高且便於管理。
  • CMS 設定:使用 WordPress Multilingual 插件,將每個產品的 SKU 與價格同步至各語言版本。透過自動化腳本,每次更新中文內容時,系統會自動產生相應語言的變更檔案。
  • Hreflang 實作:在所有頁面上加上 hreflang 標籤,並在 sitemap 中完整列出。結果顯示,Google 在搜尋結果中正確顯示對應國家/地區的語言版本,流量提升 35%。
  • Canonical 同步:每個語言版本都設置自己的 canonical 指向同一語言頁面;若有跨平台(Web 與 APP)同步內容,也在 APP 內部使用相同 URL 的 canonical,以免搜尋引擎將兩者視為重複。
  • 性能優化:啟用 Cloudflare CDN,並使用 WebP 圖片格式。Lazy Load 在產品列表頁面中實現後,首屏渲染時間下降 20%。

小結

多語系 CMS 的關鍵在於「一致性」與「同步」。只要確保 URL 結構規範、hreflang 與 canonical 正確設置,再配合 CDN 與快取,便能讓大型站群在各國搜尋結果中脫穎而出。