Hreflang 產生器可以把兩到 100 行的「地區代碼|網址」配對,轉換成一個經過跳脫處理的 HTML alternate 連結區塊,具備標準大小寫,並可選擇加上 x-default 後備選項。這種任務很適合用速查表的形式呈現,因為這個工具的規則非常精確:每行剛好一個字面分隔符號、必須是完整的 HTTP(S) 網址、結構正確的地區代碼標籤,並且要在每一頁的 head 中安裝完全相同的區塊。這個工具不會爬你的網站、不會對照搜尋引擎目前支援的完整語言與地區清單做驗證,也不會證明互相引用(reciprocal links)——它的工作,是產生一個一致、經過 HTML 跳脫處理的 rel=alternate 區塊,讓你可以複製貼到每一個替代語言頁面中。這份速查表,把這套規則濃縮成輸入格式、地區代碼標籤的形狀、驗證規則,以及一個三步驟的產生流程,讓同一個區塊,能正確地套用到你這組叢集中的每一個在地化頁面上。

Hreflang 產生器規則一覽
九條規則,涵蓋了這個工具會接受、拒絕,或轉換的幾乎每一種輸入情況。輸入每一行的時候,請把它們放在眼前隨時參考。
- 行數:最少 2 行,最多 100 行。只有一行的集合一定會失敗,這樣這個工具就絕不會回傳一個不完整的區塊。
- 分隔符號:每行剛好使用一個字面的直線字元(|)。
- 網址格式:完整的 http:// 或 https:// 位址,且必須包含主機名稱。相對路徑、通訊協定相對參照、內嵌憑證,以及片段識別碼,全部都會被拒絕。
- 地區代碼格式:兩個字母的語言代碼,選擇性的四個字母文字系統代碼,以及選擇性的兩個字母地區代碼,彼此以單一連字號連接。
- 大小寫:子標籤會透過 Intl.getCanonicalLocales 正規化,所以在這一行被接受之前,en-us 會變成 en-US,zh-hant 會變成 zh-Hant。
- x-default:允許有一行標示為 x-default,當清單中沒有任何一個替代版本符合使用者時,就用它作為後備;出現第二個 x-default 行會被拒絕。
- 重複值:地區代碼在正規化之後,會以不區分大小寫的方式比對,所以 en 和 EN 會被視為同一行。
- 自我參照:每個頁面自己的網址,都必須在區塊中出現一次,這樣它才能指向自己。
- 互相引用:每一個替代頁面,都必須發布完全相同的區塊。單向的宣告可以被忽略,因為不能讓另一個網站單方面宣稱你的頁面是它的替代版本。
輸入格式:逐行的地區代碼 | 網址
每一行都是單一一組地區代碼對應網址的關係。這個格式刻意設計得很窄,這樣這個工具才能在遇到格式不正確的一行時,讓整個集合失敗,而不是悄悄漏掉某個國家或語言版本。一組典型的輸入,針對英文、西班牙文、法文、德文的叢集,加上一個 x-default 到達頁面,會是五行內容:en | https://example.com/,es-ES | https://example.com/es/,fr-CA | https://example.com/fr-ca/,de-DE | https://example.com/de/,以及x-default | https://example.com/。
有五件事,值得記在輸入框旁邊。第一,你目前正在編輯的這個頁面,必須在集合中出現一次,指向它自己。第二,「完整」代表通訊協定與主機名稱都要完整寫出來——通訊協定相對的 //example.com/page,以及根路徑相對的 /page,都會被拒絕。第三,網址後面的片段,例如 #section,會被拒絕。第四,像 fr 或 en 這類通用的語言標籤,在有多個國家專屬版本存在時,很適合當成後備,但像 fr-CA 這樣的地區標籤,仍然需要先有語言子標籤。第五,x-default 不是一種語言;它標示的是一個給設定不符合清單中任何一個替代版本的使用者看的頁面,通常是國家選擇器,或通用的到達頁面。
地區代碼標籤速查表
地區代碼標籤遵循 language[-script][-region] 的結構,其中文字系統與地區子標籤都是選用的,但如果兩者都使用,就必須依照這個順序排列。這個產生器會把大小寫正規化,所以下表顯示的是正規化之後你應該看到的形式。
| 標籤形狀 | 輸入範例 | 標準化輸出 | 適用情境 |
|---|---|---|---|
| language | en 或 EN | en | 服務所有地區的通用英文頁面 |
| language-region | en-us 或 en-US | en-US | 針對單一國家的英文版本,此處為美國 |
| language-script | zh-hans 或 zh-Hans | zh-Hans | 用來區分書寫系統,例如簡體中文 |
| language-script-region | zh-hant-tw 或 zh-Hant-TW | zh-Hant-TW | 針對台灣的繁體中文 |
| fallback | x-default | x-default | 給語言不符合清單中任何一個替代版本的使用者看的頁面 |
如何用三個步驟產生 Hreflang 標籤
這個產生器是圍繞著三個操作步驟建立的。依照順序完成這三步,能讓產生出來的區塊,在叢集中每一個替代頁面上都保持一致。
- 把每一個在地化頁面,列成「地區代碼 | 完整網址」,包含目前這個頁面,以及選用的 x-default 後備選項。最少 2 行,上限是 100 行。
- 產生出完整、經過跳脫處理的連結區塊,並對照目前支援的語言與地區指引,逐一驗證每個地區代碼。大小寫已經幫你正規化好了;你自己必須檢查的,是每個語言與地區,是不是你的內容真正鎖定的對象。
- 把完全相同的一組標籤,安裝到每一個替代頁面的 head 中,然後爬取上線後的頁面,確認自我參照與互相引用都正確。這個工具無法遠端證明互相引用,所以爬取檢查,就是你自己的確認步驟。
開啟Hreflang 產生器,貼上這份行清單,並複製產生出來的連結區塊。把同一個區塊,貼到清單中每一個頁面的 head 裡,然後對每個網址做抽樣爬取,並用機械化的方式比對 head 區段。
這個工具會拒絕哪些內容
輸入驗證會讓整個集合失敗,而不是產生部分輸出。以下是這個產生器會明確拒絕的情況,並附上原因記錄,方便你修正這一行之後重新執行。
| 輸入模式 | 結果 | 原因 |
|---|---|---|
| example.com/page | 拒絕 | 缺少主機名稱;相對路徑與通訊協定相對的網址都不被接受 |
| //example.com/page | 拒絕 | 不接受通訊協定相對的形式 |
| https://example.com/page#intro | 拒絕 | 含有片段識別碼的網址會被拒絕 |
| https://user:[email protected]/page | 拒絕 | 不接受內嵌憑證 |
| 第 3 行是 en-US,第 7 行是 en-us | 拒絕 | 經過不區分大小寫的正規化後,出現重複的地區代碼 |
| 第 2 行與第 9 行都是 x-default | 拒絕 | 每個集合只允許有一行 x-default |
| 整個集合只有一行 | 拒絕 | 最少要有兩行,包含目前這個頁面在內 |
| DE-de,前面沒有先放語言子標籤 | 拒絕 | 國家代碼不能單獨出現在第一個位置 |
這個產生器內建八組符合標準的測試夾具,涵蓋了通用語言、地區大小寫、德文與法文地區、簡體與繁體中文的文字系統標籤、一個 language-script-region 組合,以及 x-default。額外的測試,還會驗證確切的 HTML 跳脫處理,以及上述這些拒絕情況。因為整個集合會在格式不正確的輸入上直接失敗,所以你複製出來的區塊,就是你可以直接部署的區塊。
貼上標籤之後:驗證檢查清單
這個產生器只會產生 HTML head 元素;HTTP 標頭與 XML sitemap 的實作方式不在它的範圍內。請選擇你的發布系統能夠保持完整且同步的那種方式,因為 Google 把這三種方法視為等效,混用它們容易導致內容產生落差。部署完成之後,針對每一個語言叢集,抽樣進行一次簡短的驗證。
- 開啟每一個在地化網址,確認 head 區塊在整個叢集中逐字元完全一致,包含 x-default 與自我參照在內。
- 確認每一個替代版本,都會回傳一個有效的 200 頁面,而且已經被重新導向或搬移的地區代碼,在其他每一個頁面的同一個區塊中,也都已經更新。
- 確認每一頁都會指向自己,而且每一個替代版本都會回傳這個連結,你可以用一次針對性的爬取來驗證,或參考hreflang 標籤準確度指南。
- 對照目前的Google Search Central 關於在地化版本的指引來驗證你設定的語言與地區;這個工具只驗證標籤的格式,不驗證這個語言或地區目前是否真的受支援。
- 當某個地區代碼被新增、移除、重新導向,或搬到新的標準網址時,請更新叢集中的每一個頁面,並重新執行這個產生器,而不是手動編輯 head。
這個產生器無法擷取遠端頁面,也無法證明互相引用,所以持續的品質,取決於你的部署流程。請把產生出來的區塊,當成整個叢集的唯一真相來源:一份輸入清單、一個輸出區塊、每頁一個 head 區段,並在每次變更之後都跑一次驗證爬取。