Câu hỏi Làm thế nào để kiểm soát bộ nhớ đệm trang web, trên tất cả các trình duyệt?


Các cuộc điều tra của chúng tôi cho thấy rằng không phải tất cả các trình duyệt đều tuân thủ các chỉ thị bộ nhớ cache http một cách thống nhất.

Vì lý do bảo mật, chúng tôi không muốn các trang nhất định trong ứng dụng của chúng tôi được lưu vào bộ nhớ cache, không bao giờ, bởi trình duyệt web. Điều này phải hoạt động cho ít nhất các trình duyệt sau:

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Chrome

Yêu cầu của chúng tôi đến từ một thử nghiệm an ninh. Sau khi đăng xuất khỏi trang web của chúng tôi, bạn có thể nhấn nút quay lại và xem các trang được lưu trong bộ nhớ cache.


1226
2017-09-08 12:08


gốc


Chỉ dành cho iPad Safari, [this] [1] có giúp gì không? [1]: stackoverflow.com/questions/24524248/… - Bakhshi
Cách đơn giản nhất là sử dụng: max-age = 10. Điều này không hoàn hảo vì trang sẽ được lưu trong 10 giây. Nhưng đó là giải pháp "spaghetti" tiêu đề ít nhất. Ngoài ra, điều này đôi khi mang lại hiệu suất lớn trên các trang web động sử dụng proxy ngược. (Kịch bản php chậm của bạn sẽ được gọi một lần sau mỗi 10 giây và sau đó sẽ được lưu trữ bởi proxy ngược. Một lần mỗi 10 giây là cách tốt hơn một lần cho mỗi khách truy cập) - Hello World
Cũng thấy securityevaluators.com/knowledge/case_studies/caching - Pacerier
Cảm ơn bạn vì câu hỏi tuyệt vời đó. Đối với sự tò mò những gì có thể là tình huống mà làm cho bạn gửi một số dữ liệu trong khi không muốn người nhận để lưu nó cho "lý do an ninh" . bạn đã gửi cho họ rồi! - Accountant م
xem stackoverflow.com/a/49925190/3748498 - pravdomil


Các câu trả lời:


Giới thiệu

Bộ tiêu đề tối thiểu chính xác hoạt động trên tất cả các ứng dụng khách được đề cập (và proxy):

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

Các Cache-Control là thông số kỹ thuật HTTP 1.1 cho khách hàng và proxy (và được yêu cầu hoàn toàn bởi một số khách hàng bên cạnh Expires). Các Pragma theo thông số HTTP 1.0 dành cho khách hàng thời tiền sử. Các Expires theo thông số HTTP 1.0 và 1.1 dành cho khách hàng và proxy. Trong HTTP 1.1, Cache-Control được ưu tiên hơn Expires, vì vậy nó hoàn toàn chỉ dành cho proxy HTTP 1.0.

Nếu bạn không quan tâm đến IE6 và bộ nhớ đệm bị hỏng khi chỉ phục vụ các trang qua HTTPS no-store, sau đó bạn có thể bỏ qua Cache-Control: no-cache.

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

Nếu bạn không quan tâm đến IE6 cũng như các máy khách HTTP 1.0 (HTTP 1.1 đã được giới thiệu năm 1997), thì bạn có thể bỏ qua Pragma.

Cache-Control: no-store, must-revalidate
Expires: 0

Nếu bạn không quan tâm đến proxy HTTP 1.0, thì bạn có thể bỏ qua Expires.

Cache-Control: no-store, must-revalidate

Mặt khác, nếu máy chủ tự động bao gồm một hợp lệ Date tiêu đề, sau đó bạn có thể bỏ qua về mặt lý thuyết Cache-Control quá và dựa vào Expires chỉ có.

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

Nhưng điều đó có thể thất bại nếu ví dụ: enduser thao tác ngày hệ điều hành và phần mềm máy khách đang dựa vào nó.

Khác Cache-Control các thông số như max-age không liên quan nếu đã nói ở trên Cache-Control thông số được chỉ định. Các Last-Modified tiêu đề như được bao gồm trong hầu hết các câu trả lời khác ở đây là chỉ có thú vị nếu bạn thực sự muốn để lưu trữ yêu cầu, vì vậy bạn không cần phải chỉ định nó.

Làm thế nào để thiết lập nó?

Sử dụng PHP:

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

Sử dụng Java Servlet hoặc Node.js:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.

Sử dụng ASP.NET-MVC

Response.Cache.SetCacheability(HttpCacheability.NoCache);  // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

Sử dụng ASP.NET Web API:

// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
    NoCache = true,
    NoStore = true,
    MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString()); 

Sử dụng ASP.NET:

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

Sử dụng ASP:

Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.

Sử dụng Ruby on Rails, hoặc Python / Flask:

response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response.headers["Pragma"] = "no-cache" # HTTP 1.0.
response.headers["Expires"] = "0" # Proxies.

Sử dụng Python / Django:

response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.

Sử dụng Python / Pyramid:

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

Sử dụng Google Go:

responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.

Sử dụng Apache .htaccess tập tin:

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

Sử dụng HTML4:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

Thẻ meta HTML và tiêu đề phản hồi HTTP

Điều quan trọng cần biết là khi trang HTML được phân phối qua kết nối HTTP và có một tiêu đề trong cả hai tiêu đề phản hồi HTTP và HTML <meta http-equiv> , sau đó thẻ được chỉ định trong tiêu đề phản hồi HTTP sẽ được ưu tiên hơn thẻ meta HTML. Thẻ meta HTML sẽ chỉ được sử dụng khi trang được xem từ hệ thống tệp đĩa cục bộ qua file:// URL. Xem thêm W3 HTML spec chương 5.2.2. Hãy cẩn thận với điều này khi bạn không chỉ định chúng theo lập trình, bởi vì máy chủ web có thể bao gồm một số giá trị mặc định.

Nói chung, bạn nên tốt hơn không phải chỉ định các thẻ meta HTML để tránh nhầm lẫn bởi người mới bắt đầu và dựa vào các tiêu đề phản hồi HTTP cứng. Hơn nữa, đặc biệt là những <meta http-equiv> thẻ là không hợp lệ trong HTML5. Chỉ http-equiv giá trị được liệt kê trong Đặc tả HTML5 được cho phép.

Xác minh tiêu đề phản hồi HTTP thực tế

Để xác minh cái này và cái khác, bạn có thể xem / gỡ rối chúng trong bộ giám sát lưu lượng HTTP của bộ công cụ phát triển webbrowser. Bạn có thể đến đó bằng cách nhấn F12 trong Chrome / Firefox23 + / IE9 + và sau đó mở bảng điều khiển tab "Mạng" hoặc "Net" rồi nhấp vào yêu cầu HTTP quan tâm để khám phá tất cả chi tiết về yêu cầu và phản hồi HTTP. Các bên dưới ảnh chụp màn hình đến từ Chrome:

Chrome developer toolset HTTP traffic monitor showing HTTP response headers on stackoverflow.com

Tôi cũng muốn đặt các tiêu đề đó trong quá trình tải xuống tệp

Trước hết, câu hỏi và câu trả lời này được nhắm mục tiêu vào "trang web" (trang HTML), không phải "tệp tải xuống" (PDF, zip, Excel, v.v.). Bạn nên có chúng được lưu trữ và sử dụng một số định danh phiên bản tệp ở đâu đó trong đường dẫn URI hoặc chuỗi truy vấn để buộc tải xuống lại trên tệp đã thay đổi. Tuy nhiên, khi áp dụng các tiêu đề không có bộ nhớ cache đó, hãy xem xét lỗi IE7 / 8 khi cung cấp tệp tải xuống qua HTTPS thay vì HTTP. Để biết chi tiết, hãy xem IE không thể tải xuống foo.jsf. IE không thể mở trang web này. Trang web được yêu cầu không khả dụng hoặc không thể tìm thấy.


2126
2018-03-30 23:08



Điều này dường như không đầy đủ. Tôi đã thử giải pháp này trên IE 8 và thấy rằng trình duyệt sẽ tải phiên bản được lưu trong bộ nhớ cache khi bạn nhấn nút quay lại. - Mike Ottum
Có khả năng phương pháp thử nghiệm của bạn đã sai. Có thể trang đã nằm trong bộ nhớ cache? Có thể các tiêu đề không chính xác / bị ghi đè? Có lẽ bạn đang xem xét yêu cầu sai? Vv .. - BalusC
Trên thực tế, tôi xác nhận rằng phương pháp này không đầy đủ và gây ra sự cố với IE8 hoặc ít nhất trong một số trường hợp. Cụ thể, khi sử dụng IE8 để tìm nạp tài nguyên qua SSL, IE8 sẽ từ chối tìm nạp tài nguyên lần thứ hai (hoặc là ở tất cả hoặc sau lần thử đầu tiên, tùy thuộc vào tiêu đề được sử dụng). Xem Blog của EricLaw, ví dụ. - haylem
Tôi muốn nói thêm rằng đây chính là điều mà Bank of America làm. Nếu bạn nhìn vào các tiêu đề phản hồi của chúng và dịch nó thành aspx, chúng đang thực hiện: Response.AppendHeader ("Cache-Control", "no-cache, no-store, must-revalidate"); Response.AppendHeader ("Hết hạn", "Thu, 01 Dec 1994 16:00:00 GMT"); Tôi nghĩ, nếu nó đủ tốt cho họ, nó đủ tốt cho tôi. - John
@ John: Tiêu đề hết hạn đó chính xác là giá trị mẫu trong Đặc tả HTTP 1.0. Nó hoạt động, nhưng nó hơi lố bịch để lấy chính xác dấu thời gian đó. - BalusC


(hey, tất cả mọi người: xin vui lòng không chỉ mindlessly sao chép và dán tất cả các tiêu đề bạn có thể tìm thấy)

Đầu tiên, Lịch sử nút quay lại là không phải bộ nhớ cache:

Mô hình làm mới (Phần 4.2) không nhất thiết áp dụng cho các cơ chế lịch sử. Đó là, một cơ chế lịch sử có thể hiển thị một biểu diễn trước đó ngay cả khi nó đã hết hạn.

Trong đặc tả HTTP cũ, từ ngữ thậm chí còn mạnh mẽ hơn, nói rõ các trình duyệt bỏ qua các chỉ thị bộ nhớ cache cho lịch sử nút quay lại.

Quay lại được cho là sẽ quay ngược thời gian (đến thời điểm người dùng  đăng nhập). Nó không điều hướng tới một URL được mở trước đó.

Tuy nhiên, trong thực tế, bộ nhớ cache có thể ảnh hưởng đến nút quay lại, trong các trường hợp rất cụ thể:

  • Trang phải được chuyển giao HTTPS, nếu không, bộ đệm ẩn bộ nhớ cache này sẽ không đáng tin cậy. Ngoài ra, nếu bạn không sử dụng HTTPS, thì trang của bạn dễ bị tấn công khi đăng nhập ăn cắp theo nhiều cách khác.
  • Bạn phải gửi Cache-Control: no-store, must-revalidate (một số trình duyệt quan sát no-store và một số quan sát must-revalidate)

Bạn không bao giờ cần bất kỳ:

  • <meta> với tiêu đề bộ nhớ cache - nó không hoạt động chút nào. Hoàn toàn vô dụng.
  • post-check/pre-check - đó là chỉ thị của IE chỉ áp dụng cho có thể lưu trữ tài nguyên.
  • Gửi cùng một tiêu đề hai lần hoặc trong hàng chục phần. Một số đoạn mã PHP có thực sự thay thế các tiêu đề trước đó, kết quả là chỉ có phần cuối cùng được gửi đi.

Nếu bạn muốn, bạn có thể thêm:

  • no-cache hoặc là max-age=0, sẽ làm cho tài nguyên (URL) "cũ" và yêu cầu trình duyệt kiểm tra với máy chủ nếu có phiên bản mới hơn (no-stoređã ngụ ý điều này thậm chí còn mạnh mẽ hơn).
  • Expires với một ngày trong quá khứ cho các máy khách HTTP / 1.0 (mặc dù thực Khách hàng chỉ sử dụng HTTP / 1.0 hoàn toàn không tồn tại trong những ngày này).

Tiền thưởng: Bộ nhớ đệm HTTP mới RFC.


205
2017-08-29 16:50



liệu điều này có ảnh hưởng đến hiệu suất của trang web về thời gian tải không? cách không lưu trữ, không có bộ nhớ cache, phải xác thực lại ảnh hưởng đến hiệu suất? - Raman Ghai
@RamanGhai Vô hiệu hóa bộ nhớ cache thường làm tổn thương hiệu suất (và tất cả 3 tùy chọn bạn đã đề cập vô hiệu bộ nhớ đệm). Nó có thể làm cho các CDN và proxy của ISP (ví dụ: các nhà khai thác di động thường được sử dụng) không hiệu quả. Nó không làm tổn thương tải đầu tiên bởi người dùng mới (ngoài vấn đề proxy), nhưng sau đó điều hướng tiếp theo có thể chậm hơn rất nhiều. - Kornel
@porneL bạn nói rằng chúng tôi phải gửi Cache-Control: must-revalidate. Tại sao không gửi Cache-Control: no-cache kể từ đó no-cache đã ngụ ý must-revalidate? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 - Pacerier
@Pacerier mối quan hệ của no-cache với must-revalidate là đúng cho bộ nhớ cache, nhưng lịch sử trở lại không phải là bộ nhớ cache. Trình duyệt trường hợp đặc biệt rõ ràng must-revalidate để kiểm soát hành vi lịch sử. - Kornel
@porneL, Hmm là có một RFC hỗ trợ mà nói rằng đó là hành vi mong muốn? - Pacerier


Như porneL đã nói, những gì bạn muốn là không tắt bộ nhớ cache, nhưng để tắt bộ đệm lịch sử. Các trình duyệt khác nhau có những cách tinh tế riêng để vô hiệu hóa bộ đệm lịch sử.

Trong Chrome (v28.0.1500.95 m), chúng tôi chỉ có thể thực hiện điều này bằng Cache-Control: no-store.

Trong FireFox (v23.0.1) bất kỳ một trong số này sẽ hoạt động:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (chỉ https)

  3. Pragma: no-cache (chỉ https)

  4. Vary: * (chỉ https)

Trong Opera (v12.15), chúng tôi chỉ có thể làm điều này bằng Cache-Control: must-revalidate (chỉ https).

Trong Safari (v5.1.7, 7534.57.2) bất kỳ một trong số này sẽ hoạt động:

  1. Cache-Control: no-store
    <body onunload=""> trong html

  2. Cache-Control: no-store (chỉ https)

Trong IE8 (v8.0.6001.18702IC) bất kỳ một trong số này sẽ hoạt động:

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache (chỉ https)

  7. Vary: * (chỉ https)

Kết hợp các giải pháp trên cung cấp cho chúng tôi giải pháp này hoạt động cho Chrome 28, FireFox 23, IE8, Safari 5.1.7 và Opera 12.15:  Cache-Control: no-store, must-revalidate (chỉ https)

Lưu ý rằng https là cần thiết vì Opera sẽ không tắt bộ đệm lịch sử cho các trang http đơn giản. Nếu bạn thực sự không thể nhận được https và bạn đã sẵn sàng bỏ qua Opera, điều tốt nhất bạn có thể làm là:

Cache-Control: no-store
<body onunload="">

Dưới đây cho thấy nhật ký thô của các thử nghiệm của tôi:

HTTP:

  1. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Thất bại: Opera 12,15
    Thành công: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  2. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Thất bại: Opera 12,15
    Thành công: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  3. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Lỗi: Safari 5.1.7, Opera 12.15
    Thành công: Chrome 28, FireFox 23, IE8

  4. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Lỗi: Safari 5.1.7, Opera 12.15
    Thành công: Chrome 28, FireFox 23, IE8

  5. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  6. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  7. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  8. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  9. Cache-Control: no-store
    Lỗi: Safari 5.1.7, Opera 12.15
    Thành công: Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Thất bại: Opera 12,15
    Thành công: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  12. Vary: *
    Lỗi: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Thành công: không

  13. Pragma: no-cache
    Lỗi: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Thành công: không

  14. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  15. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  16. Cache-Control: must-revalidate, max-age=0
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Thành công: IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Thành công: không

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Thành công: không

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Thành công: không

  3. Vary: *
    Lỗi: Chrome 28, Safari 5.1.7, Opera 12.15
    Thành công: FireFox 23, IE8

  4. Pragma: no-cache
    Lỗi: Chrome 28, Safari 5.1.7, Opera 12.15
    Thành công: FireFox 23, IE8

  5. Cache-Control: no-cache
    Lỗi: Chrome 28, Safari 5.1.7, Opera 12.15
    Thành công: FireFox 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Lỗi: Chrome 28, Safari 5.1.7, Opera 12.15
    Thành công: FireFox 23, IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Lỗi: Chrome 28, Safari 5.1.7, Opera 12.15
    Thành công: FireFox 23, IE8

  8. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Lỗi: Chrome 28, Safari 5.1.7, Opera 12.15
    Thành công: FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Lỗi: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Thành công: Opera 12,15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Thành công: Opera 12,15

  11. Cache-Control: must-revalidate, max-age=0
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7
    Thành công: IE8, Opera 12,15

  12. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, Safari 5.1.7
    Thành công: FireFox 23, IE8, Opera 12.15

  13. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Lỗi: Chrome 28, Safari 5.1.7
    Thành công: FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Thất bại: Opera 12,15
    Thành công: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  15. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Thất bại: Opera 12,15
    Thành công: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  16. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Thất bại: Opera 12,15
    Thành công: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Lỗi: Chrome 28, Safari 5.1.7, Opera 12.15
    Thành công: FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7,
    Thành công: IE8, Opera 12,15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7,
    Thành công: IE8, Opera 12,15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7,
    Thành công: IE8, Opera 12,15

  21. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Lỗi: Chrome 28, FireFox 23, Safari 5.1.7,
    Thành công: IE8, Opera 12,15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Lỗi: Chrome 28, Safari 5.1.7
    Thành công: FireFox 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    Lỗi: không
    Thành công: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15


82
2018-06-15 02:40



Tôi biết điều này đã được đăng một vài năm trở lại nhưng nó là một đọc thú vị. Vấn đề này đã khiến tôi phát điên trong vài tháng nay, cơ thể dường như thực sự biết cách đối phó với kiểm soát bộ nhớ cache. Tôi đã thấy một vài người sử dụng <body onunload=""> nhưng nó có vẻ giống như một cách xung quanh vấn đề thực tế. Tôi đã thử bằng cách sử dụng .htaccess và sửa đổi các tiêu đề như vậy, nếu tôi sử dụng HTTPS nó nên làm việc theo cách đó? Nó chủ yếu là safari, nơi vấn đề đặt ra nhiều nhất. - Jordan
@Jordan, Theo nhật ký ở trên nếu bạn có HTTPS rồi thêm Cache-Control: no-store sẽ làm điều này. <body onunload=""> chỉ cần khi bạn không có HTTPS. - Pacerier


Tôi tìm thấy tuyến đường web.config hữu ích (cố gắng thêm nó vào câu trả lời nhưng dường như không được chấp nhận để đăng bài ở đây)

<configuration>
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
            <!-- HTTP 1.1. -->
            <add name="Pragma" value="no-cache" />
            <!-- HTTP 1.0. -->
            <add name="Expires" value="0" />
            <!-- Proxies. -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

Và đây là cách thức express / node.js thực hiện tương tự:

app.use(function(req, res, next) {
    res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
    res.setHeader('Pragma', 'no-cache');
    res.setHeader('Expires', '0');
    next();
});

24
2018-01-14 23:35



Đối với web.config tôi sẽ sửa đổi chỉ một chút để áp dụng các tiêu đề tùy chỉnh chỉ cho những kịch bản mà chúng ta biết được nạp động / sử dụng requirejs. Giả sử tập lệnh của bạn được tìm thấy trong thư mục máy khách: <location path = "client"> ..... </ location> - Ibrahim ben Salah
Đối với những người có thể tự hỏi những gì web.conf là: Đây là tập tin cấu hình và cài đặt chính cho một ASP.NET ứng dụng web. Nó là một tài liệu XML nằm trong thư mục gốc. (wiki). - another


Tôi thấy rằng tất cả các câu trả lời trên trang này vẫn gặp sự cố. Đặc biệt, tôi nhận thấy rằng không ai trong số họ sẽ ngừng IE8 sử dụng phiên bản được lưu trong bộ nhớ cache của trang khi bạn truy cập nó bằng cách nhấn nút quay lại.

Sau nhiều nghiên cứu và thử nghiệm, tôi thấy rằng chỉ có hai tiêu đề tôi thực sự cần là:

Kiểm soát bộ nhớ cache: không lưu trữ
  Thay đổi: *

Để có giải thích về tiêu đề Vary, hãy xem http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

Trên IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 và Opera 9-10, các tiêu đề này khiến trang được yêu cầu từ máy chủ khi bạn nhấp vào liên kết đến trang hoặc đặt URL trực tiếp trong thanh địa chỉ. Điều đó bao gồm 99% của tất cả các trình duyệt được sử dụng kể từ tháng 1 '10.

Trên IE6 và Opera 9-10, nhấn nút quay lại vẫn khiến phiên bản được lưu trong bộ nhớ cache được tải. Trên tất cả các trình duyệt khác mà tôi đã thử nghiệm, họ đã tìm nạp phiên bản mới từ máy chủ. Cho đến nay, tôi đã không tìm thấy bất kỳ bộ tiêu đề nào sẽ khiến các trình duyệt đó không trả lại phiên bản được lưu trong bộ nhớ cache của các trang khi bạn nhấn nút quay lại.

Cập nhật:  Sau khi viết câu trả lời này, tôi nhận ra rằng máy chủ web của chúng tôi đang tự xác định mình là một máy chủ HTTP 1.0. Các tiêu đề tôi đã liệt kê là các tiêu đề chính xác để các phản hồi từ máy chủ HTTP 1.0 không được các trình duyệt lưu vào bộ nhớ cache. Đối với máy chủ HTTP 1.1, hãy xem BalusC's câu trả lời.


22
2017-09-08 12:11



Điều này làm việc cho nút quay lại của IE8 !! AFter cố gắng mọi thứ trong mọi đề xuất khác, thêm tiêu đề "Vary: *" rõ ràng là thứ duy nhất có thể buộc IE8 tải lại trang khi người dùng nhấn nút quay lại. Và cái này làm làm việc trên các máy chủ HTTP / 1.1. - CoreDumpError
Kết hợp với các tiêu đề được đề xuất bởi BarlusC, cộng với đoạn mã JS gọi window.location.reload () khi sự kiện onPageShow kích hoạt với thuộc tính "persisted" (cần thiết cho Safari), mỗi trình duyệt tôi đã thử nghiệm thành công buộc tải lại từ máy chủ khi người dùng sử dụng nút Quay lại. - CoreDumpError
@CoreDumpError, oh bạn không nên giả sử JavaScript được bật. - Pacerier
@ Chris, chỉ cần thử nghiệm. Nó không hoạt động trên Safari 5.1.7 và Opera ... - Pacerier
@Pacerier Vào thời điểm tôi đã viết câu trả lời vào năm 2010, điều này đã làm việc trên những gì sau đó là phiên bản mới nhất của cả Safari và Opera, với máy chủ của chúng tôi xác định chính nó như là một máy chủ HTTP 1.0. Thật không may, tôi không có bất kỳ cách nào để dễ dàng kiểm tra điều này nữa, vì vậy tôi không thể nói bất cứ điều gì dứt khoát về các phiên bản mới nhất của các trình duyệt này. - Chris Vasselli


Sau một chút nghiên cứu, chúng tôi đã đưa ra danh sách các tiêu đề sau dường như bao gồm hầu hết các trình duyệt:

Trong ASP.NET, chúng tôi đã thêm chúng bằng cách sử dụng đoạn mã sau:

Response.ClearHeaders(); 
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

Tìm thấy từ: http://forums.asp.net/t/1013531.aspx


18
2017-09-17 14:18



@bart: Thậm chí còn rắc rối hơn nữa là ngày 26 tháng 7 năm 1997 là thứ bảy, chứ không phải thứ hai ... - Cᴏʀʏ
Cache-Control: no-cache và Cache-Control: private xung đột - bạn sẽ không bao giờ có được cả hai cùng nhau: các cựu nói với các trình duyệt và proxy không để bộ nhớ cache ở tất cả, sau này nói với proxy không để bộ nhớ cache nhưng cho phép các trình duyệt giữ bản sao riêng của họ. Tôi không chắc chắn cài đặt trình duyệt sẽ theo, nhưng có thể không nhất quán giữa các trình duyệt và các phiên bản. - Keith
@Edward, được thử nghiệm và không hoạt động trên Safari 5.1.7 và Opera - Pacerier
Không sử dụng kiểm tra trước và sau khi kiểm tra. blogs.msdn.com/b/ieinternals/archive/2009/07/20/… - EricLaw
điều này đã không làm việc cho tôi - bằng cách sử dụng asp.net 4.5 mã chạy nhưng does't sản xuất các kết quả cần thiết. Tôi phải tuân theo điều này: stackoverflow.com/questions/22443932/… - Andy


Việc sử dụng tiêu đề pragma trong câu trả lời là một câu chuyện về vợ. RFC2616 chỉ định nghĩa nó làm tiêu đề yêu cầu

http://www.mnot.net/cache_docs/#PRAGMA


8
2017-09-18 10:36



Đây là một ví dụ tốt về lý do tại sao bạn cần phải vượt qua các thông số kỹ thuật. Nếu các thông số kỹ thuật luôn tinh thể rõ ràng, sẽ không có nhiều điểm cho các trang web như StackOverflow. Từ Microsoft  Với mục đích tương thích ngược với các máy chủ HTTP 1.0, Internet Explorer hỗ trợ việc sử dụng đặc biệt của tiêu đề HTTP Pragma: no-cache. Nếu máy khách kết nối với máy chủ qua kết nối an toàn (https: //) và máy chủ trả về một tiêu đề Pragma: no-cache với phản hồi, Internet Explorer không lưu lại câu trả lời. - michaelok
@michaelok: Tham chiếu của bạn là hợp lệ, nhưng bỏ lỡ điểm lớn hơn-- Đặt Cache-Control / Expires thích hợp và bạn không cần pragma. - EricLaw


DISCLAIMER: Tôi mạnh mẽ khuyên bạn nên đọc câu trả lời của @ BalusC. Sau khi đọc hướng dẫn bộ nhớ đệm sau: http://www.mnot.net/cache_docs/ (Tôi khuyên bạn nên đọc nó, quá), tôi tin rằng nó là chính xác. Tuy nhiên, vì lý do lịch sử (và bởi vì tôi đã thử nghiệm bản thân mình), tôi sẽ bao gồm câu trả lời ban đầu của tôi dưới đây:


Tôi đã thử câu trả lời 'chấp nhận' cho PHP, điều này không có tác dụng đối với tôi. Sau đó, tôi đã làm một ít nghiên cứu, tìm thấy một biến thể nhỏ, thử nghiệm nó, và nó đã làm việc. Đây là:

header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');

Cần làm việc. Vấn đề là khi đặt cùng một phần của tiêu đề hai lần, nếu false không được gửi làm đối số thứ hai cho hàm tiêu đề, chức năng tiêu đề sẽ chỉ ghi đè trước đó header() gọi điện. Vì vậy, khi thiết lập Cache-Control, ví dụ nếu một người không muốn đặt tất cả các đối số trong một header() chức năng gọi, anh ta phải làm một cái gì đó như thế này:

header('Cache-Control: this');
header('Cache-Control: and, this', false);

Xem thêm tài liệu hoàn chỉnh đây.


7
2018-06-13 15:23



Đây là đầy huyền thoại. kiểm tra trước và sau kiểm tra là chỉ-IE, chỉ liên quan đến các phản hồi được lưu trong bộ nhớ cache và giá trị 0 là một không-op. max-stale là tiêu đề yêu cầu proxy, không phải tiêu đề phản hồi của máy chủ. Hết hạn chỉ chấp nhận giá trị duy nhất. Nhiều hơn một tiêu đề sẽ bị bỏ qua. - Kornel
@porneL, bạn sẽ được gửi một câu trả lời cạnh tranh mà đề với những huyền thoại một cách chính xác? - Oddthinking
@Oddthinking, trông giống như stackoverflow.com/questions/49547/… là một câu trả lời cạnh tranh. - Mike Ottum
@Steven, chỉ cần thử nghiệm. Nó không hoạt động trên Safari 5.1.7 và Opera ... - Pacerier
@Pacerier có, như tôi nói trong tuyên bố từ chối trách nhiệm, sử dụng câu trả lời của BalusC. - Steven Oxley


Có lỗi trong IE6

Nội dung với "Content-Encoding: gzip" luôn được lưu trong bộ nhớ cache ngay cả khi bạn sử dụng "Cache-Control: no-cache".

http://support.microsoft.com/kb/321722

Bạn có thể tắt nén gzip cho người dùng IE6 (kiểm tra tác nhân người dùng cho "MSIE 6")


7
2017-09-08 12:14