Technical SEO

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.

3 lượt xem Cập nhật: 26/05/2026

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-Match hoặc IF-Modified-Since), máy chủ trả về mã 304 Not Modified thay 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 OK kè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

  1. 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.
  2. Bật ETag:
    • Apache: Đảm bảo dòng FileETag INode MTime Size hoặc FileETag All có trong .htaccess hoặc cấu hình vhost (mặc định thường bật).
    • Nginx: Thêm etag on; trong khối server hoặc location (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).
  3. 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).
  4. Tối ưu kết hợp:
    • Đảm bảo Cache-Control: public, max-age=31536000 cho 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.

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ó ETagLast-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-MatchIF-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.