Đối với hai yêu cầu tiếp theo, hai tiêu đề nào sau đây được trình duyệt đánh giá cao hơn nếu một trong số chúng thay đổi: ETag hoặc Last-Modified?
Đối với hai yêu cầu tiếp theo, hai tiêu đề nào sau đây được trình duyệt đánh giá cao hơn nếu một trong số chúng thay đổi: ETag hoặc Last-Modified?
Câu trả lời:
Theo RFC 2616 phần 13.3.4, một ứng dụng HTTP 1.1 PHẢI sử dụng ETag trong bất kỳ yêu cầu có điều kiện bộ nhớ cache nào và nếu có cả ETag và Last Modified, nó NÊN sử dụng cả hai. Tiêu đề ETag được coi là trình xác thực mạnh (xem phần 13.3.3), trừ khi được máy chủ tuyên bố rõ ràng là yếu, trong khi tiêu đề Sửa lần cuối được coi là yếu trừ khi tồn tại ít nhất một phút khác biệt giữa tiêu đề đó và tiêu đề Ngày. Tuy nhiên, lưu ý rằng Máy chủ không bắt buộc phải gửi (nhưng NÊN, nếu có thể).
Lưu ý rằng Khách hàng không kiểm tra các tiêu đề để xem chúng có thay đổi hay không; nó chỉ sử dụng chúng một cách mù quáng trong yêu cầu có điều kiện tiếp theo; Máy chủ sẽ quyết định gửi nội dung được yêu cầu hay phản hồi 304 Không được sửa đổi. Nếu Máy chủ chỉ gửi một, thì Máy khách sẽ sử dụng một mình cái đó (mặc dù, chỉ những trình xác thực mạnh mới hữu ích cho một yêu cầu Phạm vi). Tất nhiên, nó cũng tùy thuộc vào quyết định của các bộ đệm trung gian (trừ khi chúng đã được ngăn chặn bộ đệm thông qua các lệnh Cache Control) và Máy chủ về cách chúng sẽ hoạt động trên các tiêu đề; RFC tuyên bố rằng họ KHÔNG PHẢI trả về 304 Không được sửa đổi nếu trình xác nhận không rõ ràng, nhưng vì các giá trị tiêu đề được tạo bởi máy chủ, nó có khá nhiều thời gian.
Trong thực tế, tôi nhận thấy rằng Chrome, FireFox và IE 7+ đều gửi cả hai tiêu đề, nếu có. Tôi cũng đã kiểm tra hành vi khi gửi các tiêu đề đã sửa đổi, mà tôi đã nghi ngờ từ thông tin trong RFC. Bốn ứng dụng khách mà tôi đã thử nghiệm chỉ gửi yêu cầu có điều kiện nếu (các) trang được làm mới hoặc nếu đó là lần đầu tiên trang được yêu cầu bởi quy trình hiện tại.
Nó giống như một biểu thức "OR" hơn. Trong mã giả:
if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
GetFromServer
else
GetFromCache
=! là toán tử so sánh chính xác. Máy khách được yêu cầu giữ chuỗi ký tự nhận được từ máy chủ, vì các chuyển đổi có thể tạo ra sự khác biệt nhỏ. Bạn không thể cho rằng 'mới hơn là tốt hơn'.
Tại sao? Hãy xem xét trường hợp nhà điều hành máy chủ hoàn nguyên phiên bản xấu của tài nguyên. Phiên bản hoàn nguyên là CŨ hơn - nhưng chính xác.
Máy khách phải sử dụng phiên bản hiện được cung cấp bởi máy chủ; nó chỉ có thể sử dụng phiên bản đã lưu trong bộ nhớ cache nếu nó giống nhau. Vì vậy, máy chủ phải kiểm tra bình đẳng, không phải 'mới hơn'.