ETag
Mã định danh duy nhất cho phiên bản tài nguyên, dùng để xác minh tính mới khi kiểm tra cache.
ETag là gì?
ETag (Entity Tag) là một mã định danh duy nhất do máy chủ tạo ra để nhận diện phiên bản cụ thể của một tài nguyên web — như file HTML, CSS, JavaScript hoặc ảnh. Mã này được gửi kèm trong tiêu đề HTTP ETag khi trả về phản hồi (response), và trình duyệt lưu lại cùng với nội dung đã lưu vào bộ nhớ đệm (cache). Khi yêu cầu lại tài nguyên đó, trình duyệt gửi mã ETag cũ qua tiêu đề If-None-Match để hỏi máy chủ: "Tài nguyên này có thay đổi chưa?". Nếu chưa thay đổi, máy chủ trả về mã trạng thái 304 Not Modified, giúp tiết kiệm băng thông và tăng tốc độ tải.
Tại sao quan trọng trong SEO?
ETag ảnh hưởng trực tiếp đến hiệu suất tải trang — một yếu tố xếp hạng chính thức của Google từ năm 2010 (Core Web Vitals) và vẫn giữ vai trò then chốt trong thuật toán hiện hành. Khi ETag hoạt động đúng, người dùng quay lại trang nhanh hơn nhờ tái sử dụng cache hiệu quả; điều này làm giảm tỷ lệ thoát (bounce rate), tăng thời gian ở lại và cải thiện trải nghiệm người dùng — tất cả đều là tín hiệu gián tiếp nhưng mạnh mẽ mà Google dùng để đánh giá chất lượng trang.
Ngược lại, ETag sai cấu hình gây ra các vấn đề nghiêm trọng: yêu cầu không cần thiết gửi lên máy chủ, phản hồi 304 bị bỏ lỡ, hoặc thậm chí khiến cache không hoạt động trên CDN — dẫn đến tải lại toàn bộ tài nguyên mỗi lần, làm chậm trang, tăng tải server và làm xấu chỉ số LCP (Largest Contentful Paint) hoặc CLS (Cumulative Layout Shift).
Cách hoạt động
Quy trình ETag gồm 4 bước:
- Máy chủ trả tài nguyên kèm tiêu đề
ETag: "abc123"(giá trị có thể là weak — bắt đầu bằngW/— hoặc strong). - Trình duyệt lưu cả nội dung và ETag vào cache cục bộ.
- Khi yêu cầu lại, trình duyệt gửi
If-None-Match: "abc123". - Máy chủ so sánh giá trị ETag hiện tại với giá trị nhận được. Nếu trùng khớp → trả
304 Not Modified; nếu khác → trả200 OKkèm nội dung mới và ETag mới.
Lưu ý: ETag không thay thế Last-Modified, mà thường hoạt động song song hoặc ưu tiên hơn vì độ chính xác cao hơn (Last-Modified chỉ có độ phân giải 1 giây, trong khi ETag dựa trên nội dung hoặc hash).
Hướng dẫn thực hiện
Để bật và tối ưu ETag, bạn cần can thiệp ở cấp máy chủ hoặc CDN. Các bước cụ thể tùy hệ thống:
- Apache: Đảm bảo mod_headers và mod_expires đã bật. Thêm vào
.htaccesshoặc virtual host:<IfModule mod_headers.c> <FilesMatch "\.(html|css|js|png|jpg|jpeg|gif|ico|svg|woff2?)$"> Header set ETag "W/\"%{ETAG}e\"" </FilesMatch> </IfModule>Lưu ý: Giá trị ETag mặc định của Apache thường dựa trên inode, size và mtime — điều này gây lỗi khi dùng nhiều máy chủ (load balancing). Nên tắt và dùng cách sinh ETag theo nội dung (ví dụ quaFileETag None+ custom script). - Nginx: ETag được bật mặc định từ phiên bản 1.7.3 trở đi. Kiểm tra bằng lệnh
curl -I https://domain.com/file.js. Nếu cần tắt (trong trường hợp dùng CDN quản lý cache riêng), thêm vào khốilocation:etag off;
- CDN (Cloudflare, Cloudfront, BunnyCDN): Hầu hết tự quản lý ETag. Với Cloudflare, ETag được giữ nguyên từ origin nếu bạn bật Origin Cache Control. Với AWS CloudFront, cần bật Forward Headers cho
If-None-Matchnếu muốn hỗ trợ 304. - Ứng dụng Node.js (Express): Dùng middleware
express.static()— ETag bật mặc định. Để tắt:app.use(express.static('public', { etag: false })).
Lỗi thường gặp
| Lỗi | Dấu hiệu | Cách khắc phục |
|---|---|---|
| ETag không nhất quán giữa các máy chủ | Cùng một tài nguyên trả ETag khác nhau khi qua load balancer | Tắt ETag ở tầng cân bằng tải (FileETag None trên Apache; etag off trên Nginx); hoặc dùng ETag sinh từ hash nội dung (tùy trường hợp) |
| ETag bị CDN loại bỏ | Yêu cầu luôn trả 200 dù nội dung không đổi | Kiểm tra cấu hình CDN: bật forward header If-None-Match và If-Modified-Since; đảm bảo origin trả ETag rõ ràng |
| ETag mạnh (strong) gây overhead | Máy chủ tính hash toàn bộ file mỗi lần so sánh → tăng CPU | Dùng ETag yếu (W/"hash") nếu nội dung thay đổi theo phiên bản (ví dụ: tên file có hash như main.a1b2c3.css) |
Ví dụ thực tế
Một trang tin tức sử dụng Nginx + Cloudflare. Trước tối ưu, kiểm tra mạng (DevTools → Network) cho thấy file article.js luôn trả 200 OK dù không thay đổi — nguyên nhân: Cloudflare đang strip ETag do thiếu cấu hình forward header. Sau khi bật Cache Level → Standard và Edge Cache TTL → Respect Origin, đồng thời thêm quy tắc cache cho *.js với Cache-Control: public, max-age=31536000, immutable, yêu cầu thứ hai trả về 304 Not Modified trong 98% trường hợp. Kết quả: thời gian tải trang quay lại giảm trung bình 42%, LCP cải thiện từ 3.8s xuống 2.1s.
Câu hỏi thường gặp
ETag có cần thiết nếu đã dùng Cache-Control?
Có. Cache-Control quyết định “có lưu cache hay không”, còn ETag quyết định “có dùng lại cache hay không”. Hai cơ chế bổ sung nhau: Cache-Control giúp tránh gọi máy chủ trong thời gian nhất định; ETag giúp xác minh tính mới ngay cả sau khi hết hạn — đặc biệt hữu ích với tài nguyên có thời gian sống ngắn hoặc cập nhật thường xuyên.
ETag và Last-Modified nên dùng cái nào?
Nên dùng cả hai. Google khuyến nghị ưu tiên ETag vì độ chính xác cao hơn (không bị giới hạn bởi độ phân giải thời gian). Tuy nhiên, Last-Modified vẫn cần để hỗ trợ các client cũ hoặc proxy không hiểu ETag. Cả hai có thể tồn tại song song — máy chủ sẽ kiểm tra ETag trước, nếu không có thì dùng Last-Modified.
ETag có ảnh hưởng đến SEO trên mobile không?
Có, và còn lớn hơn trên desktop. Thiết bị di động thường có kết nối chậm và giới hạn băng thông. Việc tiết kiệm vài trăm KB mỗi lần tải lại nhờ ETag giúp giảm thời gian chờ, tăng khả năng hoàn thành chuyển đổi (CTA), và giảm tỷ lệ thoát — tất cả đều là yếu tố xếp hạng di động trực tiếp của Google.