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ì? Ảnh hưởng của bộ nhớ đệm đến SEO và tốc độ web

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ũ.

Đồng hồ bấm giờ kim cổ điển phản chiếu trên mặt kính

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ĩaHay dùng cho
max-age=NBả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=NNhư 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ùngHTML cần luôn mới
no-storeKhông được lưu ở bất kỳ đâuTrang tài khoản, giỏ hàng, dữ liệu nhạy cảm
privateChỉ trình duyệt của người dùng được lưu, CDN thì khôngTrang có nội dung theo người dùng
publicBộ đệm dùng chung được lưu cả khi thường không được phépTài nguyên công khai
immutableNộ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 trangFile có mã phiên bản trong tên
stale-while-revalidate=NHế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ềnHTML, dữ liệu đổi vừa phải
must-revalidateHế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ênCache-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ố địnhmax-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ườngno-cache kèm ETag, hoặc max-age ngắnLuô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ậtNhanh ở CDN, không cũ quá vài phút
Trang giá, khuyến mãi, tồn khomax-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ánprivate, no-storeKhông bao giờ để CDN lưu nội dung của một người rồi phát cho người khác
Cấu hình tham khảo — điều chỉnh theo nhịp cập nhật thực tế của website

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ênTrướcSau
HTML trang chủ, khuyến mãis-maxage=86400s-maxage=300, stale-while-revalidate=60, xoá đệm khi đăng khuyến mãi
styles.cssmax-age=31536000, tên cố địnhThê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àngKhông khai báoprivate, no-store
Ví dụ giả định — trước và sau

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í

Bài viết liên quan