nếu-sửa đổi-kể từ so với nếu-không-phù hợp


88

Sự khác biệt giữa if-mod-since và if-none-match có thể là gì? Tôi có cảm giác rằng if-none-match được sử dụng cho các tệp trong khi if-mod-since được sử dụng cho các trang?

Câu trả lời:


110

Về sự khác biệt giữa Last-Modified/If-Modified-SinceETag/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ụ:

  • Nếu bạn đang cung cấp tệp, sử dụng tệp mtimelàm Last-Modifiedngày là giải pháp đơn giản nhất.
  • Nếu bạn đang cung cấp một trang web động được xây dựng từ một số truy vấn SQL, việc kiểm tra xem dữ liệu được trả về bởi bất kỳ truy vấn nào trong số đó đã thay đổi có thể không thực tế hay không (trừ khi tất cả chúng đều có một số loại cột "sửa đổi lần cuối"). Trong trường hợp này, việc sử dụng ví dụ: băm md5 của nội dung trang theo ý ETagmuốn sẽ dễ dàng hơn rất nhiều.
    OTOH, điều này có nghĩa là bạn vẫn phải tạo toàn bộ trang trên máy chủ, ngay cả đối với GET có điều kiện. Việc tìm ra chính xác những gì phải đi vào ETag (khóa chính, số sửa đổi, ... vv) có thể giúp bạn tiết kiệm rất nhiều thời gian tại đây.

Xem các liên kết này để biết thêm chi tiết về chủ đề:


Tôi đã gửi cho trình duyệt một ETag, nhưng nó không bao giờ yêu cầu cùng một trang với If-None-Match. Vấn đề có thể là gì?
Pacerier

2
@pacerier: Các trình duyệt không bắt buộc phải sử dụng Etag. Vì vậy, nó có thể là một trình duyệt cũ và đơn giản là bỏ qua nó. Khả năng khác là thực thể đang được truy cập với các tham số url thay đổi từ lệnh gọi sang lệnh gọi. Nếu tên thực thể thay đổi thì etag sẽ không được sử dụng cho các yêu cầu khác nhau.
Rafael Baptista

@RafaelBaptista Để giải thích thêm về nửa sau nhận xét của bạn, hãy nói rằng tôi gặp tình huống này: Tôi có một máy chủ tệp và máy chủ hỗ trợ lập phiên bản bằng ETags và vì lý do tương thích ngược, chúng tôi đã từng yêu cầu khách hàng sử dụng tham số truy vấn my_current_version = (phiên bản ). Nếu tôi gửi một yêu cầu HTTP với các giá trị khác nhau cho my_current_version, nhưng cũng với ETags, thì tiêu chí nào, như một phương pháp hay nhất, sẽ được ưu tiên khi xác định xem nên phân phát phiên bản mới hay gửi lại 304? Cảm ơn!
laughing_man

1
Máy chủ sử dụng Etag như thế nào là tùy thuộc vào máy chủ. Bạn có thể định cấu hình hầu hết các máy chủ tệp để bỏ qua các tham số với etag nếu bạn muốn thông qua các quy tắc viết lại. Bạn có ít quyền kiểm soát hơn đối với máy khách - trình duyệt. Hầu hết sẽ không gửi tiêu đề etag mà họ nhận được cho một bộ thông số trong một yêu cầu cho một bộ khác. Yêu cầu của khách hàng đối với hình ảnh? V = 1 sẽ không được gửi cùng một etag cho hình ảnh? V = 2. Nếu tôi đang viết các máy chủ của riêng mình, tôi sẽ triển khai etag dưới dạng hàm băm của nội dung hình ảnh. Bất kỳ url mà yêu cầu một tài nguyên, và đi kèm với một etag phù hợp với hash của hình ảnh tôi sẽ gửi cho, tôi trở lại 304.
Rafael Baptista

22

If-Modified-Sinceđược so sánh với Last-Modifiedtrong khi If-None-Matchđược so sánh với ETag. Cả hai Modified-Sincevà đều ETagcó 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-Modifiedcung 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-Matchvới ETagchỉ 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 ETagtạ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.


Thật thú vị, nhưng tại sao tôi lại sử dụng séc "giống hệt" thay vì séc "sửa đổi lần cuối"? Những lợi ích là gì? Nếu có một tệp để phân phát, thì cái nào là lựa chọn tốt hơn?
Tháp

7
Với máy tính, thời gian thật mong manh. Giây nhảy, chuyển đổi giữa thời gian tiết kiệm ánh sáng ban ngày và đồng hồ không chính xác, tất cả đều có thể khiến kiểm tra "sửa đổi lần cuối" trả về kết quả sai. So sánh chính nội dung (hoặc băm MD5 của nội dung) sẽ tránh được những vấn đề đó.
devdanke 12/12/12

Mặc dù tôi hoàn toàn hiểu @devdanke, tôi sẽ nói rằng kiểm tra dấu thời gian nhanh hơn nhiều so với kiểm tra md5sum. Mục đích của những tiêu đề này là để làm cho nó nhanh, đôi khi không nên chuyển phiên bản mới của một thực thể sang máy khách hơn là tải máy chủ bằng I / O. Dù sao, người dùng luôn có thể nhấn ctrl + shift + R (hoặc ctrl + F5 hoặc bất cứ điều gì)
Đau lòng vào

13

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 đề đó.


9

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


URL đó không còn có văn bản tương tự như vậy. Không có hạn chế đối với việc sử dụng Last-Modifiedvới ETag(hoặc, về mặt sử dụng, If-Modified-Sincevớ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-Sincevớ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ỏ.
mpag


3

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ó.


0

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.

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.