Giá trị tối đa cho tiêu đề điều khiển bộ nhớ cache trong HTTP


80

Tôi đang sử dụng Amazon S3 để cung cấp nội dung tĩnh cho trang web của mình. Tôi muốn trình duyệt lưu trữ các nội dung này càng lâu càng tốt. Tôi nên bao gồm tiêu đề siêu dữ liệu nào với nội dung của mình

Cache-Control: max-age=???

giá trị max-age có thể phụ thuộc vào trình duyệt / phiên bản và bất kỳ proxy trong đường ... AFAIK không có tiêu chuẩn thực / spec vì vậy bất kỳ giá trị sẽ là một đoán ...
Yahia

Câu trả lời:


120

Nói chung, một năm được khuyên là giá trị tối đa tiêu chuẩn. Xem RFC 2616 :

Để đá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.

Mặc dù điều đó áp dụng cho expirestiêu chuẩn cũ hơn , nhưng vẫn có ý nghĩa khi áp dụng cache-controltrong trường hợp không có bất kỳ hướng dẫn tiêu chuẩn rõ ràng nào. Miễn là bạn thường cần dù sao và việc chọn bất kỳ giá trị nào dài hơn tùy ý có thể phá vỡ một số tác nhân người dùng. Vì thế:

Cache-Control: max-age=31536000

22

Cân nhắc không lưu trữ "càng lâu càng tốt", thay vào đó giải quyết càng lâu càng tốt. Ví dụ, không chắc bạn sẽ cần phải lưu trữ nó lâu hơn 10 năm ... tôi nói đúng không?

RFC thảo luận về độ tuổi tối đa tại đây: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

Eric Lawrence nói rằng trước IE9, Internet Explorer sẽ coi như cũ bất kỳ tài nguyên nào có giá trị Cache-Control: max-age trên 2147483648 (2 ^ 31) giây, khoảng 68 năm ( http://blogs.msdn.com/b /ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx ).

Các tác nhân người dùng khác tất nhiên sẽ khác nhau, vì vậy ... hãy thử và chọn một số không chắc (hơn là có khả năng!) Gây tràn. Tuổi tối đa lớn hơn 31536000 (một năm) không có ý nghĩa gì và về mặt thông thường, đây được coi là giá trị tối đa hợp lý.


Tôi thực sự đang tìm các tiêu đề cụ thể để gửi. Tôi có một cơ chế được tích hợp trong trang web của mình để thay đổi url của tệp để trỏ đến một tên tệp khác nếu tôi cần thực hiện thay đổi và để khách truy cập thấy nó. Tôi chỉ cần một ví dụ về các tiêu đề cụ thể cần gửi để khiến trình duyệt lưu vào bộ nhớ cache các nội dung này vô thời hạn.
Casey Flynn

12
Cache-Control: max-age = 31536000 sẽ lưu vào bộ nhớ cache trong 1 năm, đây là mức khuyến nghị tối đa.
EricLaw

2
@Geoffrey: Tôi nghĩ bạn đang bối rối về những gì Casey đang xây dựng. Anh ấy chỉ đơn giản nói rằng anh ấy sẽ thay đổi URL mà anh ấy tham chiếu trong đánh dấu của mình khi phiên bản thay đổi. Đây là một phương pháp hay nhất được hầu hết các trang web hàng đầu sử dụng.
EricLaw

@Geoffrey Bạn có chắc là "trên 2147483648" không? Tôi nghĩ nó đã "hơn 2147483647"?
Pacerier

4

Những người tạo đề xuất bộ nhớ đệm tối đa 1 năm đã không suy nghĩ thấu đáo.

Trước hết, nếu khách truy cập đang được cung cấp một tệp được lưu trong bộ nhớ cache đã lỗi thời, thì tại sao họ sẽ cung cấp bất kỳ lợi ích nào khi bất ngờ tải phiên bản mới sau 1 năm? Nếu một tệp có TTL 1 năm, từ góc độ chức năng, điều đó rõ ràng có nghĩa là tệp đó không có ý định thay đổi gì cả.

Vậy tại sao người ta cần hơn 1 năm?

1) Tại sao không? Nó không phục vụ bất kỳ mục đích nào để nói với trình duyệt của khách truy cập "này, tệp này đã được 1 năm tuổi, có thể là một ý tưởng để kiểm tra xem nó đã được cập nhật chưa".

2) Dịch vụ CDN. Hầu hết các mạng phân phối nội dung sử dụng tiêu đề bộ nhớ cache để quyết định thời gian phân phát tệp một cách hiệu quả từ máy chủ biên. Nếu bạn có quyền kiểm soát bộ nhớ cache trong 1 năm cho các tệp, tại một thời điểm nào đó, nó sẽ bắt đầu yêu cầu lại các tệp không thay đổi từ máy chủ gốc và bộ đệm cạnh sẽ cần được điền lại hoàn toàn, gây ra tải chậm hơn cho máy khách và không cần thiết các cuộc gọi đến nguồn gốc.

Có ích lợi gì khi có tối đa 1 năm? Những trình duyệt nào sẽ bị nghẹn khi đặt số tiền cao hơn 31536000?


3
1 năm là vĩnh cửu trong thời đại internet. Thêm vào đó, nếu bạn coi trọng bộ nhớ đệm, bạn sẽ xử lý (ngoài kiểm soát bộ đệm) cơ chế etag và / hoặc sửa đổi lần cuối. Vì vậy, ngay cả những người tái yêu cầu một năm sau đó sẽ không gây tổn hại cho băng thông (304 không thay đổi)
redben

2
1 năm không phải là vĩnh viễn khi hình ảnh của bạn KHÔNG BAO GIỜ bị thay đổi (giống như hầu hết các hình ảnh trên internet) và khi bạn không muốn CDN làm mới tệp từ nguồn gốc (sẽ là vô nghĩa). Đối với lần sửa đổi cuối cùng / etag, tất nhiên, nó khởi tạo một yêu cầu và hộp thoại giữa máy khách và máy chủ, chỉ để tìm hiểu những gì chúng ta đã biết "vâng, vẫn có thể phân phát tệp được lưu trong bộ nhớ cache". Lập luận của bạn về cơ bản là "1 năm là vĩnh cửu trên internet", không phục vụ bất cứ điều gì hiệu quả. Tôi đã đặt thời hạn 10 năm đối với hình ảnh, điều này chỉ đơn giản là mang lại kết quả cuối cùng tốt hơn.
suncat100

3
Ồ và cũng có kích thước bộ nhớ cache của trình duyệt mặc định. Có bất kỳ nội dung được lưu trong bộ nhớ cache nào tồn tại một năm trong bộ nhớ cache của trình duyệt không? Tôi không biết.
redben

Cực kì không chắc chắn. Một cái gì đó mà tiếp tục chứng minh sự pointlessness thiết "1 năm" khi nó phục vụ mục đích nào khác hơn là cố gắng để bộ nhớ cache một mục "mãi mãi" hay "càng lâu càng tốt" ...
suncat100

Nó không phải về trình duyệt lưu vào bộ nhớ đệm. Đó là về proxy trung gian bộ nhớ đệm nó như Akamai và Varnish và proxy của Google di động vv
Elijah Lynn
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.