Last-Modified Header
Header HTTP chỉ thời điểm cuối cùng tài nguyên được chỉnh sửa, hỗ trợ kiểm tra cache điều kiện.
Last-Modified Header là gì?
Last-Modified là một header HTTP do máy chủ gửi kèm trong phản hồi (response), chứa thời điểm cuối cùng tài nguyên (như HTML, CSS, JS, ảnh) được chỉnh sửa. Giá trị là chuỗi ngày giờ theo định dạng RFC 7232: Sun, 01 Jan 2023 00:00:00 GMT. Đây là cơ chế đơn giản nhất để hỗ trợ kiểm tra cache điều kiện (conditional requests), giúp trình duyệt quyết định có tải lại tài nguyên hay dùng bản đã lưu trong bộ nhớ đệm.
Tại sao quan trọng trong SEO?
Trong tối ưu hiệu năng web — yếu tố xếp hạng gián tiếp nhưng mạnh mẽ — Last-Modified góp phần giảm tải cho máy chủ và tăng tốc độ hiển thị trang. Khi trình duyệt gửi yêu cầu GET kèm header If-Modified-Since, máy chủ so sánh thời gian này với thời điểm cập nhật cuối cùng. Nếu không thay đổi, máy chủ trả về mã trạng thái 304 Not Modified (không gửi nội dung), tiết kiệm băng thông và rút ngắn thời gian tải. Điều này cải thiện chỉ số Core Web Vitals như Time to First Byte (TTFB) và Largest Contentful Paint (LCP) — hai tín hiệu Google đánh giá cao.
Ngoài ra, việc duy trì cache hiệu quả giúp bot Googlebot thu thập trang nhanh hơn, đặc biệt với trang tĩnh hoặc ít thay đổi. Tuy nhiên, Last-Modified không ảnh hưởng trực tiếp đến thứ hạng — nó chỉ hỗ trợ SEO thông qua hiệu năng và trải nghiệm người dùng.
Cách hoạt động
Quy trình gồm 2 bước chính:
- Lần đầu truy cập: Trình duyệt gửi yêu cầu
GETbình thường → Máy chủ trả về mã200 OKkèm headerLast-Modified: [thời gian]và nội dung đầy đủ. - Lần sau (có cache): Trình duyệt gửi lại yêu cầu kèm
If-Modified-Since: [giá trị Last-Modified trước đó]. Máy chủ kiểm tra:- Nếu tài nguyên chưa thay đổi → Trả
304 Not Modified, không gửi thân phản hồi. - Nếu đã thay đổi → Trả
200 OKkèmLast-Modifiedmới và nội dung cập nhật.
- Nếu tài nguyên chưa thay đổi → Trả
Lưu ý: Cơ chế này chỉ hoạt động khi tài nguyên được lưu cache hợp lệ (có header Cache-Control hoặc Expires phù hợp). Nếu không có cache, trình duyệt sẽ không gửi If-Modified-Since.
Hướng dẫn thực hiện
Việc thiết lập Last-Modified phụ thuộc vào nền tảng và cách quản lý tài nguyên:
- Server Apache: Dùng module
mod_headerskết hợpmod_setenvif. Thêm vào file.htaccesshoặc cấu hình virtual host:<IfModule mod_headers.c> <FilesMatch "\.(html|css|js|jpg|jpeg|png|gif)$"> Header set Last-Modified "expr=%{TIME_YEAR}-%{TIME_MON}-%{TIME_DAY}T%{TIME_HOUR}:%{TIME_MIN}:%{TIME_SEC}Z" </FilesMatch> </IfModule>Lưu ý: Cách trên dùng thời gian hệ thống — không phản ánh đúng thời điểm chỉnh sửa thực tế. Với tập tin tĩnh, nên dùngmod_expireskết hợp timestamp từ hệ thống tệp. - Server Nginx: Không hỗ trợ tự động sinh
Last-Modifieddựa trên thời gian chỉnh sửa tệp nếu không dùng module mở rộng. Mặc định, Nginx tự động gửi header này cho các tệp tĩnh nếu bậtsendfile onvàexpireschưa hết hạn. Kiểm tra bằng lệnhcurl -I https://example.com/style.css. - WordPress: Plugin như WP Super Cache hoặc LiteSpeed Cache tự động thêm
Last-Modifiedcho trang HTML và tài nguyên tĩnh — không cần cấu hình thủ công. - Framework (Node.js/Express): Dùng middleware
express.static()— mặc định bậtLast-Modifiednếu tệp tồn tại và có thời gian chỉnh sửa hợp lệ.
Điều kiện bắt buộc để header hoạt động hiệu quả:
- Tài nguyên phải có thời gian chỉnh sửa rõ ràng (không phải tệp tạo động mỗi lần gọi).
- Không xung đột với
ETag: Nếu cả hai đều có, trình duyệt ưu tiênETagkhi kiểm tra điều kiện (theo RFC 7232). - Giá trị thời gian phải đúng múi giờ GMT/UTC — không dùng múi giờ địa phương.
Lỗi thường gặp
| Lỗi | Nguồn gốc | Cách khắc phục |
|---|---|---|
| Header thiếu hoặc bị ghi đè | Máy chủ không cấu hình, hoặc plugin CDN/Proxy (Cloudflare, Varnish) vô hiệu hóa | Kiểm tra phản hồi bằng curl -I hoặc DevTools → Tab Network. Nếu thiếu, bật lại ở mức server hoặc tắt tính năng “auto-minify” trên CDN (vì nó có thể loại bỏ header). |
| Thời gian sai (tương lai hoặc quá khứ xa) | Server đồng hồ lệch múi giờ, hoặc lập trình sinh thời gian thủ công sai định dạng | Đồng bộ thời gian máy chủ với NTP (sudo ntpdate -s time.nist.gov). Kiểm tra định dạng: chỉ chấp nhận RFC 7232 (ví dụ: Wed, 21 Oct 2023 07:28:00 GMT). |
| Không kích hoạt 304 cho tài nguyên động | Tài nguyên PHP/JSX được sinh mỗi lần gọi → thời gian luôn mới | Với nội dung động, nên dùng ETag hoặc tắt Last-Modified để tránh gây hiểu lầm. Hoặc áp dụng logic kiểm tra thay đổi nội dung (hash) thay vì thời gian. |
Ví dụ thực tế
Một trang blog tĩnh tại https://blog.example.com/post.html:
- Lần 1: Trình duyệt gửi
GET /post.html→ Máy chủ trả:
HTTP/1.1 200 OK
Last-Modified: Tue, 15 Aug 2023 14:30:22 GMT
Cache-Control: public, max-age=3600 - Sau 30 phút, người dùng tải lại → Trình duyệt gửi:
GET /post.html
If-Modified-Since: Tue, 15 Aug 2023 14:30:22 GMT - Máy chủ kiểm tra tệp — không thay đổi → Trả:
HTTP/1.1 304 Not Modified
(không có thân phản hồi, chỉ ~100 byte dữ liệu)
Kết quả: Tiết kiệm ~120 KB băng thông, thời gian tải giảm từ 450ms xuống còn ~25ms.
Câu hỏi thường gặp
Last-Modified có thay thế được ETag không?
Không. Last-Modified và ETag là hai cơ chế độc lập, bổ sung cho nhau. Last-Modified dựa trên thời gian — dễ triển khai nhưng kém chính xác nếu tệp được chỉnh sửa nhiều lần trong 1 giây hoặc đồng bộ giữa nhiều máy chủ. ETag dùng dấu vân tay (hash) nội dung — chính xác hơn nhưng tốn tài nguyên xử lý. Theo RFC, nếu cả hai đều có, trình duyệt ưu tiên ETag khi kiểm tra điều kiện.
Có cần thiết với trang dùng CDN không?
Có, nhưng vai trò thay đổi. CDN thường lưu cache theo thời gian (max-age) chứ không dùng Last-Modified để kiểm tra điều kiện — trừ khi cấu hình origin pull với cache revalidation. Tuy nhiên, nếu CDN chuyển tiếp request về origin, việc origin trả đúng Last-Modified giúp CDN quyết định có cập nhật cache hay không. Một số CDN (như Cloudflare) hỗ trợ “Origin Cache Control” để tận dụng header này.
Website tĩnh (HTML thuần) có nên bật Last-Modified?
Nên — miễn là tệp được lưu trên ổ cứng và thời gian chỉnh sửa được hệ điều hành ghi nhận chính xác. Với website tĩnh, đây là cách đơn giản và hiệu quả nhất để kích hoạt 304, đặc biệt khi nội dung ít thay đổi (ví dụ: trang giới thiệu, chính sách). Lưu ý: Nếu dùng build tool (Vite, Hugo), đảm bảo thời gian chỉnh sửa tệp đầu ra không bị ghi đè thành thời điểm build.