Câu hỏi Các tiêu đề kiểm soát bộ nhớ cache HTTP lý tưởng cho các loại tài nguyên khác nhau


Tôi muốn tìm một bộ tiêu đề tối thiểu, hoạt động với bộ đệm và trình duyệt "tất cả" (cũng như khi sử dụng HTTPS!)

Trên trang web của tôi, tôi sẽ có ba loại tài nguyên:

(1) Vô hạn có thể lưu vào bộ nhớ cache (công khai / bình đẳng cho tất cả người dùng)

Ví dụ: 0A470E87CC58EE133616F402B5DDFE1C.cache.html (được tạo bởi GWT) 

  • Các tệp này được tự động gán tên mới, khi chúng thay đổi nội dung (dựa trên MD5).

  • Họ nên được lưu trữ càng nhiều càng tốt, ngay cả khi sử dụng HTTPS (vì vậy tôi giả định, tôi nên đặt Cache-Control: public, đặc biệt cho Firefox?)

  • Họ không nên yêu cầu khách hàng thực hiện một chuyến đi khứ hồi tới máy chủ để xác thực, nếu nội dung đã thay đổi.

(2) Thay đổi đôi khi (công khai / bình đẳng cho tất cả người dùng)

Ví dụ: index.html, mymodule.nocache.js

  • Những tệp này thay đổi nội dung của chúng mà không thay đổi URL, khi phiên bản mới của trang web được triển khai.

  • Chúng có thể được lưu trữ, nhưng có thể cần một chuyến đi khứ hồi để được kiểm tra lại mỗi lần.

(3) Cá nhân cho mỗi yêu cầu (riêng / người dùng cụ thể)

Ví dụ: Phản hồi JSON

  • Các tài nguyên này sẽ không bao giờ được lưu trữ không được mã hóa vào đĩa trong mọi trường hợp. (Ngoại trừ có lẽ tôi sẽ có một vài yêu cầu cụ thể có thể được lưu vào bộ nhớ cache).

Tôi có một ý tưởng chung về các tiêu đề mà tôi có thể sử dụng cho từng loại, nhưng luôn có điều gì đó mà tôi có thể bị thiếu.


76
2018-06-04 01:23


gốc


Cảm ơn câu trả lời của bạn và các ý kiến ​​và các liên kết. Tôi vẫn đang thử nghiệm một chút, nhưng tôi nghĩ, tôi sẽ có thể lấy được một giải pháp! - Chris Lercher
Đạt được # 3 nói chung là không thể. - EricLaw
Xem thêm: stackoverflow.com/questions/6491789/… - Mikko Rantalainen


Các câu trả lời:


Tôi có lẽ sẽ sử dụng các cài đặt này:

  1. Cache-Control: max-age=31556926 - Đại diện có thể được lưu vào bộ nhớ cache bằng bất kỳ bộ nhớ cache nào. Biểu diễn được lưu trong bộ nhớ cache được coi là mới trong 1 năm:

    Để đánh dấu câu trả lời là "không bao giờ hết hạn", máy chủ gốc gửi một    Hết hạn ngày khoảng một năm kể từ khi phản hồi là   gởi. Máy chủ HTTP / 1.1 KHÔNG NÊN gửi Hết hạn ngày nhiều hơn một   năm trong tương lai.

  2. Cache-Control: no-cache - Đại diện được phép lưu vào bộ nhớ cache bằng bất kỳ bộ nhớ cache nào. Nhưng cache phải gửi yêu cầu tới máy chủ gốc để xác thực trước khi phát hành bản sao được lưu trong bộ nhớ cache.
  3. Cache-Control: no-store - Bộ nhớ cache không được lưu trong bộ nhớ cache dưới bất kỳ điều kiện nào.

Xem Mark Nottingham’s Caching Tutorial để biết thêm thông tin.


84
2018-06-08 21:49



@Gumbo: Một điều tôi khá chắc chắn là, rằng tôi cần phải thiết lập công cộng, khi tôi muốn Firefox 3+ lưu các tệp công khai vào đĩa trong khi sử dụng HTTPS: stackoverflow.com/questions/174348/… - Chris Lercher
Một số trình duyệt, chẳng hạn như IE, đang bắt đầu xử lý Cache-Control: no-cache như thể nó không lưu trữ. Điều này được thừa nhận là không theo RFC, nhưng nó được cố tình thực hiện để "sửa chữa" sai lầm được thực hiện bởi MANY khi sử dụng no-cache để ngăn không cho các dữ liệu nhạy cảm được lưu trữ không được mã hóa trên đĩa. - AviD
@chris_l, tôi đã xảy ra trên liên kết này: palisade.plynt.com/issues/2008Jul/cache-control-attributes . Tôi không nhớ các phiên bản trước đó hoạt động như thế nào, mặc dù tôi nghĩ IE7 cũng đã làm điều này. - AviD
Ngoài ra, Firefox không còn yêu cầu PUBLIC trong Cache-Control để lưu trữ các tài nguyên HTTPS. Nhưng đặt cược tốt nhất của bạn nói chung là chỉ cần kiểm tra trang web của bạn trong khi xem lưu lượng truy cập, ví dụ: với Fiddler. - EricLaw
Không nên đặt giá trị kiểm soát bộ nhớ cache trong 100 năm. Trước hết, spec đề nghị tối đa 1 năm. Thứ hai, bất kỳ giá trị nào trên 68 năm dẫn đến kết quả ngay lập tức cho IE8 và dưới đây: blogs.msdn.com/b/ieinternals/archive/2010/01/26/… - EricLaw


Các trường hợp một và hai thực sự là cùng một kịch bản. Bạn nên đặt Cache-Control: public và sau đó tạo URL có chứa số phiên bản / phiên bản của trang web để bạn có các tài nguyên không thay đổi có khả năng tồn tại mãi mãi. Bạn cũng muốn đặt Expires tiêu đề một năm trở lên trong tương lai để khách hàng không cần phải kiểm tra độ tươi mới.

Đối với trường hợp 3, bạn có thể tất cả những điều sau đây cho sự linh hoạt tối đa:

"Cache-Control", "no-cache, must-revalidate"
"Expires", 0
"Pragma", "no-cache"

-2
2018-06-08 01:36



Các URL khác nhau cho các bản dựng mới có thể không phải là một tùy chọn: a) Điều này sẽ buộc khách hàng phải tải xuống lại các tệp có thể lưu vào bộ nhớ cache vĩnh viễn. Họ có được những cái tên độc đáo để tránh điều đó. b) URL chính cho trang web của tôi phải là https://www.example.com/ c) Tôi muốn dấu trang luôn tham chiếu đến phiên bản mới nhất của trang web của mình (hãy tưởng tượng, dấu trang cho câu hỏi ngăn xếp sẽ chứa số bản dựng của trang web). - Chris Lercher
Xin chào Chris, Cách tiếp cận này thường được sử dụng cho tài nguyên CSS và JS thay vì tài liệu. Tôi đồng ý rằng nó không áp dụng cho định danh tài liệu, trong trường hợp này bạn chỉ cần đặt bộ nhớ cache công khai, Last-Modified và etag trên tiêu đề sẽ kiểm tra độ tươi mỗi lần và chỉ 304 sẽ được gửi lại nếu không có thay đổi kể từ lần tải xuống cuối cùng. Ngoài ra, bạn có thể tải xuống nội dung trang động thực tế trong mỗi trang qua JS để bạn duy trì URL trong khi vẫn cho phép lưu bộ nhớ đệm hiệu quả. - Andrew L
Có, đó là khá nhiều cách, GWT xử lý điều này cho tôi: index.html của tôi (thỉnh thoảng thay đổi) bao gồm mymodule.nocache.js (thỉnh thoảng thay đổi), tự động bao gồm các tệp có thể lưu trữ vĩnh viễn chính xác (các phần lớn của js, GWT được quản lý gói hình ảnh, ...) Điều duy nhất nó để lại cho tôi, là thiết lập các tiêu đề http chính xác cho từng loại. Tôi muốn giảm các tiêu đề này xuống mức tối thiểu, vì chúng chiếm tỷ lệ lớn trong khối lượng chuyển. Vì vậy, tôi cần ví dụ cả hai lần sửa đổi lần cuối và ETag vv? - Chris Lercher
"Hết hạn" thực sự cần phải là ngày, không phải là số 0. Nó phải có cùng giá trị với tiêu đề "Ngày". Xem mnot.net/cache_docs - Luke Hutchison