ETag & Last-Modified Headers
Header HTTP hỗ trợ kiểm tra tính mới của tài nguyên khi request lại, giúp giảm băng thông và tăng hiệu quả caching.
ETag & Last-Modified Headers là gì?
ETag (Entity Tag) và Last-Modified là hai header HTTP do máy chủ gửi kèm khi trả về tài nguyên (như HTML, CSS, JS, hình ảnh). Chúng giúp trình duyệt xác định nhanh xem phiên bản tài nguyên đã lưu trong bộ nhớ đệm (cache) còn mới hay đã lỗi thời — từ đó quyết định có nên tải lại toàn bộ hay chỉ kiểm tra nhanh (conditional request).
ETag là chuỗi định danh duy nhất do máy chủ tạo ra cho mỗi phiên bản tài nguyên — thường dựa trên nội dung (strong ETag) hoặc dấu vết thay đổi (weak ETag, bắt đầu bằng W/). Last-Modified là thời điểm cuối cùng tài nguyên được chỉnh sửa, ở định dạng ngày giờ chuẩn HTTP (ví dụ: Wed, 21 Oct 2023 07:28:00 GMT).
Tại sao quan trọng trong SEO?
Cả hai header đều tác động trực tiếp đến hiệu suất tải trang và hành vi lập chỉ mục của công cụ tìm kiếm:
- Giảm tải máy chủ & băng thông: Khi trình duyệt gửi yêu cầu điều kiện (như
IF-None-MatchhoặcIF-Modified-Since), máy chủ trả về mã304 Not Modifiedthay vì200 OK+ nội dung đầy đủ — tiết kiệm tới 70–95% dữ liệu truyền đi. - Tăng tốc trải nghiệm người dùng: Trang tải lại nhanh hơn nhờ phục vụ từ cache cục bộ → giảm tỷ lệ thoát, tăng thời gian tương tác — yếu tố gián tiếp hỗ trợ xếp hạng.
- Hỗ trợ bot Googlebot hoạt động hiệu quả
- Googlebot dùng cơ chế tương tự để kiểm tra cập nhật trang mà không cần tải lại toàn bộ — giúp thu thập dữ liệu tần suất cao hơn với chi phí thấp hơn.
- Nếu thiếu hoặc cấu hình sai, bot có thể bỏ sót cập nhật hoặc tiêu tốn thêm tài nguyên crawl budget.
- Tránh trùng lặp nội dung tiềm ẩn: Khi nhiều URL dẫn đến cùng một nội dung (ví dụ: có tham số theo dõi), ETag nhất quán giúp bot nhận diện tính duy nhất — nhưng không thay thế canonical.
Cách hoạt động
Khi lần đầu truy cập, trình duyệt nhận tài nguyên kèm hai header:
ETag: "abc123" Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
Lần sau, nếu tài nguyên nằm trong thời hạn cache (Cache-Control hoặc Expires), trình duyệt gửi yêu cầu điều kiện:
- Với ETag:
IF-None-Match: "abc123" - Với Last-Modified:
IF-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT
Máy chủ so sánh và phản hồi:
- Nếu khớp → trả
304 Not Modified, trình duyệt dùng bản cache. - Nếu khác → trả
200 OKkèm nội dung mới và header cập nhật.
Lưu ý: ETag ưu tiên hơn Last-Modified nếu cả hai đều có. Nếu chỉ có một, hệ thống sẽ dùng cái đó.
Hướng dẫn thực hiện
- Kiểm tra hiện trạng: Dùng DevTools (tab Network → chọn file → xem phần Response Headers) hoặc lệnh
curl -I https://example.com/style.css. - Bật ETag:
- Apache: Đảm bảo dòng
FileETag INode MTime SizehoặcFileETag Allcó trong.htaccesshoặc cấu hình vhost (mặc định thường bật). - Nginx: Thêm
etag on;trong khốiserverhoặclocation(bật mặc định từ phiên bản 1.3.3). - Node.js/Express: Dùng middleware
express.static({ etag: true })(mặc định bật).
- Apache: Đảm bảo dòng
- Bật Last-Modified:
- Hầu hết web server đều tự sinh Last-Modified từ thời gian sửa file — không cần cấu hình thủ công.
- Nếu dùng CDN hoặc hệ thống quản lý nội dung (CMS), kiểm tra xem thời gian sửa file có được giữ nguyên khi xuất bản hay không (một số CMS ghi đè thời gian → Last-Modified sai).
- Tối ưu kết hợp:
- Đảm bảo
Cache-Control: public, max-age=31536000cho tài nguyên tĩnh (CSS, JS, ảnh) để kích hoạt caching lâu dài. - Không tắt ETag nếu dùng CDN đa vùng — một số CDN phụ thuộc vào ETag để đồng bộ cache giữa các edge node.
- Tránh dùng ETag dựa trên ID máy chủ (như inode) trên môi trường load-balancer nhiều máy chủ — gây mâu thuẫn. Thay vào đó, dùng ETag dựa trên nội dung (content hash) hoặc tắt ETag và chỉ dùng Last-Modified.
- Đảm bảo
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 file trả ETag khác nhau khi qua load balancer | Tắt ETag (FileETag None trên Apache; etag off; trên Nginx) và chỉ dùng Last-Modified — hoặc chuyển sang ETag dựa trên hash nội dung. |
| Last-Modified luôn là thời điểm hiện tại | Header thay đổi mỗi lần tải dù nội dung không đổi | Kiểm tra CMS hoặc script sinh file: đảm bảo không ghi đè thời gian sửa khi xuất bản. Với WordPress, dùng plugin như WP Super Cache hoặc thiết lập filemtime() đúng cách. |
| Thiếu cả hai header trên tài nguyên tĩnh | Response không có ETag và Last-Modified |
Kích hoạt ETag và kiểm tra quyền đọc file trên máy chủ. Với Nginx, xác minh sendfile off; nếu dùng sendfile — vì sendfile có thể vô hiệu hóa Last-Modified. |
Ví dụ thực tế
Một trang tin tức có bài viết cập nhật hàng ngày. File article.js được chỉnh sửa lúc 10:15:22 GMT ngày 5/4/2024:
HTTP/1.1 200 OK Content-Type: application/javascript ETag: "v2-8a3f9c1e" Last-Modified: Fri, 05 Apr 2024 10:15:22 GMT Cache-Control: public, max-age=3600
Sau 30 phút, trình duyệt gửi lại yêu cầu:
GET /article.js HTTP/1.1 IF-None-Match: "v2-8a3f9c1e" IF-Modified-Since: Fri, 05 Apr 2024 10:15:22 GMT
Máy chủ kiểm tra và thấy chưa thay đổi → trả ngay:
HTTP/1.1 304 Not Modified ETag: "v2-8a3f9c1e" Last-Modified: Fri, 05 Apr 2024 10:15:22 GMT
Kết quả: tải lại trong ~20ms thay vì 350ms, tiết kiệm 124KB dữ liệu.
Câu hỏi thường gặp
ETag và Last-Modified có nên dùng cùng lúc không?
Có, và đây là thực tiễn tốt nhất. Máy chủ sẽ ưu tiên ETag nếu cả hai đều có. Việc kết hợp tăng độ chính xác: ETag phát hiện thay đổi nhỏ (như dấu cách thừa), Last-Modified giúp fallback khi ETag bị vô hiệu hóa.
Googlebot có sử dụng hai header này không?
Có. Googlebot tuân thủ chuẩn HTTP/1.1 và gửi IF-None-Match và IF-Modified-Since khi quét lại trang. Tuy nhiên, bot không phụ thuộc hoàn toàn vào chúng — vẫn có thể quét lại toàn bộ nếu nghi ngờ nội dung thay đổi hoặc hết hạn max-age.
Có nên tắt ETag để tăng tốc?
Chỉ nên tắt nếu gặp xung đột trong môi trường nhiều máy chủ hoặc CDN không hỗ trợ. Trên single-server hoặc CDN hiện đại (Cloudflare, Fastly), việc tắt ETag thường làm giảm hiệu quả cache — đặc biệt với tài nguyên động hoặc có biến thể (ví dụ: phiên bản mobile/desktop). Quyết định tùy trường hợp.