Câu trả lời:
Về sự khác biệt giữa Last-Modified/If-Modified-Since
và ETag/If-None-Match
:
Cả hai đều có thể được sử dụng thay thế cho nhau. Tuy nhiên, tùy thuộc vào loại tài nguyên và cách nó được tạo trên máy chủ, câu hỏi này hay câu hỏi khác ("cái này đã được sửa đổi từ ...?" / "Cái này có còn khớp với ETag này không?") Có thể dễ trả lời hơn .
Ví dụ:
mtime
làm Last-Modified
ngày là giải pháp đơn giản nhất.ETag
muốn sẽ dễ dàng hơn rất nhiều. Xem các liên kết này để biết thêm chi tiết về chủ đề:
If-Modified-Since
được so sánh với Last-Modified
trong khi If-None-Match
được so sánh với ETag
. Cả hai Modified-Since
và đều ETag
có thể được sử dụng để xác định một biến thể cụ thể của tài nguyên.
Nhưng so sánh If-Modified-Since
để Last-Modified
cung cấp cho bạn thông tin liệu biến thể được lưu trong bộ nhớ cache là cũ hơn hay mới hơn trong khi so sánh If-None-Match
với ETag
chỉ cung cấp cho bạn thông tin liệu cả hai có giống hệt nhau hay không. Hơn nữa, hầu hết các trình ETag
tạo đều bao gồm thông tin của inode cụ thể của hệ thống, vì vậy việc di chuyển tệp sang một ổ đĩa khác cũng có thể thay đổi ETag
.
Giá trị dấu thời gian được sử dụng trong Last-Modified / If-Modified-Since có độ chính xác hạn chế - một giây và điều đó chỉ đơn giản là không đủ để thay đổi nội dung nhanh chóng, chẳng hạn như ứng dụng trò chuyện trên web, nơi có thể đăng nhiều hơn một tin nhắn vào bất kỳ giây nào . ETag / If-None-Match có thể giúp giải quyết vấn đề đó.
Như nó được nêu trong các phương pháp hay nhất của google:
Điều quan trọng là phải chỉ định một trong số Expires hoặc Cache-Control max-age và một trong Last-Modified hoặc ETag, cho tất cả các tài nguyên có thể lưu vào bộ nhớ cache. Không cần thiết khi chỉ định cả Expires và Cache-Control: max-age hoặc chỉ định cả Last-Modified và ETag.
https://developers.google.com/speed/docs/best-practices/caching
Last-Modified
với ETag
(hoặc, về mặt sử dụng, If-Modified-Since
với If-None-Match
) được đề cập. Tương tự, thông số kỹ thuật W3 không hạn chế bạn. Nó nói rằng không sử dụng If-Modified-Since
với If-Match
, nhưng tôi cho rằng đó là bởi vì bộ tài liệu có cập nhật ngày tháng nhưng cùng nội dung như được xác định bởi ETag nên khá nhỏ.
If-Modified-Since sử dụng ngày tháng, trong khi If-None-Match sử dụng ETag . Cả hai đều có thể được sử dụng cho "trang" (tức là HTML) và các tệp khác.
Trừ khi được máy chủ tuyên bố là yếu, ETag được coi là trình xác thực mạnh và do đó có thể được sử dụng để thỏa mãn yêu cầu phạm vi có điều kiện. Tuy nhiên, hầu hết các ETags được tạo tự động đều gặp khó khăn trong các tình huống máy chủ, vì chúng thường sử dụng thông tin inode và / hoặc một bộ đếm liên tục duy nhất. Trong thực tế, tôi nhận thấy tiêu đề Last Modified đủ cho nội dung khá tĩnh, ví dụ: cung cấp nội dung tĩnh được bảo vệ, vì thời gian ghi của tệp tạo ra trình xác thực hợp lý.
ETag cho đến nay là linh hoạt nhất. Khách hàng phù hợp được yêu cầu gửi ETag theo yêu cầu có điều kiện, trong khi họ NÊN gửi cả hai nếu có.
Tiêu đề If-Modified-Since được sử dụng để chỉ định thời gian trình duyệt nhận được tài nguyên được yêu cầu lần cuối. Tiêu đề If-None-Match được sử dụng để chỉ định thẻ thực thể mà máy chủ đã phát hành cùng với tài nguyên được yêu cầu khi nó được nhận lần cuối.
Theo hai cách được mô tả, các tiêu đề này được sử dụng để hỗ trợ bộ nhớ đệm của nội dung trong trình duyệt và chúng cho phép máy chủ hướng dẫn trình duyệt sử dụng bản sao được lưu trong bộ nhớ cache của tài nguyên, thay vì phản hồi với toàn bộ nội dung của tài nguyên nếu đây là không cần thiết.