Sự khác biệt giữa Kiểm soát bộ đệm: max-age = 0 và không có bộ đệm là gì?


Câu trả lời:


598

Tôi đã có câu hỏi tương tự, và tìm thấy một số thông tin trong các tìm kiếm của tôi (câu hỏi của bạn đưa ra như một trong những kết quả). Đây là những gì tôi xác định ...

Có hai mặt để Cache-Controltiêu đề. Một bên là nơi nó có thể được gửi bởi máy chủ web (hay còn gọi là "máy chủ gốc"). Mặt khác là nơi nó có thể được gửi bởi trình duyệt (hay còn gọi là "tác nhân người dùng").


Khi được gửi bởi máy chủ gốc

Tôi tin rằng max-age=0chỉ đơn giản là nói với bộ nhớ cache (và tác nhân người dùng) phản hồi đã cũ từ việc sử dụng và vì vậy họ NÊN xác nhận lại phản hồi (ví dụ: với If-Not-Modifiedtiêu đề) trước khi sử dụng bản sao được lưu trong bộ nhớ cache, trong khi đó, no-cachenói với họ rằng họ PHẢI xác nhận lại trước khi sử dụng bộ nhớ cache bản sao. Từ 14.9.1 Bộ nhớ đệm là gì :

không có bộ nhớ cache

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

Nói cách khác, bộ nhớ cache đôi khi có thể chọn sử dụng phản hồi cũ (mặc dù tôi tin rằng chúng phải thêm Warningtiêu đề), nhưng no-cachenói rằng chúng không được phép sử dụng phản hồi cũ cho dù thế nào đi chăng nữa. Có thể bạn muốn hành vi NÊN xác định giá trị khi số liệu thống kê bóng chày được tạo trong một trang, nhưng bạn muốn hành vi PHẢI đánh giá lại khi bạn tạo phản hồi cho giao dịch mua hàng thương mại điện tử.

Mặc dù bạn đã đúng trong nhận xét của mình khi bạn nói no-cachekhông được phép ngăn chặn lưu trữ, nhưng thực tế nó có thể là một sự khác biệt khác khi sử dụng no-cache. Tôi đã xem qua một trang, Chỉ thị điều khiển bộ đệm bị khử , có nghĩa là (tôi không thể đảm bảo tính chính xác của nó):

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. Chúng tôi nghi ngờ rằng sự thay đổi này đã được nhắc nhở bởi việc sử dụng rộng rãi (và không chính xác) lệnh này để ngăn chặn bộ đệm.

...

Lưu ý rằng muộn, "kiểm soát bộ đệm: không có bộ đệm" cũng đã bắt đầu hoạt động giống như chỉ thị "không lưu trữ".

Với tư cách là một bên, nó xuất hiện với tôi Cache-Control: max-age=0, must-revalidatevề cơ bản có nghĩa là điều tương tự như Cache-Control: no-cache. Vì vậy, có lẽ đó là một cách để có được hành vi PHẢI xác định lại no-cache, đồng thời tránh việc di chuyển rõ ràng no-cacheđể làm điều tương tự như no-store(ví dụ: không lưu vào bộ nhớ cache nào)?


Khi được gửi bởi tác nhân người dùng

Tôi tin rằng câu trả lời của shahkalpesh áp dụng cho phía đại lý người dùng. Bạn cũng có thể xem 13.2.6 Phân biệt nhiều phản hồi .

Nếu một tác nhân người dùng gửi một yêu cầu với Cache-Control: max-age=0(còn gọi là "xác nhận lại từ đầu đến cuối"), thì mỗi bộ đệm trên đường đi sẽ xác nhận lại mục nhập bộ đệm của nó (ví dụ: với If-Not-Modifiedtiêu đề) tất cả các cách đến máy chủ gốc. Nếu trả lời là 304 (Không được sửa đổi), thực thể được lưu trong bộ nhớ cache có thể được sử dụng.

Mặt khác, gửi yêu cầu với Cache-Control: no-cache(còn gọi là "tải lại từ đầu đến cuối") không xác nhận lại và máy chủ KHÔNG được sử dụng bản sao được lưu trong bộ nhớ cache khi phản hồi.


9
Không kiểm soát bộ đệm: max-age = 0, phải xác nhận lại, xác thực lại proxy sẽ là tương đương chính xác của không có bộ đệm?
Didier A.

1
Câu trả lời tuyệt vời, tôi đã đi đọc bài viết trang web của bạn nhưng trang không còn hợp lệ. palisade.plynt.com/issues/2008Jul/cache-control-attribut
Craig London

7
Cảm ơn, @CraigLondon. Tôi đã chuyển hướng nó đến một phiên bản lưu trữ.
Michael Krebs

2
must-revalidateKHÔNG có nghĩa là giống như no-cachehoặc no-store. Cái sau bỏ qua hoàn toàn bộ nhớ cache, nhưng cái trước chỉ nói rằng bộ đệm phải luôn được kiểm tra độ mới, nhưng nếu nó vẫn còn hiện tại, nó có thể được sử dụng, vì vậy tiết kiệm băng thông. Cái sau buộc toàn bộ tải xuống từ đầu đến cuối, chiếm hết băng thông không cần thiết và trì hoãn các phản hồi.
Patanjali

3
@Patanjali no-cache không "bỏ qua bộ nhớ cache hoàn toàn" hoặc "buộc tải xuống toàn bộ từ đầu đến cuối", ít nhất là không có trong tất cả các trình duyệt. Thông số kỹ thuật chỉ nói rằng trình duyệt phải xác thực bộ đệm.
Franklin Yu

57

tuổi tối đa = 0

Điều này tương đương với việc nhấp vào Làm mới , có nghĩa là, đưa cho tôi bản sao mới nhất trừ khi tôi đã có bản sao mới nhất.

không có bộ nhớ cache

Điều này đang giữ Shift trong khi nhấp vào Làm mới, có nghĩa là, chỉ cần làm lại mọi thứ cho dù thế nào đi chăng nữa.


31
Điều này là không chính xác. shift-refresh là một bản làm mới cứng tương tự nhưno-store
Michael

3
Được xác minh trong Firefox 45.0, như Chrome 49.0.2623.87 m, cũng gửi một "Thực tế: không có bộ đệm" khi Shift + Làm mới.
Cees Timmerman

34

Bây giờ câu hỏi cũ, nhưng nếu có ai khác bắt gặp điều này thông qua một tìm kiếm như tôi đã làm, thì có vẻ như IE9 sẽ sử dụng điều này để cấu hình hành vi của tài nguyên khi sử dụng các nút quay lại và chuyển tiếp. Khi max-age = 0 được sử dụng, trình duyệt sẽ sử dụng phiên bản cuối cùng khi xem tài nguyên trên báo chí lùi / tiến. Nếu không có bộ đệm được sử dụng, tài nguyên sẽ được tải lại.

Thông tin chi tiết về bộ nhớ đệm IE9 có thể được nhìn thấy trên bài đăng blog bộ nhớ đệm msd này .


4
Tương tự, IE 8 gặp phải tất cả các loại sự cố "không thể tải xuống" khi không sử dụng bộ đệm trong https. độ phân giải được đề xuất đôi khi bao gồm thay đổi tiêu đề thành tuổi tối đa = 0
Robert Christ

28

Trong các thử nghiệm gần đây của tôi với IE8 và Firefox 3.5, dường như cả hai đều tuân thủ RFC. Tuy nhiên, họ khác nhau về "sự thân thiện" với máy chủ gốc. IE8 xử lý các no-cachecâu trả lời có cùng ngữ nghĩa như max-age=0,must-revalidate. Tuy nhiên, Firefox 3.5 dường như được coi no-cachelà tương đương với no-store, nó hút hiệu năng và sử dụng băng thông.

Squid Cache, theo mặc định, dường như không bao giờ lưu trữ bất cứ thứ gì có no-cachetiêu đề, giống như Firefox.

Lời khuyên của tôi sẽ là đặt public,max-age=0các tài nguyên không nhạy cảm mà bạn muốn kiểm tra độ mới cho mỗi yêu cầu, nhưng vẫn cho phép hiệu suất và lợi ích băng thông của bộ nhớ đệm. Đối với các mục trên mỗi người dùng có cùng xem xét, sử dụng private,max-age=0.

Tôi sẽ tránh việc sử dụng no-cachehoàn toàn, vì có vẻ như nó đã bị một số trình duyệt và bộ đệm phổ biến tương đương với chức năng tương đương no-store.

Ngoài ra, không mô phỏng Akamai và Limelight. Mặc dù về cơ bản họ chạy các mảng bộ nhớ đệm lớn như là hoạt động kinh doanh chính của họ và phải là chuyên gia, họ thực sự có lợi ích trong việc khiến nhiều dữ liệu được tải xuống từ mạng của họ. Google cũng có thể không phải là một lựa chọn tốt cho thi đua. Họ dường như sử dụng max-age=0hoặc no-cachengẫu nhiên tùy thuộc vào tài nguyên.


2
Câu trả lời tốt nhất cho nội dung được bảo vệ bằng mật khẩu. private,max-age=0.
dana

21
tuổi tối đa
    Khi một bộ đệm trung gian bị ép buộc, bằng chỉ thị max-age = 0, để xác nhận lại 
mục bộ nhớ cache riêng của nó và máy khách đã cung cấp trình xác nhận riêng của nó trong yêu cầu, 
trình xác nhận được cung cấp có thể khác với trình xác nhận hiện được lưu trữ với mục nhập bộ đệm. 
Trong trường hợp này, bộ đệm có thể sử dụng trình xác nhận để thực hiện yêu cầu riêng mà không cần 
ảnh hưởng đến tính minh bạch ngữ nghĩa. 

    Tuy nhiên, việc lựa chọn trình xác nhận có thể ảnh hưởng đến hiệu suất. Cách tiếp cận tốt nhất là cho
bộ đệm trung gian để sử dụng trình xác nhận riêng của nó khi thực hiện yêu cầu của nó. Nếu máy chủ trả lời
với 304 (Không được sửa đổi), sau đó bộ đệm có thể trả lại bản sao đã được xác thực của nó cho máy khách 
với đáp ứng 200 (OK). Nếu máy chủ trả lời với một trình xác thực bộ đệm và bộ đệm mới,
tuy nhiên, bộ đệm trung gian có thể so sánh trình xác nhận được trả về với bộ xác nhận được cung cấp trong 
yêu cầu của khách hàng, sử dụng chức năng so sánh mạnh. Nếu trình xác nhận của khách hàng là
bằng với máy chủ gốc, sau đó bộ đệm trung gian chỉ trả về 304 (Không phải 
Sửa đổi). Mặt khác, nó trả về thực thể mới với phản hồi 200 (OK).

    Nếu một yêu cầu bao gồm chỉ thị không có bộ đệm, thì nó KHÔNG NÊN bao gồm tối thiểu, 
max-stale, hoặc max-age. 

lịch sự: http://www.w3.org/Prot Protocol / rfc2616 / rfc2616-sec14.html # sec14.9.4

Đừng chấp nhận câu trả lời này - tôi sẽ phải đọc nó để hiểu cách sử dụng thực sự của nó :)


12

Tôi hầu như không phải là một chuyên gia về bộ nhớ đệm, nhưng Mark Nottingham thì có. Dưới đây là tài liệu lưu trữ của anh ấy . Ông cũng có các liên kết tuyệt vời trong phần Tài liệu tham khảo.

Dựa trên việc tôi đọc các tài liệu đó, có vẻ như max-age=0có thể cho phép bộ đệm gửi phản hồi được lưu vào bộ đệm cho các yêu cầu xuất hiện cùng lúc "trong đó" cùng lúc "có nghĩa là đủ gần nhau để chúng trông đồng thời với bộ đệm, nhưng no-cachesẽ không .


Điểm tốt, nhưng trong thực tế có trình duyệt nào thực sự làm điều đó?
Pacerier

3
@Pacerier Tôi nghĩ rằng điều này là nhiều hơn cho các máy chủ proxy lưu trữ như Varnish, Squid, Traffic, v.v.
Hank Gay

12

Nhân tiện, đáng chú ý là một số thiết bị di động, đặc biệt là các sản phẩm của Apple như iPhone / iPad hoàn toàn bỏ qua các tiêu đề như không có bộ nhớ cache, không lưu trữ, Hết hạn: 0 hoặc bất cứ điều gì khác mà bạn có thể cố gắng buộc chúng không sử dụng lại đã hết hạn trang mẫu.

Điều này đã khiến chúng tôi không hết đau đầu khi chúng tôi cố gắng giải quyết vấn đề về iPad của người dùng, ngủ quên trên một trang mà họ đã đạt được thông qua quy trình biểu mẫu, nói bước 2 trên 3, và sau đó thiết bị hoàn toàn bỏ qua cửa hàng / các chỉ thị bộ đệm, và theo như tôi có thể nói, chỉ cần lấy một ảnh chụp nhanh của trang từ trạng thái cuối cùng của nó, nghĩa là bỏ qua những gì nó được nói rõ ràng, và không chỉ vậy, lấy một trang không nên được lưu trữ và lưu trữ nó mà không thực sự kiểm tra lại, điều này dẫn đến tất cả các loại sự cố Phiên lạ, trong số những thứ khác.

Tôi chỉ thêm điều này trong trường hợp có ai đó đi cùng và không thể hiểu tại sao họ lại gặp lỗi phiên với điện thoại đặc biệt là iphones và ipad, có vẻ như là những kẻ phạm tội tồi tệ nhất trong lĩnh vực này.

Tôi đã thực hiện kiểm tra trình gỡ lỗi khá rộng rãi với vấn đề này và đây là kết luận của tôi, các thiết bị hoàn toàn bỏ qua các chỉ thị này.

Ngay cả khi sử dụng thường xuyên, tôi đã phát hiện ra rằng một số điện thoại di động cũng hoàn toàn không kiểm tra các phiên bản mới thông qua nói, Hết hạn: 0 sau đó kiểm tra ngày sửa đổi cuối cùng để xác định xem có nên lấy một phiên bản mới hay không.

Điều đó đơn giản là không xảy ra, vì vậy điều tôi buộc phải làm là thêm các chuỗi truy vấn vào các tệp css / js mà tôi cần để cập nhật, điều này khiến các thiết bị di động ngu ngốc nghĩ rằng đó là một tệp mà nó không có, như: .css? v = 1, sau đó v = 2 để cập nhật css / js. Điều này phần lớn hoạt động.

Nhân tiện, trình duyệt người dùng cũng vậy, nếu để mặc định, vào năm 2016, khi tôi liên tục phát hiện ra (chúng tôi thực hiện rất nhiều thay đổi và cập nhật cho trang web của mình) cũng không kiểm tra được ngày sửa đổi cuối cùng trên các tệp đó, nhưng truy vấn phương pháp chuỗi sửa lỗi đó. Đây là điều tôi nhận thấy với khách hàng và nhân viên văn phòng, những người có xu hướng sử dụng mặc định người dùng thông thường cơ bản trên trình duyệt của họ và không biết về các vấn đề bộ đệm với css / js, v.v., hầu như không thể thay đổi css / js mới, điều đó có nghĩa là mặc định cho các trình duyệt của họ, chủ yếu là MSIE / Firefox, không làm những gì họ được bảo phải làm, họ bỏ qua các thay đổi và bỏ qua các ngày sửa đổi cuối cùng và không xác thực, ngay cả khi hết hạn: 0 được đặt rõ ràng.

Đây là một chủ đề tốt với nhiều thông tin kỹ thuật tốt, nhưng điều quan trọng cần lưu ý là sự hỗ trợ cho công cụ này tệ đến mức nào trong các thiết bị di động. Cứ sau vài tháng tôi phải thêm nhiều lớp bảo vệ chống lại sự thất bại của chúng để tuân theo các lệnh tiêu đề mà chúng nhận được hoặc để can thiệp đúng vào các lệnh đó.


css và js là những ứng cử viên phù hợp cho bộ nhớ đệm, vì trong các hệ thống sản xuất, chúng không thực sự thay đổi thường xuyên. Tuy nhiên, có bộ nhớ đệm cho chúng trong khi phát triển là một điều khó khăn, vì hoạt động đó có thể đòi hỏi phải xóa bộ nhớ cache thường xuyên. Nhưng, nếu không thể sử dụng các cài đặt khác nhau cho các môi trường khác nhau, thì các yêu cầu sản xuất sẽ được ưu tiên, vì nó có hiệu quả nhất vì số lượng truy cập lớn hơn nhiều sẽ tiết kiệm băng thông, so với vài lần làm mới Ctrl-F5 mà một số nhà phát triển sẽ có làm. Tuy nhiên, truy vấn dữ liệu thời gian thực yêu cầu kiểm soát bộ đệm hoạt động đúng.
Patanjali

0

Một điều mà (đáng ngạc nhiên) đã không được đề cập là một yêu cầu có thể chỉ ra rõ ràng rằng nó sẽ chấp nhận dữ liệu cũ, sử dụng max-stalechỉ thị. Trong trường hợp đó, nếu máy chủ phản hồi max-age=0, bộ đệm sẽ chỉ xem xét phản hồi cũ và sẽ được sử dụng miễn phí để đáp ứng yêu cầu của khách hàng [yêu cầu dữ liệu cũ có khả năng]. Ngược lại, nếu máy chủ gửi no-cachethực sự thực hiện bất kỳ yêu cầu nào của khách hàng (với max-stale) đối với dữ liệu cũ, vì bộ đệm PHẢI xác nhận lại.


-2

Sự khác biệt là không có bộ đệm (không lưu trữ trên Firefox) ngăn chặn mọi loại bộ đệm. Điều đó có thể hữu ích để ngăn các trang có nội dung an toàn được ghi vào đĩa và cho các trang luôn được cập nhật ngay cả khi chúng được truy cập lại bằng nút quay lại.

max-age = 0 chỉ ra rằng một mục bộ đệm đã cũ và yêu cầu xác thực lại, nhưng không ngăn chặn bộ đệm. Thông thường các trình duyệt chỉ xác thực tài nguyên một lần cho mỗi phiên trình duyệt, vì vậy nội dung có thể không được cập nhật cho đến khi trang web được truy cập trong một phiên mới.

Thông thường, các trình duyệt sẽ không xóa các mục bộ đệm đã hết hạn, trừ khi chúng đang lấy lại không gian cho nội dung mới hơn khi bộ đệm của trình duyệt đã đầy. Sử dụng không lưu trữ, không có bộ đệm cho phép xóa một mục rõ ràng bộ đệm.


9
Theo như tôi hiểu, 'không có bộ nhớ cache' KHÔNG được phép ngăn chặn lưu trữ ('không lưu trữ' là cách thích hợp để đạt được điều đó). Các trình duyệt nhất định có giải thích 'không có bộ đệm' là 'không lưu trữ' không? Điều đó sẽ giải thích tại sao 'max-age = 0' được sử dụng thay vì chỉ đơn giản là 'không có bộ đệm'
rubyruy

3
Cái này sai. Xem ở trên. Một số trình duyệt / máy chủ có thể chọn triển khai không có bộ đệm là không lưu trữ, nhưng không phải tất cả.
Jeremy Kauffman

4
Cách an toàn duy nhất là sử dụng max-age=0nếu bạn cho rằng bộ nhớ đệm được cho phép nhưng tài nguyên nên được xác nhận lại và no-storenếu bạn không muốn phản hồi được lưu trữ trong bộ đệm. Điều no-cachenày được chỉ định ngẫu nhiên có nghĩa là một trong hai tùy thuộc vào nhà cung cấp tác nhân người dùng và số phiên bản và giao thức chuyển.
Mikko Rantalainen

Khi nào Firefox sử dụng không có cửa hàng?
Cees Timmerman
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.