Tại sao phản hồi này được lưu trữ?


32

Tôi có một khách hàng có index.html của trang hiện đang quay lại với các tiêu đề này:

Phạm vi chấp nhận: byte
Kết nối: Keep-Alive
Mã hóa nội dung: gzip
Độ dài nội dung: 3658
Loại nội dung: văn bản / html
Ngày: Thu, ngày 10 tháng 10 năm 2013 07:36:27 GMT
ETag: "4aa95e1-2ed2-4e721324728b7"
Keep-Alive: thời gian chờ = 5, tối đa = 100
Sửa đổi lần cuối: Thứ ba, ngày 24 tháng 9 năm 2013 13:34:30 GMT
Máy chủ: Apache / 2.2.22
Thay đổi: Chấp nhận mã hóa, Tác nhân người dùng

Rõ ràng là tôi sẽ khuyên họ nên thêm Expireshoặc Cache-Controlkhi thích hợp, nhưng tôi bối rối: Chrome lưu trữ tài nguyên này và sử dụng nó từ bộ đệm (không gửi yêu cầu nào cả ), thậm chí sau vài giờ (ví dụ: nó đã sử dụng lại một bản sao nó được lưu vào ngày hôm qua lúc 1:30 sáng nay lúc 8:30 sáng). Tôi có thể thấy điều này khá rõ ràng trong tab Mạng của bảng điều khiển Chrome, nơi nó hiển thị yêu cầu và có 200 (OK)màu xám trong cột Trạng thái(from cache)trong cột Kích thước . (Tôi chưa thay đổi mặc định bộ nhớ đệm của Chrome.)

Tôi nhận ra rằng thông số kỹ thuật cho phép các tác nhân người dùng tự đưa ra quyết định trong sự vắng mặt chỉ đạo từ các tiêu đề. Có phải đó là những gì đang xảy ra ở đây? Chrome thấy nó đã được sửa đổi lần cuối cách đây vài ngày và cảm thấy thoải mái khi sử dụng phiên bản (nói) cho đến ngày hết hạn? Hay là tôi đang thiếu thứ gì đó?

Câu trả lời:


33

Khi các tiêu đề "Hết hạn" và "Kiểm soát bộ đệm " không được chỉ định, nhưng tiêu đề "Sửa đổi lần cuối" được chỉ định, các trình duyệt phải đoán xem họ sẽ giữ tài liệu trong bộ nhớ cache trong bao lâu. Một số trình duyệt làm thuật toán sử dụng cho phép trang vẫn còn trong bộ nhớ cache cho một ngày hoặc nhiều hơn.

Google lưu trữ hướng dẫn thực hành tốt nhất lưu trữ trạng thái:

Last-Modified là một tiêu đề bộ đệm ẩn "yếu" trong đó trình duyệt áp dụng phương pháp phỏng đoán để xác định xem có tìm nạp mục từ bộ đệm hay không. (Các heuristic là khác nhau giữa các trình duyệt khác nhau.)


Mozilla (Firefox) có Câu hỏi thường gặp về bộ nhớ đệm HTTP phác thảo thuật toán của họ cho tình huống này (mặc dù có thể thuật toán đã thay đổi kể từ khi tài liệu có ngày 2002):

... Chúng tôi tìm kiếm một tiêu đề "Sửa đổi lần cuối". Nếu tiêu đề này xuất hiện, thì tuổi thọ của bộ đệm sẽ bằng với giá trị của tiêu đề "Ngày" trừ đi giá trị của tiêu đề "Sửa đổi lần cuối" chia cho 10.

Vì vậy, trong trường hợp của bạn, sự khác biệt giữa sửa đổi và bây giờ là 15 ngày, thì Firefox sẽ lưu trữ tài nguyên trong 1,5 ngày.

Dường như tất cả các trình duyệt chính sử dụng cùng một quy tắc 10% mà Firefox thực hiện. Một câu hỏi đã được hỏi trên StackOveflow yêu cầu các heuristic này . Các câu trả lời khác nhau cho các trình duyệt khác nhau cho thấy rằng tất cả chúng đều có cách triển khai tương tự nhau. Có câu trả lời cho Internet Explorer và Webkit (Chrome và Safari).


Kích thước bộ đệm của trình duyệt có thể sẽ là yếu tố giới hạn cho một tệp mà thuật toán bộ đệm xác định có thể được giữ trong hơn một ngày. Các trình duyệt thường có cài đặt cho dung lượng ổ đĩa mà chúng sử dụng cho bộ đệm. Nhiều người dùng cũng xóa bộ nhớ cache khi họ đóng trình duyệt. Vì vậy, lượng thời gian mà một tệp như vậy được lưu trữ thường phụ thuộc vào:

  • Dung lượng bộ nhớ cache mà trình duyệt đã phân bổ
  • Số lượng trang web mà người dùng truy cập (và kích thước của các trang web đó)
  • Người dùng có đóng trình duyệt của họ hay không

Bạn có thể vui lòng làm rõ "sau đó Firefox sẽ lưu trữ tài nguyên trong 1,5 ngày." Từ ngày nào, nó sẽ lưu cache đến 1,5 ngày? Nếu đã 15 ngày rồi thì nó đã hết hạn rồi phải không? Và vì BÂY GIỜ trừ đi lần sửa đổi cuối cùng sẽ tăng mãi mãi, ý bạn là, nó sẽ được lưu trữ mãi mãi!
myDoggyWritesCode

1
Không phải mãi mãi. Trong 1/10 thời gian giữa tiêu đề được sửa đổi cuối cùng và thời gian tải xuống. Nếu nó đã được 15 ngày đối với bạn, điều đó có nghĩa là đã 150 ngày kể từ khi tệp được sửa đổi lần cuối.
Stephen Ostermiller
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.