Tiêu đề điều khiển bộ nhớ cache HTTP lý tưởng cho các loại tài nguyên khác nhau


82

Tôi muốn tìm một tập hợp tiêu đề tối thiểu, hoạt động với bộ nhớ đệm và trình duyệt "tất cả" (cả 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) Có thể lưu vào bộ nhớ cache vĩnh viễn (công khai / bình đẳng cho tất cả người dùng)

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

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

  • Chúng nên được lưu vào bộ nhớ đệm nhiều nhất có thể, ngay cả khi sử dụng HTTPS (vì vậy tôi cho rằng, tôi nên đặt Cache-Control: public, đặc biệt là cho Firefox?)

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

(2) Thỉnh thoảng thay đổi (công khai / bình đẳng cho tất cả người dùng)

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

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

  • Chúng có thể được lưu vào bộ nhớ cache, nhưng có lẽ cần một chuyến đi khứ hồi để được xác thực lại mỗi lần.

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

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

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

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


Cảm ơn câu trả lời của bạn và các bình luậ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ể tìm ra giải pháp!
Chris Lercher

2
Không thể đạt được # 3.
EricLaw

Câu trả lời:


90

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

  1. Cache-Control: max-age=31556926- Các bản trình bày có thể được lưu trong bộ nhớ đệm bất kỳ. Bản trình bày được lưu trong bộ nhớ cache sẽ được coi là mới trong 1 năm:

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

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

Xem Hướng dẫn về bộ nhớ đệm của Mark Nottingham để biết thêm thông tin.


1
@Gumbo: Một điều tôi khá chắc chắn là tôi cần đặt chế độ công khai , 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

2
Một số trình duyệt, chẳng hạn như IE, đang bắt đầu coi Cache-Control: no-cache như thể nó không phải là nơi lưu trữ. Điều này được thừa nhận là không theo RFC, nhưng nó cố ý được thực hiện để "sửa chữa" sai lầm do NHIỀU người sử dụng no-cache để ngăn dữ liệu nhạy cảm được lưu trữ mà không được mã hóa trên đĩa.
AviD

1
@chris_l, tôi đã xem qua 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

2
Ngoài ra, Firefox không còn yêu cầu PUBLIC trong Cache-Control để lưu vào bộ nhớ cache các tài nguyên HTTPS. Nhưng đặt cược tốt nhất của bạn về tổng thể là chỉ kiểm tra trang web của bạn trong khi xem lưu lượng truy cập, ví dụ như với Fiddler.
EricLaw

3
Không nên đặt giá trị kiểm soát bộ nhớ cache là 100 năm. Trước hết, thông số kỹ thuật khuyến nghị tối đa là 1 năm. Thứ hai, bất kỳ giá trị trên 68 năm kết quả trong thời hạn ngay lập tức cho IE8 và dưới đây: blogs.msdn.com/b/ieinternals/archive/2010/01/26/...
EricLaw

-2

Trường hợp một và hai thực tế là cùng một kịch bản. Bạn nên đặt Cache-Control: publicvà sau đó tạo một URL bao gồm số bản dựng / phiên bản của trang web để bạn có các tài nguyên bất biến có thể tồn tại mãi mãi. Bạn cũng muốn đặt Expirestiêu đề một năm hoặc hơn trong tương lai để khách hàng không cần kiểm tra độ mới.

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

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

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 tải xuống lại các tệp có thể lưu trong bộ nhớ cache vĩnh viễn. Họ lấy những cái tên độc đáo để tránh điều đó. b) URL chính của trang web của tôi chỉ nên là https://www.example.com/c) Tôi muốn các dấu trang luôn tham chiếu đến phiên bản mới nhất của trang web của tôi (hãy tưởng tượng, các dấu trang cho một câu hỏi về stackoverflow 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 các tài nguyên CSS và JS hơn là tài liệu. Tôi đồng ý rằng nó không áp dụng cho số nhận dạng tài liệu, trong trường hợp đó, bạn chỉ nên đặt kiểm soát bộ nhớ cache ở chế độ công khai, Sửa đổi lần cuối và etag trên tiêu đề. Điều này sẽ kiểm tra độ mớ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 thông qua JS để bạn giữ nguyên URL trong khi vẫn cho phép bộ nhớ đệm hiệu quả.
Andrew L

Vâng, đó là cách khá nhiều, 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 vào bộ nhớ cache vĩnh viễn chính xá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à đặt 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 một tỷ lệ lớn trong khối lượng chuyển. Vậy tôi có cần cả Last-Modified ETag, v.v. không?
Chris Lercher

"Expires" thực sự cần phải là một 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.