Để trả lời câu hỏi của bạn về lý do tại sao bộ nhớ đệm hoạt động, mặc dù máy chủ web không bao gồm các tiêu đề:
- Hết hạn
[a date]
- Kiểm soát bộ nhớ cache: max-age =
[seconds]
Máy chủ vui lòng yêu cầu bất kỳ proxy trung gian nào không lưu trữ nội dung (tức là mục chỉ nên được lưu trong bộ đệm riêng , tức là chỉ trên máy cục bộ của riêng bạn):
- Kiểm soát bộ nhớ cache: riêng tư
Nhưng máy chủ đã quên bao gồm bất kỳ gợi ý bộ đệm nào:
- họ quên bao gồm Hết hạn , vì vậy trình duyệt biết sử dụng bản sao được lưu trong bộ nhớ cache cho đến ngày đó
- họ đã quên bao gồm Max-Age , vì vậy trình duyệt biết mục được lưu trong bộ nhớ cache trong bao lâu
- họ quên bao gồm E-Tag , vì vậy trình duyệt có thể thực hiện một yêu cầu có điều kiện
Nhưng họ đã bao gồm một ngày sửa đổi lần cuối trong phản hồi:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
Bởi vì trình duyệt biết ngày tệp được sửa đổi, nó có thể thực hiện một yêu cầu có điều kiện . Nó sẽ yêu cầu máy chủ cho tệp, nhưng hướng dẫn máy chủ chỉ gửi tệp nếu nó đã được sửa đổi kể từ 2012/10/16 3:13:38:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
Máy chủ nhận được yêu cầu, nhận ra rằng máy khách đã có phiên bản mới nhất. Thay vì gửi ứng dụng khách 200 OK
, theo sau là nội dung của trang, thay vào đó, nó cho bạn biết rằng phiên bản được lưu trong bộ nhớ cache của bạn là tốt:
304 Not Modified
Trình duyệt của bạn đã phải chịu sự chậm trễ của việc gửi yêu cầu đến máy chủ và chờ phản hồi, nhưng nó đã tiết kiệm được việc phải tải lại nội dung tĩnh.
Tại sao tuổi tối đa ? Tại sao hết hạn ?
Bởi vì Last-Modified hút.
Không phải tất cả mọi thứ trên máy chủ đều có ngày liên quan đến nó. Nếu tôi đang xây dựng một trang một cách nhanh chóng, không có ngày nào liên quan đến nó - bây giờ là . Nhưng tôi hoàn toàn sẵn sàng để người dùng lưu trữ trang chủ trong 15 giây:
200 OK
Cache-Control: max-age=15
Nếu người dùng búa F5, họ sẽ tiếp tục nhận phiên bản được lưu trong bộ nhớ cache trong 15 giây. Nếu đó là proxy công ty, thì tất cả 67198 người dùng truy cập cùng một trang trong cùng một cửa sổ 15 giây sẽ nhận được cùng một nội dung - tất cả được phục vụ từ bộ đệm gần. Hiệu suất chiến thắng cho tất cả mọi người.
Ưu điểm của việc thêm vào Cache-Control: max-age
là trình duyệt thậm chí không phải thực hiện một yêu cầu có điều kiện .
- nếu bạn chỉ định
Last-Modified
, trình duyệt phải thực hiện yêu cầu If-Modified-Since
và xem 304 Not Modified
phản hồi
- nếu bạn đã chỉ định
max-age
, trình duyệt thậm chí sẽ không phải chịu sự cố trên mạng; nội dung sẽ ra khỏi bộ nhớ cache
Sự khác biệt giữa "Kiểm soát bộ đệm: tuổi tối đa" và "Hết hạn"
Expires
là một di sản tương đương với tiêu đề hiện đại (c. 1998) Cache-Control: max-age
:
Expires
: bạn chỉ định một ngày (yuck)
max-age
: bạn chỉ định giây (lòng tốt)
Và nếu cả hai được chỉ định, thì trình duyệt sẽ sử dụng max-age
:
200 OK
Cache-Control: max-age=60
Expires: 20180403T192837
Bất kỳ trang web nào được viết sau năm 1998 không nên sử dụng Expires
nữa mà thay vào đó hãy sử dụng max-age
.
ETag là gì?
ETag tương tự như Sửa đổi lần cuối , ngoại trừ việc nó không phải là một ngày - nó chỉ phải là một cái gì đó .
Nếu tôi lấy danh sách các sản phẩm ra khỏi cơ sở dữ liệu, máy chủ có thể gửi lần cuối rowversion
dưới dạng ETag, thay vì ngày:
200 OK
ETag: "247986"
ETag của tôi có thể là hàm băm SHA1 của tài nguyên tĩnh (ví dụ: hình ảnh, js, css, phông chữ) hoặc của trang được kết xuất được lưu trong bộ nhớ cache (nghĩa là đây là wiki MDN của Mozilla làm; họ băm đánh dấu cuối cùng):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Và chính xác như trong trường hợp yêu cầu có điều kiện dựa trên Sửa đổi lần cuối :
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
Tôi có thể thực hiện một yêu cầu có điều kiện dựa trên ETag:
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
An ETag
vượt trội hơn Last-Modified
bởi vì nó hoạt động cho những thứ bên cạnh các tập tin , hoặc những thứ có khái niệm về ngày . Nó chỉ là