SEO
Cache-Control là gì? Ảnh hưởng của bộ nhớ đệm đến SEO và tốc độ web
Chương trình giảm 30% kết thúc từ tối Chủ nhật, nhưng sáng thứ Hai khách vẫn thấy banner giảm giá và gọi lên hỏi. Trang chủ đang được lưu đệm 24 giờ — và không ai nhớ đã đặt như vậy.
ScalioCập nhật 9 phút đọc

Cache-Control là gì? Cache-Control là header HTTP máy chủ gửi kèm mỗi phản hồi để quy định ai được lưu bản sao (trình duyệt, CDN, proxy), lưu bao lâu và khi nào phải hỏi lại máy chủ. Đặt đúng, trang tải nhanh hơn ở lần xem sau và máy chủ đỡ tải; đặt sai, người dùng — và có thể cả bot — thấy giá, khuyến mãi, nội dung đã cũ.

Cache-Control không phải yếu tố xếp hạng trực tiếp. Nó tác động tới SEO qua hai đường: tốc độ với người dùng thật, góp vào Core Web Vitals, và độ đúng của nội dung mà người dùng và công cụ tìm kiếm nhận được. Bài này tập trung vào header; cách CDN dùng header đó và rủi ro riêng của CDN nằm ở bài CDN SEO.
Các chỉ thị cần biết
| Chỉ thị | Ý nghĩa | Hay dùng cho |
|---|---|---|
| max-age=N | Bản sao còn “tươi” trong N giây, mọi bộ đệm dùng lại không cần hỏi máy chủ | File tĩnh, ảnh |
| s-maxage=N | Như max-age nhưng chỉ cho bộ đệm dùng chung (CDN, proxy), ghi đè max-age ở đó | HTML lưu ở CDN thời gian ngắn |
| no-cache | Được lưu, nhưng phải hỏi lại máy chủ trước mỗi lần dùng | HTML cần luôn mới |
| no-store | Không được lưu ở bất kỳ đâu | Trang tài khoản, giỏ hàng, dữ liệu nhạy cảm |
| private | Chỉ trình duyệt của người dùng được lưu, CDN thì không | Trang có nội dung theo người dùng |
| public | Bộ đệm dùng chung được lưu cả khi thường không được phép | Tài nguyên công khai |
| immutable | Nội dung không đổi trong thời gian tươi, trình duyệt khỏi kiểm tra lại cả khi tải lại trang | File có mã phiên bản trong tên |
| stale-while-revalidate=N | Hết hạn rồi vẫn được dùng bản cũ thêm N giây trong lúc lấy bản mới ở nền | HTML, dữ liệu đổi vừa phải |
| must-revalidate | Hết hạn thì bắt buộc kiểm tra lại, không được dùng bản cũ | Nội dung không được phép cũ |
Nhầm lẫn phổ biến nhất: no-cache không có nghĩa là “không lưu”. Nó nghĩa là “lưu nhưng luôn hỏi lại”. Muốn không lưu, dùng no-store. Một điều ít người biết: phản hồi không có Cache-Control mà có Last-Modified vẫn có thể bị trình duyệt tự ước lượng thời gian lưu — vì vậy nên khai báo rõ thay vì để trống.
ETag, Last-Modified và mã 304
Khi bản sao hết hạn (hoặc dùng no-cache), trình duyệt không cần tải lại toàn bộ. Nó gửi yêu cầu có điều kiện kèm ETag (dấu vân tay của phiên bản) hoặc Last-Modified (thời điểm sửa cuối) đã nhận trước đó. Nếu nội dung chưa đổi, máy chủ trả 304 Not Modified không kèm nội dung — nhanh và nhẹ hơn nhiều. Ý nghĩa của mã 304 trong bức tranh chung có ở bài HTTP status code.
Theo tài liệu tổng quan về crawler của Google, hạ tầng thu thập của Google hỗ trợ yêu cầu có điều kiện qua ETag và Last-Modified (ưu tiên ETag khi có cả hai). Với website lớn, trả 304 đúng cho trang không đổi giúp bot đỡ tải lại những gì đã biết — một phần nhỏ trong câu chuyện crawl budget. Điều kiện: ETag phải đổi khi nội dung đổi, và giữ nguyên khi nội dung không đổi. ETag sinh ngẫu nhiên mỗi lần tải mất hết tác dụng.
Chính sách theo loại tài nguyên
| Tài nguyên | Cache-Control gợi ý | Lý do |
|---|---|---|
| CSS, JS, font có mã phiên bản trong tên (app.3f9a2c.css) | public, max-age=31536000, immutable | Đổi nội dung là đổi tên tệp, nên lưu một năm vẫn an toàn |
| Ảnh sản phẩm, ảnh bài viết tên cố định | max-age vài ngày đến vài tuần, kèm ETag | Ít đổi, nhưng nếu thay ảnh cùng tên thì không phải chờ quá lâu |
| HTML trang thông thường | no-cache kèm ETag, hoặc max-age ngắn | Luôn kiểm tra bản mới, vẫn tiết kiệm nhờ 304 |
| HTML ở CDN (trang chủ, danh mục) | s-maxage vài phút, stale-while-revalidate, xoá đệm khi cập nhật | Nhanh ở CDN, không cũ quá vài phút |
| Trang giá, khuyến mãi, tồn kho | max-age rất ngắn hoặc no-cache; xoá đệm CDN ngay khi đổi giá | Sai giá gây mất lòng tin và khiếu nại |
| Tài khoản, giỏ hàng, thanh toán | private, no-store | Không bao giờ để CDN lưu nội dung của một người rồi phát cho người khác |
Nguyên tắc nền: tệp có phiên bản thì lưu lâu, tệp không phiên bản thì lưu ngắn. Đặt max-age một năm cho main.css không có mã phiên bản là cách nhanh nhất khiến người dùng cũ thấy giao diện vỡ sau mỗi lần cập nhật. Ảnh cũng nằm trong bài toán này — dung lượng và định dạng ảnh có ở bài image SEO.
Ví dụ thực hành: chuỗi cà phê và banner khuyến mãi cũ
Ví dụ giả định: website của một chuỗi cà phê dùng CDN, HTML trang chủ được đặt s-maxage=86400 để “cho nhanh”. Mỗi lần đổi khuyến mãi, khách thấy nội dung cũ đến một ngày, nhân viên phải giải thích tại quầy. Kiểm tra header cho thấy thêm hai vấn đề: CSS không có mã phiên bản nhưng đặt max-age một năm, và trang giỏ hàng không có chỉ thị nào.
| Tài nguyên | Trước | Sau |
|---|---|---|
| HTML trang chủ, khuyến mãi | s-maxage=86400 | s-maxage=300, stale-while-revalidate=60, xoá đệm khi đăng khuyến mãi |
| styles.css | max-age=31536000, tên cố định | Thêm mã phiên bản vào tên tệp khi build, giữ max-age một năm kèm immutable |
| Giỏ hàng | Không khai báo | private, no-store |
Thời gian tải trang chủ với khách quay lại gần như không đổi, vì CSS, JS, font vẫn lưu lâu. Thứ thay đổi là banner khuyến mãi cập nhật trong vòng vài phút.
Kiểm tra header đang thật sự trả về
- curl -sI kèm URL: xem các dòng cache-control, etag, last-modified, age. Header age cho biết bản sao đã nằm trong bộ đệm dùng chung bao nhiêu giây.
- DevTools › Network: cột Size hiện “(disk cache)” hoặc “(memory cache)” khi lấy từ bộ đệm, cột Status hiện 304 khi xác nhận lại. Tick “Disable cache” khi cần xem như khách lần đầu.
- Header riêng của CDN (tên tuỳ nhà cung cấp) cho biết lần yêu cầu là trúng hay trượt bộ đệm.
- Kiểm tra sau mỗi lần phát hành: cấu hình máy chủ, plugin bộ nhớ đệm và CDN có thể ghi đè nhau.
Sai lầm thường gặp
- Hiểu no-cache là không lưu và dùng nó cho trang nhạy cảm, trong khi cần no-store.
- Lưu HTML cả ngày ở CDN để đạt điểm tốc độ, rồi giá và khuyến mãi bị cũ.
- Lưu lâu tệp không có phiên bản, người dùng nhận CSS cũ với HTML mới.
- Để CDN lưu trang có nội dung riêng của người dùng vì thiếu private.
- Dùng no-store cho mọi HTML cho “an toàn”, mất cả lợi ích của 304; ở một số trình duyệt, no-store còn có thể khiến trang không được dùng bộ nhớ đệm khi bấm quay lại.
Câu hỏi thường gặp
Cache-Control có ảnh hưởng trực tiếp tới thứ hạng không?
Không trực tiếp. Nó ảnh hưởng tới tốc độ với người dùng thật và độ mới của nội dung — hai thứ đó mới tác động tới trải nghiệm và kết quả tìm kiếm.
no-cache và no-store khác nhau thế nào?
no-cache cho phép lưu nhưng bắt buộc hỏi lại máy chủ trước mỗi lần dùng, thường kết hợp ETag để nhận 304. no-store cấm lưu hoàn toàn, dùng cho dữ liệu nhạy cảm.
Đổi giá xong mà khách vẫn thấy giá cũ thì làm gì?
Kiểm tra header của trang bằng curl hoặc DevTools. Nếu CDN đang lưu HTML lâu, xoá bộ đệm ngay và giảm s-maxage cho nhóm trang giá. Nếu trình duyệt lưu, chuyển HTML sang no-cache kèm ETag.
Xếp bài khuyến mãi theo ngày, qua bước duyệt, viết đúng giọng thương hiệu trong lịch nội dung của Scalio.
Điền hồ sơ thương hiệu một lần: Scalio lập chiến lược, viết bài theo đúng giọng của bạn, xếp lịch đăng và chấm điểm marketing.
Tạo tài khoản miễn phí

