Hreflang không phải thẻ dịch nội dung, cũng không phải tín hiệu để gộp các URL thành một trang duy nhất. Đây là cơ chế giúp Google hiểu phiên bản nào phù hợp với ngôn ngữ và khu vực của người tìm kiếm, từ đó hạn chế việc hiển thị sai trang tiếng Việt, tiếng Anh hoặc sai quốc gia.
Triển khai hreflang ngoài thực tế thường hỏng ở ba điểm: các URL không liên kết đối ứng hai chiều, cấu hình x-default thiếu hoặc dùng sai, và trộn lẫn nhiều phương thức khai báo mà không kiểm soát. Bài viết này tập trung vào cách triển khai, kiểm tra và xử lý các lỗi khiến Google có thể bỏ qua toàn bộ tín hiệu hreflang.
Hreflang hoạt động như thế nào?
Một nhóm hreflang gồm các URL tương đương về nội dung nhưng khác ngôn ngữ hoặc khu vực. Mỗi URL trong nhóm phải khai báo các phiên bản còn lại, bao gồm cả chính nó. Ví dụ, một bài viết có ba phiên bản:
https://example.com/vi/seo/: tiếng Việthttps://example.com/en/seo/: tiếng Anhhttps://example.com/fr/seo/: tiếng Pháp
Trên URL tiếng Việt, website khai báo rằng URL này có bản tiếng Việt, tiếng Anh và tiếng Pháp. Trên URL tiếng Anh và tiếng Pháp cũng phải khai báo đúng chính ba phiên bản đó. Đây là quy tắc đối ứng hai chiều, thường được gọi là reciprocal hreflang.
Hreflang sử dụng mã ngôn ngữ ISO 639-1, chẳng hạn vi, en, fr, kết hợp tùy chọn với mã quốc gia ISO 3166-1 Alpha-2 như VN, US hoặc GB. Thứ tự đúng là ngôn ngữ trước, khu vực sau: en-GB, không phải GB-en.
Có thể dùng mã ngôn ngữ riêng như en cho toàn bộ người dùng tiếng Anh, hoặc mã khu vực như en-US và en-GB khi nội dung, giá tiền, vận chuyển hay chính sách khác nhau. Không nên tạo vi-VN chỉ vì Việt Nam là thị trường mục tiêu nếu phiên bản đó không thực sự có khác biệt theo khu vực.
Quy tắc đối ứng hai chiều và x-default
Mỗi URL phải tự khai báo chính nó
Giả sử URL tiếng Việt có đoạn khai báo sau:
<link rel="alternate" hreflang="vi" href="https://example.com/vi/seo/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/seo/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/seo/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/seo/" />
URL tiếng Anh cũng cần có nhóm tương tự, trong đó có chính URL tiếng Anh:
<link rel="alternate" hreflang="vi" href="https://example.com/vi/seo/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/seo/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/seo/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/seo/" />
Google Search Central hướng dẫn các phiên bản phải tham chiếu lẫn nhau; nếu URL A trỏ đến URL B nhưng URL B không trỏ ngược về A, Google có thể không sử dụng các chú thích đó. Vì vậy, chỉ đặt hreflang trên phiên bản tiếng Anh hoặc chỉ trên trang mặc định là cách làm không đầy đủ.
Xử lý x-default đúng mục đích
x-default là URL dự phòng khi không có phiên bản ngôn ngữ hoặc khu vực phù hợp. Đây có thể là:
- Trang chọn ngôn ngữ hoặc quốc gia.
- Trang tiếng Anh dùng làm ngôn ngữ mặc định.
- Trang quốc tế có nội dung trung lập.
x-default không có nghĩa là “trang có thứ hạng cao nhất”, cũng không thay thế cho mã en. Nếu website có phiên bản tiếng Anh phục vụ tất cả người dùng chưa được phân loại, có thể dùng cùng một URL cho en và x-default, nhưng cần hiểu rõ mục đích của từng dòng.
Không nên trỏ x-default tới URL trả lỗi 404, trang chỉ chuyển hướng bằng JavaScript hoặc trang không có nội dung tương ứng. Nếu dùng trang chọn ngôn ngữ, trang đó vẫn phải truy cập được bằng HTML và có đường dẫn rõ ràng tới các phiên bản cần thiết.
Ba cách khai báo hreflang
1. Khai báo bằng thẻ trong phần head
Đây là cách dễ đọc và phù hợp khi website có số lượng URL vừa phải. Các dòng link phải nằm trong phần head của từng URL, không đặt trong nội dung bài viết, phần body hoặc tệp JavaScript tải sau.
<link rel="alternate" hreflang="vi-VN"
href="https://example.com/vi-vn/dich-vu-seo/" />
<link rel="alternate" hreflang="en-US"
href="https://example.com/en-us/seo-services/" />
<link rel="alternate" hreflang="en-GB"
href="https://example.com/en-gb/seo-services/" />
<link rel="alternate" hreflang="x-default"
href="https://example.com/seo-services/" />
URL trong thuộc tính href nên là URL tuyệt đối, dùng giao thức HTTPS đúng với URL chuẩn. Kiểm tra cả dấu gạch chéo cuối, chữ hoa chữ thường, tham số truy vấn và phiên bản có hoặc không có www. Về mặt kỹ thuật, https://example.com/en/page/ và https://example.com/en/page có thể bị xử lý như hai URL khác nhau.
2. Khai báo trong XML sitemap
Sitemap phù hợp với website có hàng chục nghìn hoặc hàng triệu URL, nơi việc chèn nhiều dòng vào head làm tăng kích thước HTML và khó quản trị. Sitemap phải khai báo namespace xhtml:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/vi/seo/</loc>
<xhtml:link rel="alternate" hreflang="vi"
href="https://example.com/vi/seo/" />
<xhtml:link rel="alternate" hreflang="en"
href="https://example.com/en/seo/" />
<xhtml:link rel="alternate" hreflang="x-default"
href="https://example.com/seo/" />
</url>
</urlset>
Trong sitemap, mỗi URL thuộc nhóm vẫn phải xuất hiện và có tập liên kết đầy đủ. Không nên chỉ thêm một URL vào sitemap rồi kỳ vọng Google tự suy ra các phiên bản còn lại.
Theo tài liệu Sitemap của Google, một sitemap đơn lẻ có giới hạn 50.000 URL hoặc 50 MB khi chưa nén; nếu vượt giới hạn phải chia tệp và dùng sitemap index. Đây là giới hạn của sitemap, không phải giới hạn riêng của hreflang. Với nhóm 10.000 URL đa ngôn ngữ, cần tính cả số URL thực tế trong sitemap chứ không chỉ đếm số trang ở một ngôn ngữ.
3. Khai báo bằng HTTP header
HTTP header phù hợp với tệp không phải HTML, chẳng hạn PDF, hoặc các trường hợp không kiểm soát được phần head. Ví dụ phản hồi của URL tiếng Anh:
HTTP/1.1 200 OK
Link: <https://example.com/vi/guide.pdf>; rel="alternate"; hreflang="vi",
<https://example.com/en/guide.pdf>; rel="alternate"; hreflang="en",
<https://example.com/guide.pdf>; rel="alternate"; hreflang="x-default"
Header phải được gửi trong phản hồi HTTP của chính tài nguyên đó. Đặt dòng này trong HTML, file robots.txt hoặc cấu hình redirect không tạo ra cùng tác dụng. Với tệp PDF, cần kiểm tra bằng công cụ dòng lệnh hoặc tab Network để chắc chắn header xuất hiện ở phản hồi cuối cùng sau redirect.
Về vận hành, nên chọn một phương thức chính. Google có thể đọc nhiều nguồn, nhưng việc khai báo đồng thời trong head, sitemap và header làm tăng rủi ro lệch danh sách. Nếu buộc phải dùng hai phương thức, hãy tạo kiểm tra tự động để so sánh tập URL, mã ngôn ngữ và URL chuẩn ở cả hai nơi.
Các lỗi khiến Google bỏ qua hreflang
Hreflang là tín hiệu có điều kiện, không phải chỉ thị tuyệt đối. Google có thể không dùng một nhóm nếu phát hiện URL không truy cập được, mã ngôn ngữ sai hoặc quan hệ giữa các trang không nhất quán. Bảng dưới đây là các lỗi thường gặp khi audit:
| Lỗi triển khai | Hệ quả |
|---|---|
| URL A trỏ tới URL B nhưng URL B không trỏ ngược lại URL A | Google có thể bỏ qua cặp liên kết hoặc bỏ qua toàn bộ nhóm hreflang liên quan |
Dùng mã sai như vn, en_UK hoặc đặt khu vực trước ngôn ngữ |
Giá trị không được nhận diện đúng; phiên bản phù hợp có thể không được chọn |
| Hreflang trỏ tới URL 404, URL bị chặn bởi robots.txt hoặc yêu cầu đăng nhập | Google không thể xác nhận phiên bản thay thế và có thể loại liên kết đó |
| Canonical của trang tiếng Anh trỏ sang trang tiếng Việt dù nội dung là hai phiên bản hợp lệ | Tín hiệu canonical mâu thuẫn với hreflang; Google có thể chọn một URL chuẩn duy nhất |
| URL trong hreflang dùng HTTP nhưng trang thực tế chuyển sang HTTPS | Liên kết không khớp với URL cuối; dữ liệu có thể bị bỏ qua hoặc giảm độ tin cậy |
| Chèn thẻ bằng JavaScript sau khi tải trang hoặc đặt sai ngoài phần head | Trình thu thập có thể không đọc được như cấu hình dự kiến |
| Mỗi ngôn ngữ dùng một tập URL khác nhau, thiếu self-reference | Nhóm không còn nhất quán; Google khó xác định các trang là phiên bản tương đương |
Lỗi canonical đặc biệt phổ biến ở website quốc tế. Canonical nên trỏ về URL chuẩn của chính phiên bản ngôn ngữ đó. Ví dụ, /en/seo/ canonical về /en/seo/, còn /vi/seo/ canonical về /vi/seo/. Hreflang thể hiện quan hệ thay thế giữa các URL; canonical thể hiện URL đại diện trong nhóm nội dung gần trùng lặp. Hai tín hiệu này không nên bị cấu hình ngược nhau.
Quy trình triển khai thực tế
- Lập ma trận URL: tạo một bảng với mỗi dòng là một nội dung và mỗi cột là một phiên bản ngôn ngữ hoặc khu vực. Ghi rõ URL cuối cùng sau redirect, mã phản hồi, canonical và trạng thái indexability.
- Chốt quy ước mã: quyết định dùng
vihayvi-VN,enhay táchen-USvàen-GB. Không đổi quy ước giữa các thư mục. - Tạo dữ liệu hai chiều: từ mỗi URL, xuất toàn bộ phiên bản trong cùng một nhóm, bao gồm chính URL đó và
x-defaultnếu có. - Chọn phương thức: head phù hợp website nhỏ và CMS dễ chỉnh; sitemap phù hợp hệ thống lớn; HTTP header phù hợp PDF hoặc tài nguyên không phải HTML.
- Kiểm tra trước khi phát hành: chạy kiểm tra tự động với các điều kiện tối thiểu: mã phản hồi 200, không yêu cầu đăng nhập, không bị chặn, canonical hợp lý và URL chuẩn hóa thống nhất.
- Kiểm tra sau khi phát hành: crawl lại sau khoảng 24 giờ để phát hiện lỗi máy chủ và sau 7 ngày để đánh giá mức độ Google đã thu thập các URL. Đây là mốc kiểm soát vận hành, không phải thời gian Google cam kết cập nhật hreflang.
Một bộ kiểm tra tối thiểu có thể đặt ngưỡng lỗi bằng 0 cho các URL hreflang trả mã 4xx hoặc 5xx. Với website có 5.000 nhóm nội dung, kiểm tra thủ công là không khả thi; nên tự động hóa việc so sánh ma trận nguồn với HTML hoặc sitemap sau mỗi lần deploy. Nếu tỷ lệ URL lỗi vượt 1%, nên dừng phát hành bản cấu hình mới để xử lý, thay vì để Google thu thập một tập tín hiệu không nhất quán.
Khi nào không nên triển khai hreflang?
Không nên dùng hreflang chỉ vì website có vài đoạn nội dung tiếng Anh. Nếu toàn bộ website chỉ phục vụ một thị trường, không có các URL tương đương theo ngôn ngữ hoặc khu vực, hreflang không đem lại giá trị rõ ràng.
Cũng không nên tạo hàng loạt phiên bản gần như giống hệt chỉ để “phủ” nhiều quốc gia. Ví dụ, en-US, en-CA và en-AU cùng một nội dung, cùng giá tiền, cùng điều kiện giao hàng và không có khác biệt trải nghiệm. Trường hợp này có thể dùng en hoặc một phiên bản quốc tế duy nhất, thay vì mở rộng cấu trúc khiến việc bảo trì đối ứng trở nên nặng nề.
Nếu nội dung giữa các ngôn ngữ không tương đương, chẳng hạn một trang tiếng Việt giới thiệu dịch vụ và một trang tiếng Anh chỉ là trang tuyển dụng, không nên đưa chúng vào cùng nhóm hreflang. Hreflang không biến hai URL khác mục đích thành phiên bản thay thế của nhau.
Cuối cùng, hreflang không thay thế bản dịch chất lượng, cấu trúc URL, canonical, redirect hoặc chiến lược nội dung địa phương hóa. Cấu hình đúng giúp Google chọn đúng phiên bản trong số các URL hợp lệ; nó không bảo đảm URL sẽ xếp hạng, không ép Google index mọi phiên bản và cũng không sửa được nội dung mỏng.
Checklist nghiệm thu hreflang
- Mỗi nhóm có đầy đủ URL của các ngôn ngữ hoặc khu vực thực sự tồn tại.
- Mỗi URL có self-reference và liên kết đối ứng hai chiều.
- Mã ngôn ngữ, mã khu vực dùng đúng định dạng, chẳng hạn
vi-VNhoặcen-GB. - Có
x-defaultkhi website cần một phiên bản dự phòng hoặc trang chọn ngôn ngữ. - Tất cả URL đều là URL tuyệt đối, dùng HTTPS và trả mã 200.
- URL không bị chặn bởi robots.txt, không yêu cầu đăng nhập và không trỏ vào redirect chain.
- Canonical của mỗi phiên bản trỏ về chính phiên bản đó, trừ khi có chủ đích kỹ thuật rõ ràng.
- Danh sách trong head, sitemap và HTTP header không mâu thuẫn.
- Sau mỗi lần đổi slug, chuyển domain, đổi ngôn ngữ hoặc xóa URL, ma trận hreflang được cập nhật đồng thời.
Triển khai hreflang tốt không nằm ở việc chèn thật nhiều thẻ, mà ở việc duy trì một nhóm URL nhất quán từ dữ liệu nguồn đến HTML, sitemap và phản hồi máy chủ. Khi quy tắc đối ứng, x-default, mã ngôn ngữ và trạng thái URL được kiểm soát tự động, hreflang trở thành một phần có thể kiểm thử của hệ thống SEO kỹ thuật thay vì một đoạn mã được thêm vào theo cảm tính.
Đọc thêm
- Dịch vụ geo — triển khai trọn gói, có cam kết đo lường bằng số.
- Bảng báo giá seo — xem phạm vi công việc và mức đầu tư.
- PageSpeed Insights: Đọc Kết Quả Đúng Và Sửa Đúng Chỗ
- FAQ Schema: Cách Khai Báo Đúng Và Vì Sao Google Đã Siết Lại
Cần làm thật phần “hreflang” này trên site của bạn?
Gửi tên miền, chúng tôi chạy audit và trả về danh sách việc theo thứ tự tác động — kèm số đo hiện trạng, không phải nhận định cảm tính.