Tôi vừa tìm thấy câu hỏi này và sau khi bối rối về hành vi của If_Modified_Since
của Chrome, tôi đã tìm thấy câu trả lời.
Quyết định bộ nhớ cache của Chrome dựa trên tiêu đề Expires
mà nó nhận được.Tiêu đề Expires
có hai yêu cầu chính:
- Nó phải được ở Greenwich Mean Time (GMT), và
- Nó phải được định dạng theo RFC 1123 (mà về cơ bản là RFC 822 với bốn chữ số năm).
Cấu trúc của nó như sau:
Expires: Sat, 07 Sep 2013 05:21:03 GMT
Ví dụ, trong PHP, sau kết quả đầu ra một tiêu đề được định dạng đúng.
$duration = time() + 3600 // Expires in one hour.
header("Expires: " . gmdate("D, d M Y H:i:s", $duration) . " GMT");
("GMT" được nối vào chuỗi thay vì "e" múi giờ cờ bởi vì, khi được sử dụng với gmdate()
, cờ sẽ ra "UTC", mà RFC 1123 coi không hợp lệ. Cũng lưu ý rằng PHP constantsDateTime::RFC1123
và DATE_RFC1123
sẽ không cung cấp các định dạng thích hợp, kể từ khi họ ra sự khác biệt lấy múi giờ GMT trong giờ [tức là 02: 00]. chứ không phải là "GMT")
Xem W3C's date/time format specifications để biết thêm.
Tóm lại, Chrome sẽ chỉ nhận ra tiêu đề nếu nó tuân theo định dạng chính xác này. này, kết hợp với các tiêu đề Cache-Control
...
header("Cache-Control: private, must-revalidate, max-age=" . $duration);
... cho phép tôi thực hiện kiểm soát bộ nhớ cache thích hợp. Sau khi Chrome nhận ra các tiêu đề đó, nó bắt đầu lưu vào bộ nhớ cache các trang tôi đã gửi (ngay cả với chuỗi truy vấn!) Và nó cũng bắt đầu gửi tiêu đề If_Modified_Since
. Tôi đã so sánh nó với một ngày "được sửa đổi lần cuối" được lưu trữ, được gửi lại HTTP/1.1 304 Not Modified
và mọi thứ hoạt động hoàn hảo.
Hy vọng điều này sẽ giúp bất kỳ ai khác tình cờ gặp gỡ!
Vào cuối ngày, nó tùy thuộc vào trình duyệt, và bất kỳ lưu trữ trung gian, cho dù họ * sẽ * Nội dung thực sự nhớ cache (bạn có thể kiểm soát xem họ * nên *). Bạn sẽ không thể 100% ngăn tác nhân người dùng yêu cầu lại nội dung. –
Tôi nhận thấy rằng Chrome không gửi tiêu đề If-Modified-Since trừ khi phản hồi là gzip'd. Tôi không chắc đó có phải là một mô hình thực sự hay chỉ là trải nghiệm của tôi khi cố xử lý việc cập nhật các tệp JS. – Ryan
Bất kỳ lý do cụ thể nào để gửi Keep-Alive? –