Cách Implement Hreflang (Từng bước)

Hoạt động code cho all three hreflang các phương thức — HTML head tags, HTTP Link các header, và XML sitemap các chú thích — plus đó syntax rules, tại-quy mô CMS automation, và đó validation workflow để xác nhận điều này thực ra shipped correctly.

Xuất bản lần đầu: 2 thg 7, 2026 · Cập nhật lần cuối: 8 thg 8, 2026 · Advanced
Ngôn ngữ
1 tín hiệu bằng chứng trên trang này

Có chính xác three ways để thêm hreflang — HTML link tags trong đó head, HTTP Link các header phản hồi (cho non-HTML files như PDFs), hoặc xhtml:link entries trong an XML sitemap (best tại quy mô). Pick một; Google xử lý all three as tương đương và có không benefit để combining them. Mỗi phương thức obeys đó giống nhau hai non-negotiable rules: self-reference (mỗi trang lists itself) và reciprocity (nếu MỘT points để B, B phải point lại để MỘT, hoặc Google bỏ qua đó pair). Codes là ISO 639-1 language plus tùy chọn ISO 3166-1 alpha-2 region; x-default là đó fallback. Generate điều này all từ một single nguồn of truth, thì validate đó được kết xuất head, không chỉ view-nguồn — trong my nghiên cứu of 374 756 domains, over 67% of hreflang setups đã có ít nhất một vấn đề.

Tóm tắt — Three các phương thức, pick một: HTML <link> tags trong <head>, HTTP Link: các header ( chỉ option cho non-HTML files như PDFs), hoặc <xhtml:link> entries trong XML sitemap (best tại quy mô — một machine-generated file, easiest để QA). Google nói three là tương đương và có không benefit để combining them. mỗi phương thức obeys self-reference + reciprocity, dùng absolute các URL, và dùng ISO 639-1 language + tùy chọn ISO 3166-1 alpha-2 region codes. Generate toàn bộ điều từ một nguồn của truth — hand-maintained hreflang rots. sau đó validate được kết xuất head, crawl toàn bộ cluster cho reciprocity, và giữ re-kiểm tra sau khi mỗi URL thay đổi. Làm không auto-chuyển hướng các crawler by geo.

trước khi bạn ghi line của code: three decisions

1. Mà phương thức. Google là rõ ràng đó lựa chọn là về convenience, không performance — “The three methods are equivalent from Google’s perspective and you can choose the method that’s the most convenient for your site.” (bản dịch) «Đó three các phương thức là tương đương từ Google perspective và bạn có thể chọn đó phương thức đó là đó hầu hết convenient cho trang web của bạn.» My rough rule:

Evidence for this claim Google supports equivalent HTML, HTTP-header, and sitemap methods for declaring localized versions; HTTP headers can be used for non-HTML files such as PDFs. Scope: Google Search hreflang implementation methods. Confidence: high · Verified: Google: Localized versions
  • handful của các URL, static hoặc đơn giản trang web, một vài locales → HTML <link> tags.
  • Non-HTML assets (PDFs, tài liệu) → HTTP Link: các header (bạn có không khác option — có không <head> trong PDF).
  • nhiều locales, existing sitemap pipeline, hoặc headless/JAMstack setup → XML sitemap, generated programmatically.

Các cây quyết định lens walks điều này as thực tế flowchart.

2. Một nguồn của truth. Whatever phương thức bạn pick, các chú thích nên là generated từ một place — locale/translation bảng trong của bạn database, CMS mối quan hệ trường, hoặc (cho nhỏ các trang) single spreadsheet. single worst hreflang anti-pattern là hand-maintaining tags theo trang. moment một locale template drifts, trả về links go bị thiếu và pairs nhận dropped.

3. không combine các phương thức. bạn có thể chạy all three; Google nói có không benefit, và mỗi extra phương thức là một surface cho three copies để disagree với mỗi khác.

Evidence for this claim Google requires fully qualified alternate URLs and reciprocal links, and recommends including each page itself in its alternate set. Scope: Google Search hreflang rules shared by all delivery methods. Confidence: high · Verified: Google: Hreflang guidelines

syntax, verbatim từ Google, là:

<link rel="alternate" hreflang="lang_code" href="url_of_page" />

đầy đủ hoạt động đặt cho multi-language, multi-region cluster với fallback:

<link rel="alternate" hreflang="en-us" href="https://example.com/us/" />
<link rel="alternate" hreflang="en-gb" href="https://example.com/uk/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />

đó chính xác block goes on mỗi trang trong cluster ( US trang, UK trang, German trang, và homepage) — mỗi một bao gồm của nó own self-referencing line. đó Điều gì satisfies reciprocity.

Placement là một hard rule. Google: “The <link> tags must be inside a well-formed <head> section of the HTML.” (bản dịch) «Đó thẻ link tags phải được bên trong một well-formed thẻ head section of đó HTML.» Và của họ own khắc phục sự cố advice: “If in doubt, paste code from your rendered page into an HTML validator to ensure that the links are inside the <head> element.” (bản dịch) «Nếu trong doubt, paste code từ của bạn được kết xuất trang vào an HTML validator để bảo đảm đó links là bên trong đó thẻ head element.»

điều này matters nhiều hơn nó sounds, vì của thất bại chế độ phần lớn được viết các hướng dẫn skip: hreflang tags có thể là forced out của <head> và vào <body>, nơi họ’re không hợp lệ. Trong my Pubcon Vegas 2019 deck I flagged điều này trực tiếp — tags có thể’t legitimately trực tiếp trong thân phản hồi (đó sẽ let một trang web hijack một alternates), nhưng malformed hoặc injected <p> tag, hoặc iframe, có thể prematurely close <head> so đó mọi thứ sau khi nó — including của bạn hreflang — renders bên trong <body>. tag là technically present trong nguồn nhưng silently không hợp lệ. fastest way để debug nó là trình duyệt DOM breakpoints: watch nơi tags thực ra land trong được kết xuất DOM, sau đó walk lại để markup đó broke <head>.

Khi HTML tags làm hợp lý: nhỏ-để-medium các trang với manageable number của locales, nơi theo-trang <link> block không balloon. On trang web với dozens của locales, mỗi trang carries lớn block của markup — mà là một reason big các trang lean on sitemap phương thức.

không mix hreflang với khác alternate các thuộc tính on giống nhau <link> element. Google hướng dẫn là rõ ràng đó <link rel="alternate"> carrying hreflang không nên cũng carry unrelated alternate thuộc tính như media trong giống nhau tag — nếu bạn cần cả hai language/region alternate và media-query alternate cho giống nhau URL, đó hai tách biệt <link> elements, không một combined một. Mixing them là easy way để end lên với tag Google có thể’t parse as either.

giống nhau information, được gửi trong HTTP phản hồi thay vì HTML. syntax:

Link: <https://example.com/file.pdf>; rel="alternate"; hreflang="en",
      <https://de-ch.example.com/file.pdf>; rel="alternate"; hreflang="de-ch"

Note angle brackets khoảng mỗi URL, semicolon-separated các thuộc tính, và comma separating mỗi alternate. mỗi URL trong header là comma-appended.

Khi bạn cần điều này: non-HTML các tài nguyên. PDF, .doc, image phân phối trực tiếp — none của them có <head> để hold <link> tags, so header là của bạn chỉ way để attach hreflang để them.

Configuration considerations: bạn đặt những điều này các header tại máy chủ hoặc CDN layer ( Apache Header directive, Nginx add_header, Cloudflare/Fastly/CloudFront phản hồi-header rule, hoặc của bạn application phản hồi). vì header là đặt by infrastructure thay vì theo-document markup, reciprocity rule là easy để break ở đây — English PDF header và German PDF header là thường configured riêng, so nó on bạn để hãy đảm bảo mỗi một lists toàn bộ đặt, itself được bao gồm. giữ header generation driven by giống nhau locale bảng as của bạn HTML/sitemap approach.

** invariant để hold onto: mỗi alternate phản hồi carries giống hệt hoàn tất đặt, mỗi time.** nó không đủ cho English PDF header để list German alternate — German PDF phản hồi có để carry chính xác giống nhau đặt lại (itself plus mỗi khác alternate), on mỗi single phản hồi, không chỉ đầu tiên một crawler happens để hit. Treat header as generated output, không một-off bạn đặt và forget.

Tại quy mô, Đây là thường right call: toàn bộ cluster lives trong một (hoặc một vài) machine-generated files, không có gì bloats mỗi trang <head>, và — vì đểàn bộ mối quan hệ graph là trong một place — nó by far easiest phương thức để QA. syntax:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://www.example.com/english/page.html</loc>
    <xhtml:link rel="alternate" hreflang="de"
                href="https://www.example.de/deutsch/page.html"/>
    <xhtml:link rel="alternate" hreflang="en"
                href="https://www.example.com/english/page.html"/>
  </url>
  <url>
    <loc>https://www.example.de/deutsch/page.html</loc>
    <xhtml:link rel="alternate" hreflang="de"
                href="https://www.example.de/deutsch/page.html"/>
    <xhtml:link rel="alternate" hreflang="en"
                href="https://www.example.com/english/page.html"/>
  </url>
</urlset>

Hai điều đó trip mọi người lên trong sitemap phương thức:

  1. Đó namespace declaration là mandatory. Đó xmlns:xhtml="http://www.w3.org/1999/xhtml" on đó <urlset> element không phải tùy chọn decoration — omit điều này và mỗi <xhtml:link> trong đó file là không hợp lệ.
  2. Mỗi <url> block phải được self-hoàn tất. Notice đó cả hai <url> chặn trên list cả hai alternates, including của họ own <loc>. Mỗi <url> entry carries đó đầy đủ set (self-reference + all alternates). Reciprocity trong một sitemap là chỉ “every URL’s block lists every URL in the cluster, itself included.” (bản dịch) «mỗi URL’s block lists mỗi URL trong đó cluster, itself được bao gồm.»

Hai behaviors worth knowing so bạn không over-engineer generator: order của <xhtml:link> children bên trong <url> block không quan trọng để Google — không waste time sorting them — và những điều đó <xhtml:link> các chú thích không count so với của bạn sitemap 50 000-URL-theo-file limit, since họ’re children của <url> entry, không tách biệt <url> entries themselves.

Generating nó programmatically. toàn bộ point của sitemap phương thức là đó nó byproduct của bạn CMS own translation dữ liệu. nếu của bạn CMS đã knows đó /english/page.html/deutsch/page.html là translations của mỗi khác, của bạn sitemap generator nên walk đó mối quan hệ bảng và emit <xhtml:link> chặn tại xây dựng time (hoặc tại sitemap-yêu cầu time). Làm đó và hreflang có thể’t drift out của sync với reality — nó regenerated từ nguồn của truth mỗi time, và thêm locale là dữ liệu thay đổi, không hand-edit trên hundreds của các trang.

Cho nhóm không có dev các tài nguyên, I được xây dựng một lightweight Google Sheets template trong my Ahrefs hreflang hướng dẫn: một Setup tab (pick một default language plus lên để four variants), một URLs tab (paste mỗi language URLs vào các cột), và một Kết quả tab đó auto-generates đó sitemap XML block cho bạn. đây là đó “single source of truth” (bản dịch) «single nguồn of truth» ý tưởng đã làm concrete cho các trang cũng nhỏ để justify một real CMS integration.

rules đó apply không quan trọng mà phương thức bạn pick

những điều này là phương thức-agnostic và non-negotiable.

  • Self-reference. Mỗi trang (hoặc mỗi <url> block, hoặc mỗi header) lists itself. Mueller frames này as tùy chọn-nhưng-good-practice, nhưng skipping điều này đã là present trong 18,0% of đó domains trong my nghiên cứu — automate điều này và điều này costs không có gì.
  • Reciprocity. “Each language version must list itself as well as all other language versions.” (bản dịch) «Mỗi language version phải list itself cũng như all other language versions.» Và đó enforcement: “If two pages don’t both point to each other, the tags will be ignored. This is so that someone on another site can’t arbitrarily create a tag naming itself as an alternative version of one of your pages.” (bản dịch) «Nếu hai các trang không cả hai trỏ đến mỗi other, đó tags sẽ là đã bỏ qua. Này là so đó ai đó on một sản phẩm khác site không thể arbitrarily tạo một tag naming itself as an alternative version of một of của bạn các trang.» Một bị thiếu trả về link drops đó pair.
  • Absolute, fully-qualified URLs. “Alternate URLs must be fully-qualified, including the transport method (http/https)” (bản dịch) «Alternate URLs phải được fully-qualified, including đó transport phương thức (http/https)» — so https://example.com/foo, không bao giờ //example.com/foo hoặc /foo. Và đó URL phải match đó chính xác form Google indexes: giao thức, www, trailing slash, và case all có để line lên, hoặc đó trả về-link match fails.

Getting codes right

“The first code of the hreflang attribute is the language code (in ISO 639-1 format) followed by an optional second code that represents the region code (in ISO 3166-1 Alpha 2 format).” (bản dịch) «Đó đầu tiên code of đó hreflang thuộc tính là đó language code (trong ISO 639-1 format) followed by an tùy chọn second code đó represents đó region code (trong ISO 3166-1 Alpha 2 format).» Combine them với một dash: en-US. Bạn có thể đích một language on của nó own (es = Spanish mọi nơi), nhưng bạn không thể đích một region on của nó own — có luôn một language đầu tiên.

mistakes I see phần lớn thường (và saw trên nghiên cứu dataset):

  • en-UK thay vì en-GBuk là Ukrainian, UK region code là gb.
  • jp thay vì ja cho Japanese, cn thay vì zh cho Chinese.
  • Three-letter codes (ger, eng) nơi hai-letter ISO 639-1 là bắt buộc.
  • sử dụng EU, UN, hoặc UK as region codes — none là hợp lệ ISO 3166-1 alpha-2 targets.

x-default là reserved giá trị cho fallback — language selector hoặc auto-chuyển hướng home trang đó phục vụ người dùng ai match none của bạn rõ ràng locales:

<link rel="alternate" href="https://example.com/" hreflang="x-default" />

không mandatory. nó là single phần lớn-bị thiếu element trong my nghiên cứu (56,3% của domains omitted nó), nhưng bị thiếu x-default không break cluster way bị thiếu reciprocal tag làm — Google chỉ falls lại để của nó own language/region detection cho unmatched người dùng. Thêm nó anyway; nó checklist item, không cluster-breaker. (có dedicated x-default subtopic trong điều này cluster.)

Implementing tại quy mô — CMS và nền tảng approaches

WordPress. Yoast SEO làm không generate hreflang on của nó own. Để thực ra output tags bạn cần một multilingual plugin — WPML hoặc Polylang. WPML auto-generates hreflang cho mỗi trang đó có translations, adds an x-default pointing tại của bạn default-language version, và theo mặc định injects đó các chú thích vào đó XML sitemap; có một setting dưới WPML → Languages → SEO Options (“Display alternative languages in the HEAD section” (bản dịch) «Display alternative languages trong đó HEAD section») nếu bạn muốn head-tag output thay vì, hoặc ngoài ra để, đó sitemap. (See WPML tài liệu on dùng điều này với Yoast.)

Shopify. Shopify Markets tự động generates mutually-linked hreflang tags sau khi bạn’ve configured markets/languages và nội dung là published và linked trong navigation — mà xóa phần lớn phổ biến thất bại chế độ (bị thiếu reciprocal links) by design. catch: Markets’ tự động tags là thường language-chỉ (fr, de) thay vì language-region (fr-FR, fr-CA), mà dưới-phục vụ brands đó cần regional specificity — French cho France so với. Canada so với. Belgium. cho đó bạn drop để manual <link> tags trong theme.liquid (Shopify own theme hreflang tài liệu hiển thị pattern) hoặc app — và là careful, vì mixing tự động Markets tags với manual/app tags là được ghi lại nguồn của conflicts. Pick một.

Custom / headless / enterprise. Generate đó các chú thích từ của bạn translation-mối quan hệ bảng tại xây dựng hoặc serve time, as described trong đó sitemap section trên. Này là đó giống nhau “single source of truth” (bản dịch) «single nguồn of truth» principle — hreflang becomes một computed output of dữ liệu của bạn CMS đã holds, không một hand-maintained artifact đó có thể rot.

Implementation mistakes đó break cluster

Auto-chuyển hướng by geo/IP. Này là một tách biệt failure từ syntax các lỗi và đây là tệ hơn. Nếu bạn chuyển hướng khách truy cập — và especially các crawler — để một version based on perceived location, bạn có thể de-chỉ mục entire regional clusters, vì Googlebot mostly crawl từ đó US. As I put điều này trong đó Pubcon deck: một geo-chuyển hướng “would redirect search engines to where they crawl from. Google for instance mostly crawls from the US so we would effectively de-index all geo pages.” (bản dịch) «sẽ chuyển hướng các công cụ tìm kiếm để nơi they crawl từ. Google chẳng hạn mostly crawl từ đó US so we sẽ effectively de-chỉ mục all geo các trang.» có một regulatory angle cũng — potential exposure dưới EU anti-geoblocking rules. Đó right pattern là chuyển hướng người dùng, không bao giờ các crawler: detect và (tùy chọn) chuyển hướng human khách truy cập, nhưng luôn let bots reach mỗi URL variant trực tiếp, với hreflang đang làm đó thực tế routing tín hiệu. Google own multi-regional hướng dẫn khuyến nghị một non-intrusive suggestion banner over tự động redirection cho chính xác này reason.

Pointing hreflang tại non-canonical, được chuyển hướng, hoặc noindexed các URL. nếu locale URL thay đổi và chuyển hướng goes trong nhưng hreflang vẫn points tại old URL, của bạn cluster hiện tại references 301 hoặc 404 (16,9% của domains trong my nghiên cứu referenced hỏng/được chuyển hướng các trang). Similarly, mỗi variant nên canonicalize để itself; pointing hreflang tại URL đó canonicalized away, hoặc tại noindexed trang, breaks trả về link (8,0% pointed tại non-canonical các URL).

Inconsistent URL formats. hreflang URL và được lập chỉ mục URL có để là byte-giống hệt trong form — trailing slash, www, giao thức, và case all được bao gồm. mismatch ở đây là silent reciprocity thất bại.

Validating của bạn implementation sau khi launch

View được kết xuất nguồn, không chỉ thô nguồn. Nếu của bạn hreflang là injected by client-side JavaScript, curl hoặc Ctrl+U (“View Page Source” (bản dịch) «View Trang Nguồn») sẽ cho thấy không có gì — nhưng đó tags exist trong đó được kết xuất DOM. Xác nhận với GSC URL Inspection → “Test Live URL” (bản dịch) «Kiểm thử Trực tiếp URL» → “View Tested Page,” (bản dịch) «View Tested Trang,» hoặc một kết xuất-capable crawler. Này là đó single hầu hết phổ biến reason ai đó says “my tags are missing” (bản dịch) «my tags là bị thiếu» khi họ là thực ra fine (hoặc đó reverse — present trong nguồn nhưng hỏng vì they render trong đó <body>).

Crawl toàn bộ cluster, không spot-kiểm tra một URL. Reciprocity là mối quan hệ giữa các trang, so kiểm tra một trang tells bạn gần như không có gì. Chạy crawler trên toàn bộ cluster — Screaming Frog’s hreflang audit hoặc Ahrefs trang web Audit — để catch bị thiếu trả về tags, non-canonical targets, và hỏng references tại quy mô. Ahrefs trang web Audit Hreflangs tab draws cluster as graph với hỏng links trong red, mà là far easier để reason về hơn CSV.

Verify thực SERPs với &hl=&gl=. Append host-language (&hl=) và geolocation (&gl=) parameters để Google tìm kiếm URL để preview Điều gì được cho locale kết quả thực ra trông giống, thay vì guessing từ của bạn own location.

Validation không phải một một-time step. New locales, URL/chuyển hướng thay đổi, và dev/staging config bleeding vào production là đó recurring gây ra of post-launch breakage. Xây dựng hreflang kiểm tra vào regression các kiểm thử và recurring crawl, không chỉ một launch-day QA truyền. My cách diễn đạt từ đó talks: “any number of things can break from masking to things carrying over from dev/test/staging environments.” (bản dịch) «bất kỳ number of điều có thể break từ masking để điều carrying over từ dev/kiểm thử/staging environments.»

Myths worth retiring

  • “Sitemaps process faster than HTML tags.” (bản dịch) «Sitemaps xử lý nhanh hơn HTML tags.» Sai. Cả hai là resolved tại crawl time — I’ve debunked này trực tiếp. Đó sitemap advantage là maintainability và QA, không speed.
  • “Yandex doesn’t support hreflang in sitemaps.” (bản dịch) «Yandex không hỗ trợ hreflang trong sitemaps.» Sai — Yandex own tài liệu xác nhận sitemap hreflang hỗ trợ.
  • “Use all three methods for extra signal.” (bản dịch) «Dùng all three các phương thức cho extra tín hiệu.» Không benefit theo Google, và điều này chỉ multiplies inconsistency risk.
  • “A missing x-default breaks the cluster.” (bản dịch) «MỘT bị thiếu x-default breaks đó cluster.» Sai — đây là tùy chọn; Google falls lại để của nó own detection.
  • “Wrong hreflang gets you penalized.” (bản dịch) «Sai hreflang nhận bạn penalized.» Sai — đây là một hint, không một directive. Hỏng hreflang là đã bỏ qua, không penalized.

nơi để go tiếp theo

điều này bài viết là Cách-để depth dưới hreflang hub — hub covers Điều gì hreflang là, Vì sao reciprocity matters, và Điều gì Bing làm thay vì. x-default subtopic goes deep on fallback giá trị. cho strategy điều này implements, see SEO quốc tế pillar — hreflang là kỹ thuật layer, không substitute cho genuine localization.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.