Hreflang 產生器會將最多 100 列「語系地區 | 完整網址」配對,轉換成一組一致且經過 HTML 跳脫處理的 rel=alternate link 元素,讓語言叢集中每個頁面的 head 區塊皆可直接使用。每一列會恰好產生一個 link 標籤,語系地區採用標準大小寫形式 (en-us 會變成 en-US,zh-hant 會變成 zh-Hant),同時對屬性中敏感的字元 (例如 & 符號) 進行跳脫,以便安全地貼入標記中。此工具接受兩個字母的語言代碼、可選的四個字母文字子標籤,以及可選的兩個字母地區代碼;此外也可接受一個代表 x-default 的權杖,用來標記設定不符合任何列出的替代版本時的後備頁面。重複的語系地區值會以不區分大小寫的方式被拒絕,相對網址與 scheme-relative 參照也會被拒絕,若包含驗證資訊或片段識別碼,則整組結果會直接失敗,而不是產生一個可能被複製卻悄悄漏掉某個國家版本的局部區塊。由於單一 hreflang 標籤並無對應項目,最少需要兩列,而產生的區塊必須在每個替代頁面上完全相同地安裝,這樣自我連結與回傳連結才能被爬蟲正確解析。

對於已經了解 hreflang 是什麼,現在需要大規模部署標籤的團隊來說,實際的工作流程是:先收集所有等效的在地化網址,使用 Hreflang 產生器 產生一個區塊,然後將同一個區塊貼到叢集中每個頁面的 head 中。如需進一步了解 hreflang、canonical 標籤與國際 SEO 架構之間的關係,《什麼是 SEO 中的 hreflang 以及如何實作》指南會說明本產生器所建構的概念基礎。

hreflang generator bulk
hreflang generator bulk

「批次」對 hreflang 產生器而言的意義

大多數多語系網站每個內容項目所推出的語言與地區版本都遠不只少數幾個,因此實際的 hreflang 工作很少只涉及一兩個頁面。某個北美零售商的產品頁可能同時提供英文 (en)、加拿大英文 (en-CA)、法文 (fr) 與加拿大法文 (fr-CA);某個軟體說明文件中心可能再加上德文 (de)、瑞士德文 (de-CH)、西班牙文 (es)、巴西葡萄牙文 (pt-BR),以及一個作為 x-default 後備的通用英文登陸頁。若針對每個叢集手動輸入 link rel="alternate" hreflang="..." href="...",很快就會出錯:大小寫飄移、& 符號未跳脫、某列重複,或是局部貼上時悄悄漏掉某個市場。批次式做法意味著:一次輸入所有在地化網址、取得一組經過驗證且已跳脫的區塊,然後將同一個區塊貼到每個替代頁面,使整個叢集共用相同的 head 區段。

產生器接受的列格式

每一列輸入僅允許一個分隔符號,也就是垂直線 (|),其左側為語系地區標籤,右側為完整的絕對網址。語系地區輸入遵循較為嚴格的格式:兩個字母的語言代碼,接著可選的四個字母文字子標籤,再接著可選的兩個字母地區代碼。下表列出工具可辨識的模式,以及各模式出現在產生的 link 元素中所代表的意義。

模式意義
fr通用法文頁面,適合作為所有法語區域的後備
fr-CA加拿大使用的法文
en-US美國使用的英文
zh-Hans簡體中文書寫系統
zh-Hant繁體中文書寫系統
x-default設定不符合任何列出的替代版本時的後備頁面

網址必須包含 http 或 https 配置與主機,因此 https://example.com/fr/ 會通過,而 //example.com/fr/ 則不會通過。諸如 #section 的片段識別碼,以及像 user:pass@host 這類內嵌的驗證資訊,都會被拒絕。瀏覽器的網址解析器會在輸出前先將位址標準化,因此結尾斜線與主機大小寫會遵循網址慣例,而不是輸入的原始形式。透過 Intl.getCanonicalLocales 完成標準化後,每個語系地區都會以正確的混合大小寫形式呈現,這也是大多數爬蟲預期看到的大小寫。

如何批次產生 hreflang 區塊

  1. 盤點所有等效的在地化頁面,包含目前正在編輯的頁面網址,並且只在確實存在後備頁面 (例如國家選擇器或通用登陸頁) 時,才新增一個真正的 x-default 列。
  2. 每一列以「語系地區 | 完整網址」的格式獨立輸入,例如 en-US | https://example.com/en/,然後 fr-CA | https://example.com/fr-ca/,接著 x-default | https://example.com/。
  3. 確認至少有兩列、且不超過一百列,沒有重複的語系地區、沒有相對或 scheme-relative 網址,也沒有片段識別碼或驗證資訊。
  4. 產生已跳脫的 link 區塊,複製一次,然後將完全相同的區塊貼到叢集中每個頁面的 head,使每個頁面都列出自身以及其他所有替代版本。
  5. 從每個語系地區各抓取一個樣本進行檢查,確認每個頁面都回傳 HTTP 200 並顯示預期內容,並驗證自我連結與對等的回傳連結都能在整個叢集中正確解析。

產生器套用的驗證規則

產生器不會靜悄悄地修正錯誤的輸入;當發現問題時,它會讓整組結果失敗,以避免複製出去的區塊在缺少某個國家版本的情況下仍被使用。每次提交時所強制執行的規則包括:每一列僅能有一個分隔符號,且兩側皆不可為空;語系地區必須符合 language[-script][-region] 格式,並能透過 Intl.getCanonicalLocales 完成標準化;最多只能有一列 x-default;經過不區分大小寫的標準化後,不得出現重複的語系地區值;網址必須為絕對的 http 或 https 格式,且不得包含驗證資訊或片段識別碼;總列數介於二到一百之間。此工具僅驗證語系地區標籤的格式,而不會檢查特定搜尋引擎所支援的完整 ISO 639 與 ISO 3166 註冊資料,因此一個結構上合規的代碼 (例如 xx-AA) 仍可能不被支援或不適合實際的受眾使用;在部署之前,應根據 Google 現行說明文件與實際讀者群來驗證每一個預計使用的語言與地區。

同樣的「整組失敗」行為也套用於產生器所測試的八個符合標準的固定樣本,這些樣本涵蓋通用語言、地區大小寫、德文與法文地區、簡體與繁體中文文字標籤、語言加文字加地區的組合,以及 x-default。其他測試則會斷言精確的 HTML 跳脫結果,並拒絕重複列、相對網址、片段識別碼、驗證資訊,以及不完整的一列組合,這就是為什麼缺少對應項目時複製按鈕會保持停用,而不是產生一條永遠不會被爬蟲採納的單行標籤。

在每個替代頁面上安裝相同的組合

Hreflang 是本質等效頁面之間的一種有向關係,而 Google 的在地化版本說明文件 將自我連結與回傳連結都描述為必要的信號。單向的宣告可能會被忽略,因為任何其他網站都不應能單方面宣稱您的頁面是其替代版本,這代表如果只有英文頁面引用法文版本,而反向並未引用,則叢集會喪失大部分的信號價值。實際的工作流程是:將產生器所產生的單一區塊複製到叢集中每個在地化頁面的 head 中,而非僅僅複製到 canonical 頁面,如此一來每個頁面都會以相同的屬性列出自身以及其他所有替代版本。

本工具僅會產生 head 區段中的內容;HTTP 標頭與 XML sitemap 皆不會主動產生。Google 將這三種實作方式視為等價,而同時維護多份相同的宣告容易產生難以除錯的漂移,因此團隊應挑選其發佈系統能保持完整且同步的單一方式,而不是同時將叢集分散於 head 元素、HTTP 標頭與 sitemap 之間。選擇 HTML head 元素適合具有樣板化渲染層的網站;選擇 sitemap 則適合擁有上千個在地化網址、難以讓每個頁面 head 保持同步的網站。

部署後驗證自我與回傳連結

產生器無法連線到實際網站,因此驗證已安裝的區塊是一個獨立的步驟,需在貼上之後另外手動執行。一條實用的驗證路徑是:從叢集中的每個語系地區各取一個樣本頁面,確認每個頁面皆回傳 HTTP 200 並顯示預期內容,接著檢查每個頁面的 head 區段,確認 hreflang 區塊除了自我參照之外完全一致 (自我參照之所以存在,是因為目前頁面已被納入為其中一列)。下一個檢查項目是確認從頁面 A 所參照的每個其他語系地區,也都反向參照回頁面 A,這就是對等的回傳連結;每當新增、移除、重新導向或將某個語系地區移至新的 canonical 網址時,都應從頭重新產生整個叢集。

對於多語系規模極大的網站而言,100 列的上限對大多數叢集來說已相當充裕,但並非無限大;規模極大的網站可能需要將單一內容項目拆分為子叢集,或分階段送入產生器。x-default 並不代表任何語言,而是用來識別一個提供給設定不符合任何列出之替代版本的使用者的頁面;任何組合中只能出現一列 x-default。國家代碼不能單獨出現在第一位,因此 CA | https://example.com/ca/ 會被拒絕,因為第一個子標籤代表的是語言;但它們可以作為地區位置出現,例如 en-CA | https://example.com/en-ca/。當簡體與繁體中文受眾需要不同的網址時,文字子標籤 (例如 zh-Hans 與 zh-Hant) 正是區分書寫系統的正確工具。當同時存在多個國家特定的法文版本時,通用語言頁面 (例如 fr) 可作為有用的後備,為目標地區之外的使用者提供合理的預設結果,而不是一個不相符的登陸頁。

貼上之前值得了解的限制

批次式 hreflang 產生刻意採取向失敗大聲的方式,讓已部署的區塊絕不會悄悄漏掉某個國家或地區。產生器所強制執行的每一項限制,都是為了讓叢集中完全相同的副本保持誠實:列格式可避免分隔符號意外漂移;語系地區的標準化可讓整個叢集的大小寫保持一致;網址標準化會拒絕相對網址與含片段的輸入,否則這些輸入會產生含混不清的替代目標;而重複拒絕機制則會阻止兩個列同時宣告同一個語系地區。WHATWG 的 alternate links 規範定義了產生器所依賴的 rel=alternate 與 hreflang 屬性,而產生的標籤區塊應被視為頁面之間的一種關係契約,而不是對任何單一頁面的指令,因為只有在叢集中的每個成員都遵守時,這個信號才具有意義。

如需深入了解,請參閱 htaccess 大量轉換至 Nginx:工具對應的內容