hreflang HTTP Header
Cách triển khai hreflang thông qua header HTTP thay vì thẻ HTML hoặc sitemap, thường dùng cho nội dung không phải HTML như PDF.
hreflang HTTP Header là gì?
hreflang HTTP Header là cách khai báo phiên bản ngôn ngữ và khu vực địa lý của một tài nguyên (như file PDF, hình ảnh, API response…) thông qua tiêu đề Link trong phản hồi HTTP — thay vì dùng thẻ <link rel='alternate' hreflang='...'> trong HTML hoặc khai báo trong sitemap. Đây là phương pháp chuẩn được Google và các công cụ tìm kiếm hỗ trợ để hiểu mối quan hệ giữa các phiên bản nội dung đa ngôn ngữ/khu vực khi tài nguyên không phải trang web HTML.
Tại sao quan trọng trong SEO?
Khi bạn có cùng nội dung ở nhiều ngôn ngữ (ví dụ: báo cáo thường niên bằng tiếng Anh, tiếng Việt, tiếng Thái), nhưng chỉ tồn tại dưới dạng file PDF — thì việc dùng thẻ hreflang trong HTML là không khả thi. Lúc này, hreflang HTTP Header trở thành lựa chọn duy nhất để:
- Giúp Google xác định đúng phiên bản nào nên hiển thị cho người dùng ở quốc gia/ngôn ngữ cụ thể,
- Tránh trùng lặp nội dung (duplicate content) giữa các phiên bản ngôn ngữ,
- Phân bổ tín hiệu liên kết (link equity) hợp lý giữa các phiên bản,
- Hỗ trợ trải nghiệm người dùng quốc tế tốt hơn — ví dụ: người dùng Việt Nam tìm thấy bản PDF tiếng Việt đầu tiên thay vì bản tiếng Anh.
Google xác nhận hỗ trợ Link header với thuộc tính hreflang từ năm 2013, và vẫn duy trì hỗ trợ đầy đủ đến thời điểm hiện tại (2024).
Cách hoạt động
Khi máy chủ gửi phản hồi HTTP cho một tài nguyên (ví dụ: baocao-2024-vn.pdf), nó kèm theo tiêu đề Link chứa các liên kết thay thế có gán thuộc tính hreflang. Trình thu thập dữ liệu (crawler) đọc header này và xây dựng mối quan hệ giữa các phiên bản — tương tự như khi phân tích thẻ <link> trong HTML.
Ví dụ đơn giản: Khi truy cập baocao-2024-vn.pdf, server trả về:
Link: <https://example.com/baocao-2024-en.pdf>; rel="alternate"; hreflang="en", <https://example.com/baocao-2024-th.pdf>; rel="alternate"; hreflang="th-TH"
Google sẽ hiểu rằng ba tệp PDF này là các phiên bản ngôn ngữ khác nhau của cùng một nội dung.
Hướng dẫn thực hiện
Dưới đây là các bước triển khai hreflang qua HTTP header — áp dụng trên các nền tảng phổ biến:
- Xác định đầy đủ các phiên bản ngôn ngữ/khu vực: Ghi rõ URL, mã ngôn ngữ (theo chuẩn BCP 47), và nếu cần — mã khu vực (ví dụ:
vi-VN,en-GB,fr-FR). Không dùngvivàvi-VNđồng thời trừ khi có sự khác biệt rõ ràng về nội dung. - Cấu hình server để trả về header
Link:- Apache: Dùng
Header set Linktrong.htaccesshoặc cấu hình virtual host. - Nginx: Dùng chỉ thị
add_headertrong khốilocation. - Node.js (Express): Dùng
res.append('Link', '...'). - PHP: Dùng
header('Link: ...')trước khi xuất nội dung.
- Apache: Dùng
- Đảm bảo header được gửi đúng cho từng tài nguyên: Mỗi file PDF (hoặc tài nguyên không HTML) phải trả về header riêng, phản ánh chính xác các phiên bản liên quan — không dùng chung header cho toàn bộ thư mục.
- Kiểm tra kỹ thuật: Dùng
curl -Ihoặc công cụ như HTTP Status Checker,Lỗi Mô tả Cách khắc phục Header bị lặp hoặc thiếu dấu phẩy giữa các liên kết Cú pháp Linkyêu cầu mỗi cặp liên kết được ngăn cách bằng dấu phẩy. Nếu thiếu, toàn bộ header bị bỏ qua.Viết lại header theo đúng định dạng: Link: <url1>; rel="alternate"; hreflang="xx", <url2>; rel="alternate"; hreflang="yy".Dùng hreflang='x-default' sai vị trí x-defaultchỉ nên dùng cho phiên bản mặc định khi không xác định được ngôn ngữ — nhưng không được đặt làm phiên bản duy nhất, hoặc đặt sai URL.Chỉ dùng x-defaultkhi có ít nhất 2 phiên bản ngôn ngữ rõ ràng. Đặt URL trỏ tới trang đích đa ngôn ngữ (ví dụ: trang chọn ngôn ngữ) hoặc phiên bản tiếng Anh chung — tùy trường hợp.Không có quan hệ hai chiều (bi-directional) Phiên bản tiếng Việt trỏ tới tiếng Anh, nhưng phiên bản tiếng Anh không trỏ lại tiếng Việt → Google bỏ qua toàn bộ nhóm. Mỗi phiên bản phải liệt kê đầy đủ tất cả các phiên bản còn lại — bao gồm chính nó nếu cần (tuy không bắt buộc). Kiểm tra thủ công hoặc dùng script kiểm tra tính đối xứng. Header bị chặn bởi CDN hoặc reverse proxy Một số CDN (Cloudflare, Akamai…) hoặc proxy loại bỏ hoặc không chuyển tiếp header Linktheo mặc định.Cấu hình CDN cho phép chuyển tiếp header Link; kiểm tra bằngcurl -Itrực tiếp tới origin server và so sánh với CDN.Ví dụ thực tế
Một công ty đa quốc gia xuất bản báo cáo thường niên ở 3 định dạng:
https://example.com/reports/annual-2024-vn.pdf→ tiếng Việt (vi-VN)https://example.com/reports/annual-2024-en.pdf→ tiếng Anh (en-US)https://example.com/reports/annual-2024-jp.pdf→ tiếng Nhật (ja-JP)
Cấu hình Nginx cho tệp
annual-2024-vn.pdf:location ~* /reports/annual-2024-vn\.pdf$ {
add_header Link '<https://example.com/reports/annual-2024-en.pdf>; rel="alternate"; hreflang="en-US", <https://example.com/reports/annual-2024-jp.pdf>; rel="alternate"; hreflang="ja-JP"';
}Tương tự, mỗi tệp còn lại cũng phải có header trỏ ngược đầy đủ. Tổng cộng 3 tệp → mỗi tệp có 2 giá trị
Link(không kể chính nó).Câu hỏi thường gặp
hreflang HTTP Header có thay thế được thẻ HTML không?
Không. Hai phương pháp này bổ sung lẫn nhau, không thay thế. Dùng thẻ HTML cho trang web HTML; dùng HTTP header cho tài nguyên không HTML (PDF, JSON, SVG…). Nếu một trang HTML đồng thời liên kết tới PDF đa ngôn ngữ, nên dùng cả hai: thẻ
<link>trong HTML cho các trang, và header cho các file đính kèm.Google có ưu tiên hreflang từ header hay từ thẻ HTML?
Google xử lý cả hai nguồn như nhau — không có ưu tiên nào. Tuy nhiên, nếu có mâu thuẫn giữa hai nguồn (ví dụ: HTML nói phiên bản tiếng Việt trỏ tới tiếng Hàn, còn header nói trỏ tới tiếng Nhật), Google có thể bỏ qua toàn bộ nhóm hreflang. Vì vậy, cần đảm bảo tính nhất quán tuyệt đối giữa các nguồn.
Có thể dùng hreflang HTTP Header cho trang HTML không?
Có thể, nhưng không khuyến khích. Google ưu tiên đọc hreflang từ thẻ HTML vì dễ kiểm soát, dễ debug và hỗ trợ đầy đủ trong Search Console. Dùng header cho HTML gây khó khăn trong quản lý, dễ thiếu sót khi triển khai, và không hiển thị cảnh báo lỗi trong GSC. Chỉ nên dùng header cho HTML nếu không thể chỉnh sửa mã nguồn (ví dụ: CMS khóa cứng, legacy system) — và phải kiểm tra rất kỹ.