Sự khác biệt giữa không có bộ đệm và phải xác nhận lại


179

Từ RFC 2616

http://www.w3.org/Prot Protocol / rfc2616 / rfc2616-sec14.html # sec14.9.1

không có bộ nhớ cache

Nếu chỉ thị không có bộ đệm không chỉ định tên trường, thì bộ đệm KHÔNG PHẢI sử dụng phản hồi để đáp ứng yêu cầu tiếp theo mà không cần xác nhận lại thành công với máy chủ gốc. Điều này cho phép một máy chủ gốc ngăn chặn bộ nhớ đệm ngay cả bởi các bộ đệm đã được cấu hình để trả về các phản hồi cũ cho các yêu cầu của máy khách.

Vì vậy, nó chỉ đạo các đại lý để xác nhận lại tất cả các phản ứng.

So sánh với

phải xác nhận lại

Khi chỉ thị phải xác nhận lại xuất hiện trong phản hồi nhận được bởi bộ đệm, bộ đệm đó KHÔNG ĐƯỢC sử dụng mục nhập sau khi nó trở nên cũ để đáp ứng yêu cầu tiếp theo mà không xác nhận lại trước với máy chủ gốc

Vì vậy, nó chỉ đạo các đại lý để xác nhận lại các phản ứng .

Đặc biệt liên quan đến no-cache, đây có phải là cách các tác nhân người dùng thực sự, thực nghiệm đối xử với chỉ thị này?

Quan điểm của no-cachenếu có must-revalidatevà là max-agegì?

Xem bình luận này:

http://palauge.plynt.com/issues/2008Jul/cache-control-attribut/

không có bộ nhớ cache

Mặc dù lệnh này nghe có vẻ như đang hướng dẫn trình duyệt không lưu bộ đệm vào trang, nhưng có một sự khác biệt tinh tế. Theo chỉ thị RFC, bộ nhớ cache không có bộ nhớ cache, cho trình duyệt biết rằng nó sẽ xác nhận lại với máy chủ trước khi phục vụ trang từ bộ đệm. Xác nhận lại là một kỹ thuật gọn gàng cho phép ứng dụng bảo tồn độ rộng băng tần. Nếu trang trình duyệt đã lưu trong bộ nhớ cache không thay đổi, máy chủ sẽ báo hiệu cho trình duyệt và trang được hiển thị từ bộ đệm. Do đó, trình duyệt (về lý thuyết, ít nhất), lưu trữ trang trong bộ đệm của nó, nhưng chỉ hiển thị nó sau khi xác nhận lại với máy chủ. Trong thực tế, IE và Firefox đã bắt đầu xử lý chỉ thị không có bộ đệm như thể nó chỉ thị cho trình duyệt không lưu bộ đệm vào trang. Chúng tôi bắt đầu quan sát hành vi này khoảng một năm trước.

Có ai có bất cứ điều gì chính thức hơn về điều này?

Cập nhật

Lệnh phải xác nhận lại phải được sử dụng bởi các máy chủ nếu và chỉ khi không xác thực yêu cầu trên đại diện có thể dẫn đến hoạt động không chính xác, chẳng hạn như một giao dịch tài chính âm thầm không được thực hiện.

Đó là điều mà tôi chưa bao giờ nghĩ đến cho đến bây giờ. RFC đang nói không sử dụng phải xác nhận lại một cách nhẹ nhàng. Vấn đề là, với các dịch vụ web, bạn phải có cái nhìn tiêu cực và cho rằng điều tồi tệ nhất đối với các ứng dụng khách chưa biết của bạn. Bất kỳ tài nguyên cũ có khả năng gây ra vấn đề.

Và một cái gì đó khác mà tôi vừa xem xét, không có Sửa đổi lần cuối hoặc ETags, trình duyệt chỉ có thể lấy lại toàn bộ tài nguyên. Tuy nhiên, với ETags, tôi đã quan sát thấy rằng Chrome ít nhất dường như xác nhận lại theo mọi yêu cầu. Điều này làm cho cả hai chỉ thị này không được đặt tên hoặc ít nhất là được đặt tên kém vì chúng không thể xác nhận lại một cách chính xác trừ khi yêu cầu cũng bao gồm các tiêu đề khác sau đó gây ra 'luôn luôn xác nhận lại'.

Tôi chỉ muốn làm cho điểm cuối cùng rõ ràng hơn. Bằng cách chỉ cài đặt must-revalidatenhưng không bao gồm ETag hoặc Sửa đổi lần cuối, đại lý chỉ có thể lấy lại nội dung vì nó không có gì để gửi đến máy chủ để so sánh.

Tuy nhiên, thử nghiệm theo kinh nghiệm của tôi đã chỉ ra rằng khi bao gồm dữ liệu tiêu đề hoặc sửa đổi ETag trong các phản hồi, các tác nhân luôn xác nhận lại bằng mọi cách, bất kể sự hiện diện của must-revalidatetiêu đề.

Vì vậy, quan điểm must-revalidatelà để buộc một 'bỏ qua bộ nhớ cache' khi nó đi cũ, mà chỉ có thể xảy ra khi bạn đã thiết lập một đời / tuổi, do đó nếu must-revalidateđược thiết lập trên một phản ứng không có tuổi hoặc tiêu đề khác, nó có hiệu quả trở nên tương đương với no-cachetừ các phản ứng sẽ được xem xét ngay lập tức cũ.

- Vì vậy, cuối cùng tôi sẽ đánh dấu câu trả lời của Gili!


Vì vậy, về mặt lý thuyết, sự khác biệt là hợp lệ-luôn luôn so với xác thực-nếu-cũ , trong khi trên thực tế, không có bộ đệm nào được xử lý bởi một số trình duyệt như nhận xét mà bạn trích dẫn nói là không bao giờ xác thực nên bạn nên lựa chọn sử dụng cái nào trong số đó. dựa trên những hành vi bộ nhớ đệm mà bạn thực sự muốn đạt được trong thực tế
CBroe

Vui lòng đọc greenbytes.de/tech/webdav/ và xem điều này có làm rõ mọi thứ cho bạn không.
Julian Reschke


kiểm tra cây quyết định này để biết câu trả lời stackoverflow.com/a/49925190/3748498
admvdomil

Câu trả lời:


191

Tôi tin rằng must-revalidatecó nghĩa là:

Khi bộ đệm hết hạn, hãy từ chối trả lại các phản hồi cũ cho người dùng ngay cả khi họ nói rằng các phản hồi cũ có thể chấp nhận được.

Trong khi đó no-cachengụ ý:

must-revalidate cộng với thực tế các phản ứng trở nên cũ kỹ ngay lập tức.

Nếu một phản hồi được lưu trong bộ nhớ cache trong 10 giây, sau đó must-revalidatekhởi động sau 10 giây, trong khi no-cachengụ ý must-revalidatesau 0 giây.

Ít nhất, đó là cách giải thích của tôi.


2
Đó là cách tôi đang nhìn thấy nó bây giờ. Phần thú vị là đoạn cuối cùng của tôi, không có ETag hoặc Sửa đổi lần cuối, tác nhân không có gì để sử dụng để xác thực những gì nó có trong bộ đệm và phải tải lại toàn bộ tải trọng. Vì vậy, khi RFC nói "xác nhận lại" điều đó có nghĩa là, hãy tìm nạp lại.
Luke Puplett

44
Điều đó cũng có nghĩa max-age=0, must-revalidateno-cachegiống hệt nhau
Anshul

5
@Anshul, ban đầu tôi nghĩ bạn đã đúng rằng 'max-age = 0, phải xác nhận lại và không có bộ đệm là giống hệt nhau', nhưng hãy xem câu trả lời của Jeffrey Fox có vẻ như không đúng lắm.
Don nở

2
@Anshul Không, must-revalidateno-cachecó ý nghĩa khác nhau đối với phản hồi mới: Nếu phản hồi được lưu trong bộ nhớ cache mới (nghĩa là phản hồi chưa hết hạn), must-revalidatesẽ khiến proxy phục vụ ngay lập tức mà không cần xác nhận lại với máy chủ, trong khi đó, no-cacheproxy phải xác nhận lại phản ứng lưu trữ bất kể độ tươi. Nguồn: "HTTP - Hướng dẫn dứt khoát", trang 182-183.
Matthias Braun

8
@MatthiasBraun Ah, tôi có thể thấy nguồn gốc của sự nhầm lẫn. Có thể tôi nên viết no-cachemax-age=0, must-revalidategiống hệt nhau
Anshul

24

max-age=0, must-revalidateno-cachekhông hoàn toàn giống hệt nhau. Với must-revalidate, nếu máy chủ không đáp ứng yêu cầu xác nhận lại, trình duyệt / proxy có nghĩa vụ phải trả về lỗi 504. Với no-cache, nó sẽ chỉ hiển thị nội dung được lưu trong bộ nhớ cache, có thể sẽ được người dùng ưa thích (tốt hơn là có một cái gì đó cũ hơn là không có gì cả). Đây là lý do tại sao must-revalidatechỉ dành cho các giao dịch quan trọng.


10
Không chắc chắn về no-cachegiải thích của bạn . Từ RFC 7234 Chỉ thị phản hồi "không có bộ đệm" chỉ ra rằng phản hồi PHẢI KHÔNG được sử dụng để đáp ứng yêu cầu tiếp theo mà không cần xác thực thành công trên máy chủ gốc. Điều này cho phép một máy chủ gốc ngăn chặn bộ đệm sử dụng nó để đáp ứng yêu cầu mà không cần liên hệ với nó, thậm chí bởi các bộ đệm đã được cấu hình để gửi phản hồi cũ. Điều này nghe có vẻ tương tự như các hạn chế đối vớimust-revalidate
Anshul

9
Jeffrey có bằng chứng cho thấy việc thực hiện hành xử như thế nào anh ta đã mô tả?
OrangeDog

Tôi nghĩ rằng câu trả lời này là chính xác cho các máy chủ proxy / lb. Nhưng thực tế, các trình duyệt không trả về 504 trong trường hợp đó.
Yann Dìnendal

Vậy must-validatecó nghĩa làmust-refresh
Simon_Weaver

15

Với cách giải thích của Jeffrey Fox no-cache, tôi đã thử nghiệm dưới chrome 52.0.2743.116 m, kết quả cho thấy no-cachecó hành vi tương tự must-revalidate, tất cả họ sẽ KHÔNG sử dụng bộ đệm cục bộ khi máy chủ không thể truy cập được và tất cả họ sẽ sử dụng bộ đệm trong khi quay lại trình duyệt / Nút chuyển tiếp khi máy chủ không thể truy cập. Như trên, tôi nghĩ max-age=0, must-revalidatelà giống hệt no-cache, ít nhất là trong việc thực hiện.


Chrome sẽ sử dụng bộ đệm cục bộ khi máy chủ khả dụng để xác nhận lại? (tức là "Nếu-Sửa đổi-Từ"). Trong cả hai trường hợp?
Giàu

-2

Tôi nghĩ rằng có một sự khác biệt giữa max-age=0, must-revalidateno-cache:

Trong must-revalidatetrường hợp khách hàng được phép gửi If-Modified-Sinceyêu cầu và phục vụ phản hồi từ bộ đệm nếu 304 Not Modifiedđược trả về.

Trong no-cachetrường hợp, máy khách không được lưu trữ phản hồi, vì vậy không nên sử dụng If-Modified-Since.


6
Nhưng no-cacheđiều đó không có nghĩa no-store- với no-cache, tài nguyên vẫn có thể được lưu trữ trong máy khách; nó chỉ cần được xác nhận lại trước khi được sử dụng?
Aron

4
Bạn đang conflating no-cacheno-store. no-cachecó nghĩa là tài nguyên PHẢI được xác nhận lại . Xác nhận lại bao gồm tùy chọn sử dụng các yêu cầu có điều kiện, chẳng hạn như If-None-MatchIf-Modified-Since.
Jules Sam. Randolph

1
@JulesRandolph: bạn có thể đúng. Bạn có bất kỳ bài kiểm tra / bản demo nào không? Tất cả các xác nhận không có bằng chứng mâu thuẫn trên q này đều gây nản lòng. Ngay cả câu trả lời được chấp nhận cũng chỉ nói "Ít nhất, đó là cách giải thích của tôi". Tôi có thể thiết lập một giường thử nghiệm và gửi nó ở đây nếu tôi có thời gian.
Giàu
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.