Điều gì được ưu tiên: tiêu đề ETag hoặc HTTP được sửa đổi lần cuối?


82

Đố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:


90

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.


1
Câu trả lời tuyệt vời, Thomas. Cảm ơn bạn đã cung cấp thông số kỹ thuật chính thức và thảo luận về việc triển khai trình duyệt hiện tại.
dthrasher 21/12/09

1
Trích dẫn từ phần 14.26, máy chủ KHÔNG ĐƯỢC thực hiện phương thức được yêu cầu, trừ khi được yêu cầu làm như vậy vì ngày sửa đổi của tài nguyên không khớp với ngày được cung cấp trong trường tiêu đề If-Modified-Since trong yêu cầu. Có vẻ như If-Modified-Since được ưu tiên hơn.
Vicary

20

Nó giống như một biểu thức "OR" hơn. Trong mã giả:

if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
   GetFromServer
else
   GetFromCache

4
Tôi nghĩ rằng dấu thời gian được sửa đổi cuối cùng nên được so sánh khác nhau, như trong: if ETagFromServer! = ETagOnClient || LastModifiedFromServer> LastModifiedOnClient
RoyM

Đó là một câu lệnh AND vì ETag có thể yếu, trong trường hợp đó bạn có thể có một thực thể tương đương về mặt ngữ nghĩa và sau đó bạn quay lại tiêu đề được sửa đổi lần cuối. Hãy xem xét một tình huống mà một bức ảnh có thể được mã hóa lại và chúng tôi muốn nói rằng bản gốc và bản mã hóa lại giống nhau mặc dù thực tế là chúng không giống nhau về byte. Trong trường hợp này, chúng tôi muốn sử dụng lần sửa đổi cuối cùng làm dự phòng và đó là lý do tại sao chúng CẢ HAI phải nhất quán
ParoX

8

=! 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'.

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.