hreflang 產生器 API 替代方案是一種瀏覽器端工具,能產生與託管 API 相同的跳脫 HTML 連結區塊,但將每一列語系資料保留在使用者的裝置上、將語系大小寫標準化(en-us 變成 en-US,zh-hant 變成 zh-Hant),並且每組接受兩到 100 個完整的網址。輸出是一組一致的 HTML alternate-link 元素,涵蓋語言叢集中每一個本地化頁面,再加上可選的 x-default fallback 列,產生過程中會對 & 號及其他屬性敏感字元進行 HTML 跳脫。由於資料列不會離開工作站,這個工作流程避免了 API 速率限制、憑證處理,以及 HTTP 請求的來回延遲。最終結果是一個可直接放入 head 的程式碼片段,每個 alternate 頁面都能原封不動地發布,確保 self 與 return 連結在整個叢集中保持同步。

這種做法適合已經在試算表或 CMS 匯出檔中維護語系清單的團隊,特別是希望在每季稽核期間同時重新產生所有區域網站時,能在不依賴託管服務的情況下獲得相同輸出。

hreflang generator api alternative
hreflang generator api alternative

為什麼團隊在尋找 hreflang 產生器 API 替代方案

大多數程式化的 hreflang 設定都從腳本開始:從 CMS 讀取語系清單、建立完整網址的陣列、使用 API 金鑰向託管端點發送 POST 請求,再把 JSON 回應解析回 head 中的 link 元素。前幾個叢集這樣做沒問題,但摩擦很快就會出現。權杖會過期。在下一次爬取與重建週期中會觸發速率限制。試算表新增了語系,但 API 永遠看不到更新,因為腳本抓取的是快取設定。實習生把內部 staging 網址貼到公開 API 請求中,主機會靜悄悄地記錄這些資料列,而這幾乎不會是隱私審查想看到的結果。

瀏覽器端的 Hreflang 產生器翻轉了這種取捨。開發者或 SEO 從業人員將相同的語系—網址清單貼到一個頁面,該頁面以 JavaScript 執行解析、標準化、大小寫規範化及 HTML 跳脫,然後將產生的連結區塊直接複製到 CMS 模板中。沒有權杖需要管理、沒有配額需要監控、也沒有部分回應需要解析。相同的輸入在任何機器上都會產生相同的輸出,這代表稽核軌跡存放在儲存的文字檔中,而不是第三方儀表板中。

對於已經遵循 Google 本地化版本說明文件的團隊來說,這種做法也讓審查變得更輕鬆。操作人員可以清楚看到哪些資料列被接受、哪些語系標籤被改寫為標準大小寫、以及哪些輸入未通過驗證。每當新增、移除、重新導向或移到新的標準網址時,都能從相同的資料列重新產生該組,這正是正式環境中 hreflang 叢集損壞最常見的原因。

如何在不呼叫 API 的情況下建立完整的 hreflang 組

  1. 將每個對等的本地化頁面清點為單一語系 | 完整網址資料列,包含目前正在編輯的頁面。
  2. 只有在確實存在 fallback 時才新增x-default資料列,例如國家選擇器或針對設定不符合其他 listed alternate 的使用者所設計的通用登陸頁面。
  3. 開啟 Hreflang 產生器並貼上資料列。每一行必須只包含一個直立線分隔符號,工具至少需要兩列,最多支援 100 列。
  4. 產生跳脫後的連結區塊。工具會將語系大小寫標準化(en-us 改為 en-US,zh-hant 改為 zh-Hant)、對 & 號及其他屬性敏感字元進行 HTML 跳脫,並在標準化後以不分大小寫的方式拒絕重複的語系。
  5. 根據目前的 Google 說明文件及實際的目標受眾,逐一驗證每個語系標籤。結構上的有效性並不保證登記支援;一個整齊的標籤仍可能描述了不受支援或不適當的受眾。
  6. 在每個 alternate 頁面的<head>中安裝完全相同的區塊,然後爬取實際上線的頁面,確認 self 與 return 連結都回應 200,並確認每個 alternate 都指向其他所有 alternate。

同一組區塊必須出現在叢集中的每個頁面上。如果西班牙文頁面列出五個 link 元素,但法文頁面列出六個,搜尋引擎和叢集本身都會失去讓關係明確的對稱性。請將產生的區塊視為單一產出物:複製一次,貼到叢集中每個參與的頁面模板,當語系變更時更新該產出物而非個別頁面。在格式錯誤的輸入上讓整組失敗是刻意的設計,因為複製一個靜悄悄省略某個國家或語言版本的局部輸出,是實務上最昂貴的 hreflang 錯誤。

本地產生器強制執行的語系標籤與網址規則

產生器驗證的是輸入的格式,而非特定搜尋引擎所支援的完整語系列表。這個區別很重要:結構上整齊的代碼仍可能描述了不適當的受眾。下表摘要說明解析過程中套用的規則。

輸入格式是否接受?原因
en-US | https://example.com/en/標準大小寫,完整網址
en-us | https://example.com/en/小寫改寫為 en-US
zh-Hant | https://example.com/zh-tw/script 子標籤標準化為 zh-Hant
x-default | https://example.com/特殊 fallback 代號,每組只允許一個
fr-CA | https://example.com/fr-ca/先語言後地區,小寫改寫為 fr-CA
US | https://example.com/國家代碼不可單獨佔據第一個位置
/en/拒絕相對網址;必須有主機
//example.com/en/拒絕 scheme 相對網址;必須有 scheme
https://user:[email protected]/拒絕內嵌憑證
https://example.com/#section拒絕片段;解析器會捨棄雜湊部分
同一組中出現 en-US | url1 與 en-US | url2標準化後以不分大小寫的方式拒絕重複語系

語系輸入接受兩個字母的語言代碼、選填的四個字母 script,以及選填的兩個字母地區代碼。國家代碼不可單獨佔據第一個位置,因為第一個子標籤永遠代表語言。區域定位必須放在語言之後,因此fr-CA有效,而CA-fr無效。當存在多個針對特定國家的法文版本時,像fr這類通用語言頁面可作為有用的 fallback,script 子標籤則用來區分書寫系統,例如zh-Hanszh-Hant。重複的語系值會在標準化後以不分大小寫的方式拒絕,這就是為什麼在相同的資料列清單中同時加入 en-us 和 en-US 會讓整組失敗,而不會靜悄悄地產生兩個指向同一個叢集的條目。

Self 與 return 連結:為何單向宣告會失敗

Google 將 self 與 return 連結記錄為必要訊號,單向宣告可能會被忽略。其道理很簡單:另一個網站不應該能夠單方面宣稱您的頁面是它的 alternate。如果頁面 A 將頁面 B 列為其法文 alternate,但頁面 B 並未將頁面 A 列為其英文 alternate,引擎就無法確認這個關係是雙向的,該註解在叢集中也會失去其權重。

實務上,這代表為六語系叢集產生的區塊包含六個 alternate link 元素,而非五個。目前頁面自己的語系與網址會作為這六列之一,與其他每個 alternate 並列。這個 self 列在程式碼審查期間看起來冗餘,因此是最容易被遺忘的一列。安裝區塊時,請將其原封不動地貼到每個 alternate 頁面,然後從每個叢集中各抽樣爬取一次,並以機械化方式比對各組。如果西班牙文頁面和德文頁面發布了不同的區塊,請將其視為部署錯誤而非內容決策。如需深入了解 hreflang 如何融入國際 SEO 設定的其餘部分,hreflang 實作指南會逐步說明更廣泛的架構,包含標準化標籤與 hreflang 訊號在同一頁面上的互動方式。

驗證已部署的組並保持同步

一旦區塊安裝完成,產生器的工作就結束了,維護工作才正要開始。工具無法存取遠端頁面、無法證明雙向連結,也無法偵測被重新導向的頁面現在回傳了不同的標準化網址。請從每個語言叢集中各抽樣爬取一次,逐列比對已發布的區塊,並確認每個 alternate 都解析為有用的 200 頁面。hreflang 準確度檢查清單涵蓋了部署後的診斷性爬取,包括如何找出遺失的 return 連結,以及不再指向預期 fallback 的過期 x-default 列。

選擇一種實作方法並貫徹到底。Google 將 HTML head 元素、HTTP Link 標頭,以及 XML sitemap hreflang 訊號視為等價,維護多份複本會在更新其中之一而未更新其他時引入漂移。如果 CMS 能在每個模板上可靠地發布 head 區塊,請堅持使用 HTML。如果在 CDN 中維護標頭較為容易,請堅持使用標頭。混用幾乎必然會產生一個過時的方法,靜悄悄地與現行方法互相矛盾。

最後,請將資料列清單視為唯一可信來源,而非產生的區塊。當新增、移除、重新導向或移到新的標準網址時,請編輯資料列清單、使用同一個產生器重新產生區塊,並在受影響叢集中的每個頁面上重新貼上完全相同的區塊。本地產生器在任何瀏覽器工作階段中,從相同的輸入都會產生相同的輸出——這正是它從一開始就能作為 API 替代方案運作的特性。