Làm cách nào để kiểm soát bộ đệm trang web, trên tất cả các trình duyệt?


1552

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

Vì lý do an ninh chúng tôi không muốn trang nhất định trong ứng dụng của chúng tôi để được lưu trữ, bao giờ hết, 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+
  • Trình duyệt Chrome

Yêu cầu của chúng tôi đến từ một bài kiểm tra bảo mật. 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.


Chỉ dành cho ipad Safari, [điều này] [1] có giúp được không? [1]: stackoverflow.com/questions/24524248/
Kẻ

Đơ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 "tiêu đề spaghetti" ít nhất hiện có. Ngoài ra, điều này đôi khi cung cấp một hiệu suất lớn trên các trang web động sử dụng proxy ngược. (Script php chậm của bạn sẽ được gọi là một lần 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 hơn một lần mỗi khách truy cập.)
Hello World


3
Cảm ơn bạn cho câu hỏi tuyệt vời đó. Vì tò mò, đâu có thể là tình huống khiến bạn gửi một số dữ liệu trong khi không muốn người nhận lưu nó vì "lý do bảo mật" . bạn đã gửi chúng rồi!
Kế toán م

1
@Accountant: trong kịch bản của mình, người dùng đã đăng xuất. Ai có thể đảm bảo rằng người dùng tiếp theo của con người trên Tác nhân người dùng đó sẽ là người vừa đăng xuất?
Fabien Haddadi

Câu trả lời:


2579

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 máy khách được đề cập (và proxy):

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

Giá trị Cache-Controltheo thông số HTTP 1.1 cho các máy khách và proxy (và được yêu cầu ngầm bởi một số khách hàng bên cạnh Expires). Đây Pragmalà thông số kỹ thuật HTTP 1.0 cho các máy khách thời tiền sử. Đây Expireslà thông số kỹ thuật HTTP 1.0 và 1.1 cho máy khách và proxy. Trong HTTP 1.1, Cache-Controlquyền ưu tiên hơn Expires, vì vậy 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, thì 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 hay HTTP 1.0 client (HTTP 1.1 được giới thiệu 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 Datetiêu đề hợp lệ , thì về mặt lý thuyết bạn cũng có thể bỏ qua Cache-Controlvà chỉ dựa vào Expires.

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

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

Các Cache-Controltham số khác như max-agekhông liên quan nếu các Cache-Controltham số nêu trên được chỉ định. Các Last-Modifiedtiêu đề như có trong hầu hết câu trả lời khác ở đây là chỉ thú vị nếu bạn thực sự muốn để bộ nhớ cache theo yêu cầu, vì vậy bạn không cần phải xác định nó ở tất cả.

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 API Web ASP.NET:

// `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.NET Core v3

// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";

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:

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
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 / Kim tự tháp:

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

Sử dụng đi:

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 .htaccesstệp Apache :

<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 so với tiêu đề phản hồi HTTP

Điều quan trọng cần biết là khi một trang HTML được cung cấp qua kết nối HTTP và một tiêu đề có trong cả các tiêu đề phản hồi HTTP và các <meta http-equiv>thẻ HTML , thì một trang đượ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ộ thông 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 chương trình vì máy chủ web có thể bao gồm một số giá trị mặc định.

Nói chung, tốt hơn hết là bạn không 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ụ thể những <meta http-equiv>thẻ đó không hợp lệ trong HTML5. Chỉ cho phép các http-equivgiá trị được liệt kê trong đặc tả HTML5 .

Xác minh các 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ỡ lỗi chúng trong bộ theo dõi lưu lượng HTTP của bộ công cụ dành cho nhà phát triển webbrowser. Bạn có thể đến đó bằng cách nhấn F12 trong Chrome / Firefox23 + / IE9 +, sau đó mở bảng điều khiển tab "Mạng" hoặc "Mạng", sau đó 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. Ảnh chụp màn hình bên dưới là từ Chrome:

Bộ công cụ dành cho nhà phát triển Chrome theo dõi lưu lượng truy cập HTTP hiển thị các tiêu đề phản hồi HTTP trên stackoverflow.com

Tôi cũng muốn đặt các tiêu đề đó khi 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 trên "trang web" (trang HTML), không phải "tải xuống tệp" (PDF, zip, Excel, v.v.). Tốt hơn là bạn nên lưu chúng vào bộ nhớ cache 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 lại trên một tệp đã thay đổi. Khi áp dụng các tiêu đề không có bộ đệm này khi tải xuống tệp, thì hãy cẩn thận với lỗi IE7 / 8 khi phục vụ tải xuống tệp qua HTTPS thay vì HTTP. Để biết chi tiết, xem IE không thể tải xuống foo.jsf. IE đã không thể mở trang web internet này. Các trang web được yêu cầu là không có sẵn hoặc không thể được tìm thấy .


16
Điều này dường như không hoàn thành. 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

16
Có thể phương pháp thử nghiệm của bạn đã sai. Có lẽ trang đã có trong bộ nhớ cache? Có lẽ các tiêu đề không chính xác / overriden? Có lẽ bạn đang nhìn vào yêu cầu sai? V.v ..
BalusC

8
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 là 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 (cả hai hoặc sau lần thử đầu tiên, tùy thuộc vào các tiêu đề được sử dụng). Xem blog của EricLaw , ví dụ.
haylem

21
Tôi muốn nói thêm rằng đây thực chất là những gì Bank of America làm. Nếu bạn nhìn vào tiêu đề phản hồi của họ và dịch nó thành aspx, họ đang thực hiện: Feedback.AppendHeader ("Kiểm soát bộ đệm", "không có bộ đệm, không lưu trữ, phải xác nhận lại"); Phản hồi.AppendHeader ("Hết hạn", "Thu, ngày 01 tháng 12 năm 1994 16:00:00 GMT"); Tôi nghĩ, nếu nó đủ tốt cho họ, thì nó đủ tốt cho tôi.
Giăng

8
@ 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 hơi vô lý khi lấy chính xác dấu thời gian đó.
BalusC

244

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

Trước hết, lịch sử nút Quay lại không phải là bộ đệm :

Mô hình độ tươi (Mục 4.2) không nhất thiết phải á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 đại diện trước đó ngay cả khi nó đã hết hạn.

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

Quay lại được cho là 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 đã mở trước đó.

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

  • Trang phải được gửi qua HTTPS , nếu không, việc lưu bộ đệm 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ị đă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-storevà một số quan sát must-revalidate)

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

  • <meta>với các tiêu đề bộ đệm - nó hoàn toàn không hoạt động. Hoàn toàn vô dụng.
  • post-check/ pre-check- đó là chỉ thị IE chỉ áp dụng cho các tài nguyên có thể lưu trong bộ nhớ cache .
  • 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 PHP ngoài đó thực sự thay thế các tiêu đề trước đó, dẫn đến chỉ có một đoạn cuối được gửi.

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

  • no-cachehoặc max-age=0, điều này sẽ làm cho tài nguyên (URL) "cũ" và yêu cầu các 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 hơn).
  • Expiresvới một ngày trong quá khứ cho các máy khách HTTP / 1.0 (mặc dù các máy khách chỉ có HTTP / 1.0 thực sự hoàn toàn không tồn tại trong những ngày này).

Phần thưởng: RFC bộ nhớ đệm HTTP mới .


1
điều này sẽ có bất kỳ tác dụng phụ nào đối với hiệu suất của trang web về thời gian tải không? Làm thế nào không lưu trữ, không có bộ nhớ cache, phải xác nhận lại ảnh hưởng đến hiệu suất?
Raman Ghai

@RamanGhai Tắt bộ nhớ cache thường làm tổn hại đến hiệu suất (và cả 3 tùy chọn bạn đã đề cập đều tắt bộ đệm ẩn). Nó có thể làm cho các proxy CDN và ISP (ví dụ: thường được sử dụng bởi các nhà khai thác di động) không hiệu quả. Nó không ảnh hưởng đến tải đầu tiên của 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

@yheL 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-cacheno-cacheđã ngụ ý must-revalidate? w3.org/Prot Protocol / rfc2616 / rfc2616
Pacerier

3
@Pacerier mối quan hệ no-cachevới must-revalidatelà đúng với bộ đệm, nhưng lịch sử trở lại không phải là bộ đệm. 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

@yheL, Hmm có RFC hỗ trợ nào nói rằng đó là hành vi mong muốn không?
Pacerier

103

Như @Kornel đã nêu, điều bạn muốn không phải là hủy kích hoạt bộ đệm, mà là hủy kích hoạ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 việc này bằng cách 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 cách 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 những điều trên mang lại 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 hủy kích hoạ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
    Thất bại: không
    thành công: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15


3
Tôi biết điều này đã được đăng một vài năm trước nhưng nó là một bài đọ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ộ đệm. 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 giải quyết vấn đề thực tế. Tôi đã thử sử dụng .htaccess và sửa đổi các tiêu đề theo cách đó, nếu tôi sử dụng HTTPS thì nó có hoạt động theo cách đó không? Đó chủ yếu là safari nơi vấn đề phát sinh nhất.
Jordan

4
@Jordan, Theo các nhật ký ở trên nếu bạn có HTTPS thì thêm Cache-Control: no-storesẽ thực hiện thủ thuật. <body onunload="">chỉ cần thiết khi bạn không có HTTPS.
Pacerier

37

Tôi thấy tuyến web.config hữu ích (đã cố thêm nó vào câu trả lời nhưng dường như không được chấp nhận nên đăng ở đâ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 express / node.js để làm 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();
});

Đố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 các tập lệnh mà chúng tôi biết được tải động / sử dụng các yêu cầu. 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 đó web.conflà gì : Đây là cài đặt chính và tệp cấu hì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 ).
một

27

Tôi thấy rằng tất cả các câu trả lời trên trang này vẫn có vấn đề. Đặc biệt, tôi nhận thấy rằng không ai trong số họ sẽ ngăn 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 hai tiêu đề duy nhất tôi thực sự cần là:

Kiểm soát bộ nhớ cache: không có cửa hàng Khác nhau
: *

Để biết giải thích về tiêu đề Vary, hãy xem http://www.w3.org/Prot Protocol / rfc2616 / rfc2616-sec13.html # secec.6.6

Trên IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 và Opera 9-10, những 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 khoảng 99% tất cả các trình duyệt được sử dụng kể từ ngày 10 tháng 1.

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 chưa 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 các phiên bản trang được lưu trong bộ nhớ cache 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 tự nhận mình là máy chủ HTTP 1.0. Các tiêu đề tôi đã liệt kê là những tiêu đề chính xác để các phản hồi từ máy chủ HTTP 1.0 không bị 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 câu trả lời của BalusC .


4
Điều này hoạt động cho nút quay lại của IE8 !! Sau khi thử mọi thứ trong mọi đề xuất khác, thêm tiêu đề "Vary: *" rõ ràng là điều 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à điều này không hoạt động 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 "vẫn tồn tại" (cần thiết cho Safari), mọi trình duyệt tôi đã thử nghiệm đều tải lại thành công từ máy chủ khi người dùng sử dụng nút Quay lại.
coredumperror

1
@CoreDumpError, oh bạn không nên cho rằng JavaScript được bật.
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 đã hoạt động trên 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 tự nhận mình là máy chủ HTTP 1.0. Thật không may, tôi không có 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

Các phiên bản trình duyệt bạn đã thử nghiệm là gì?
Pacerier

21

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

Trong ASP.NET, chúng tôi đã thêm những đoạn này bằ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


36
@bart: Điều rắc rối hơn nữa là ngày 26 tháng 7 năm 1997 là thứ bảy, không phải thứ hai ...
C

5
Cache-Control: no-cacheCache-Control: privatexung đột - bạn không bao giờ nên kết hợp cả hai: cái trước nói với trình duyệt và proxy không được lưu trữ bộ đệm, cái sau bảo proxy không lưu cache nhưng cho phép trình duyệt giữ bản sao riêng của chúng. Tôi không chắc trình cài đặt nào sẽ tuân theo, nhưng không chắc là phù hợp giữa trình duyệt và phiên bản.
Keith

Không sử dụng kiểm tra trước và kiểm tra sau. blogs.msdn.com/b/ieinternals/archive/2009/07/20/...
EricLaw

điều này không hiệu quả với tôi - sử dụng asp.net 4.5 mã chạy nhưng không tạo ra kết quả cần thiết. Tôi đã phải làm theo điều này: stackoverflow.com/questions/22443932/ Kẻ
Andy

8

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

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


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

@michaelok: Tài liệu tham khảo của bạn hợp lệ, nhưng bỏ lỡ điểm lớn hơn-- Đặt Kiểm soát bộ nhớ cache / Hết hạn thích hợp và bạn không cần pragma.
EricLaw

8

TUYÊN BỐ TỪ CHỐI: Tôi thực sự 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 cũng khuyên bạn nên đọc nó), tôi tin rằng nó là chính xác. Tuy nhiên, vì lý do lịch sử (và vì tôi đã tự kiểm tra), tôi sẽ bao gồm câu trả lời ban đầu của mình bên dưới:


Tôi đã thử câu trả lời 'được chấp nhận' cho PHP, không phù hợp với tôi. Sau đó, tôi đã làm một nghiên cứu nhỏ, tìm thấy một biến thể nhỏ, thử nghiệm nó và nó đã hoạt động. Đâ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 thiết lập cùng một phần của tiêu đề hai lần, nếu falsekhông được gửi làm đối số thứ hai cho chức năng tiêu đề, chức năng tiêu đề sẽ đơn giản ghi đè lên header()cuộc gọi trước đó . Vì vậy, khi thiết lập Cache-Control, ví dụ, nếu người ta không muốn đặt tất cả các đối số trong một header()lệnh gọi hàm, 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 đầy đủ ở đây .


14
Đây là đầy huyền thoại. kiểm tra trước và kiểm tra sau chỉ dành cho IE, chỉ liên quan đến các phản hồi được lưu trong bộ nhớ cache và giá trị 0 là không có. 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 sẽ khiến tiêu đề này bị bỏ qua.
Kornel

1
@yheL, bạn sẽ gửi câu trả lời cạnh tranh liên quan đến những huyền thoại này một cách chính xác chứ?
Oddthinking

@Oddthinking, có vẻ như stackoverflow.com/questions/49547/ cấp là một câu trả lời cạnh tranh.
Mike Ottum

@Pacerier có, như tôi nói trong phần từ chối trách nhiệm, hãy sử dụng câu trả lời của BalusC.
Steven Oxley

8

Đối với ASP.NET Core, tạo một lớp phần mềm trung gian đơn giản:

public class NoCacheMiddleware
{
    private readonly RequestDelegate m_next;

    public NoCacheMiddleware( RequestDelegate next )
    {
        m_next = next;
    }

    public async Task Invoke( HttpContext httpContext )
    {
        httpContext.Response.OnStarting( ( state ) =>
        {
            // ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
            httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
            httpContext.Response.Headers.Append( "Pragma", "no-cache" );
            httpContext.Response.Headers.Append( "Expires", "0" );
            return Task.FromResult( 0 );
        }, null );

        await m_next.Invoke( httpContext );
    }
}

sau đó đăng ký với Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

Hãy chắc chắn rằng bạn thêm cái này vào đâu đó sau

app.UseStaticFiles();

Tôi sẽ đề nghị sử dụng các hằng số từ Microsoft.Net.Http.Headers.HeaderNames thay vì chuỗi ký tự "Cache-Controls", "Pragma" và "Hết hạn".
Victor Sharovatov

7

Những chỉ thị này không giảm thiểu bất kỳ rủi ro bảo mật. Họ thực sự có ý định buộc UA phải làm mới thông tin dễ bay hơi, không giữ cho UA không bị giữ lại thông tin. Xem câu hỏi tương tự này . Ít nhất, không có gì đảm bảo rằng bất kỳ bộ định tuyến, proxy, v.v. cũng sẽ không bỏ qua các chỉ thị bộ đệm.

Trên một lưu ý tích cực hơn, các chính sách liên quan đến quyền truy cập vật lý vào máy tính, cài đặt phần mềm và những thứ tương tự sẽ giúp bạn vượt xa hầu hết các công ty về bảo mật. Nếu người tiêu dùng thông tin này là thành viên của công chúng, điều duy nhất bạn thực sự có thể làm là giúp họ hiểu rằng một khi thông tin chạm vào máy của họ, thì máy đó là trách nhiệm của họ chứ không phải của bạn.


7

Có lỗi trong IE6

Nội dung với "Mã hóa nội dung: gzip" luôn được lưu trong bộ nhớ cache ngay cả khi bạn sử dụng "Điều khiển bộ đệm: không có bộ đệm".

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

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


6

RFC cho HTTP 1.1 cho biết phương pháp thích hợp là thêm Tiêu đề HTTP cho:

Kiểm soát bộ đệm: không có bộ đệm

Các trình duyệt cũ hơn có thể bỏ qua điều này nếu chúng không tuân thủ đúng HTTP 1.1. Đối với những người bạn có thể thử tiêu đề:

Thực dụng: không có bộ nhớ cache

Điều này cũng được cho là hoạt động cho các trình duyệt HTTP 1.1.


1
Thông số kỹ thuật chỉ ra rằng phản hồi không được sử dụng lại mà không cần xác nhận lại. Đó là Kiểm soát bộ đệm: không lưu trữ là phương thức chính thức để chỉ ra rằng phản hồi thậm chí không được lưu trữ trong bộ đệm ở vị trí đầu tiên.
AnthonyWJones

6

Đặt tiêu đề http được sửa đổi thành một số ngày vào năm 1995 thường thực hiện thủ thuật.

Đây là một ví dụ:

Hết hạn: Thứ Tư, ngày 15 tháng 11 năm 1995 04:58:08 GMT
Sửa đổi lần cuối: Thứ tư, ngày 15 tháng 11 năm 1995 04:58:08 GMT
Kiểm soát bộ đệm: không có bộ đệm, phải xác nhận lại

1
Thiết lập một sửa đổi lần trước từ lâu không có tác động đến bộ nhớ đệm, ngoài việc để cho một phản hồi được lưu trữ được sử dụng lâu hơn do xác nhận lại heuristic.
EricLaw

6

Các tài liệu PHP cho hàm tiêu đề có một ví dụ khá đầy đủ (đóng góp bởi một bên thứ ba):

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

11
Điều này rõ ràng là sai. Các cuộc gọi thứ hai đến tiêu đề () cho Hết hạn, Kiểm soát bộ đệm và Thực tế ghi đè hoàn toàn các giá trị được đặt trước đó.
Kornel

1
@yheL: Không được ghi đè các giá trị được đặt trước đó khi anh ta chuyển sai thành tham số thứ 2, yêu cầu không ghi đè các giá trị trước đó.
Julien Palard

1
@JulienPalard câu trả lời đã được chỉnh sửa sau khi tôi đưa ra nhận xét của mình. Nó vẫn không có ý nghĩa nhiều.
Kornel

Không gửi nhiều tiêu đề Kiểm soát bộ đệm nếu bạn muốn làm việc trong IE trước 9. Đừng bao giờ gửi kiểm tra trước hoặc kiểm tra sau. blogs.msdn.com/b/ieinternals/archive/2009/07/20/...
EricLaw

6

Nếu bạn gặp phải vấn đề tải xuống với IE6-IE8 qua SSL và bộ đệm: tiêu đề không có bộ đệm (và các giá trị tương tự) với các tệp MS Office, bạn có thể sử dụng bộ đệm: riêng tư, tiêu đề không lưu trữ và trả về tệp theo yêu cầu POST. Nó hoạt động.


6

trong trường hợp của tôi, tôi đã khắc phục sự cố trong chrome với điều này

<form id="form1" runat="server" autocomplete="off">

nơi tôi cần xóa nội dung của dữ liệu biểu mẫu thịnh hành khi người dùng nhấp vào nút quay lại vì lý do bảo mật


Sự cố trình duyệt mozilla 19.x của tôi cũng được giải quyết bằng đoạn mã. tự động hoàn thành = "tắt". Cảm ơn bạn.
Satya

5

Câu trả lời được chấp nhận dường như không hoạt động đối với IIS7 +, đi theo số lượng lớn câu hỏi về các tiêu đề bộ đệm không được gửi trong II7:

Và như thế

Câu trả lời được chấp nhận là chính xác trong đó các tiêu đề phải được đặt, nhưng không phải là cách chúng phải được đặt. Cách này hoạt động với IIS7:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");

Dòng đầu tiên được đặt Cache-controlthành no-cachevà dòng thứ hai thêm các thuộc tính khácno-store, must-revalidate


Điều này làm việc cho tôi:Response.Cache.SetAllowResponseInBrowserHistory(false); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
Vilx-

4

Tôi đã có kết quả tốt nhất và phù hợp nhất trên tất cả các trình duyệt bằng cách đặt Pragma: no-cache


4

Các tiêu đề trong câu trả lời do BalusC cung cấp không ngăn Safari 5 (và có thể cả các phiên bản cũ hơn) hiển thị nội dung từ bộ đệm của trình duyệt khi sử dụng nút quay lại của trình duyệt. Một cách để ngăn chặn điều này là thêm một thuộc tính xử lý sự kiện onunload trống vào thẻ body:

<body onunload=""> 

Bản hack này dường như phá vỡ bộ đệm ẩn phía trước trong Safari: Có sự kiện tải trên trình duyệt chéo khi nhấp vào nút quay lại không?


Thật tuyệt, tôi đã thử nó và nó thực sự hoạt động trên Safari (5.1.7) nhưng không phải Opera.
Pacerier

4

Ngoài ra, chỉ để có biện pháp tốt, hãy đảm bảo bạn đặt lại tệp ExpiresDefaulttrong .htaccesstệp của mình nếu bạn đang sử dụng để kích hoạt bộ đệm.

ExpiresDefault "access plus 0 seconds"

Sau đó, bạn có thể sử dụng ExpiresByTypeđể đặt các giá trị cụ thể cho các tệp bạn muốn lưu vào bộ đệm:

ExpiresByType image/x-icon "access plus 3 month"

Điều này cũng có thể có ích nếu các tệp động của bạn, ví dụ như php, v.v. đang được trình duyệt lưu vào bộ nhớ cache và bạn không thể hiểu tại sao. Kiểm tra ExpiresDefault.


3

Ngoài các tiêu đề, hãy xem xét việc phục vụ trang của bạn qua https . Nhiều trình duyệt sẽ không lưu cache https theo mặc định.


3
//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>

2

Để hoàn thành BalusC -> TRẢ LỜI Nếu bạn đang sử dụng perl, bạn có thể sử dụng CGI để thêm các tiêu đề HTTP.

Sử dụng Perl:

Use CGI;    
sub set_new_query() {
        binmode STDOUT, ":utf8";
        die if defined $query;
        $query = CGI->new();
        print $query->header(
                        -expires       => 'Sat, 26 Jul 1997 05:00:00 GMT',
                        -Pragma        => 'no-cache',
                        -Cache_Control => join(', ', qw(
                                            private
                                            no-cache
                                            no-store
                                            must-revalidate
                                            max-age=0
                                            pre-check=0
                                            post-check=0 
                                           ))
        );
    }

Sử dụng apache httpd.conf

<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>

Lưu ý: Khi tôi cố gắng sử dụng META html, các trình duyệt đã bỏ qua chúng và lưu vào trang.


0

Tôi chỉ muốn chỉ ra rằng nếu ai đó muốn ngăn bộ nhớ cache CHỈ nội dung động, việc thêm các tiêu đề bổ sung đó phải được lập trình.

Tôi đã chỉnh sửa tệp cấu hình của dự án của mình để nối các tiêu đề không có bộ đệm, nhưng điều đó cũng vô hiệu hóa nội dung tĩnh lưu trữ bộ đệm, thường không được mong muốn. Sửa đổi tiêu đề phản hồi trong mã đảm bảo rằng các tệp hình ảnh và kiểu sẽ được lưu trữ.

Điều này là khá rõ ràng, nhưng vẫn còn đáng nói.

Và một sự thận trọng khác. Hãy cẩn thận khi sử dụng phương thức ClearHeaders từ lớp HttpResponse. Nó có thể cung cấp cho bạn một số vết bầm nếu bạn sử dụng nó một cách liều lĩnh. Giống như nó đã cho tôi.

Sau khi chuyển hướng vào sự kiện ActionFilterAttribution, hậu quả của việc xóa tất cả các tiêu đề đang làm mất tất cả dữ liệu phiên và dữ liệu trong bộ lưu trữ TempData. An toàn hơn khi chuyển hướng từ một Hành động hoặc không xóa các tiêu đề khi chuyển hướng đang diễn ra.

Về ý nghĩ thứ hai, tôi không khuyến khích tất cả sử dụng phương pháp ClearHeaders. Tốt hơn là loại bỏ các tiêu đề riêng biệt. Và để đặt tiêu đề Cache-Control đúng cách, tôi đang sử dụng mã này:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");

0

Tôi không có may mắn với <head><meta>các yếu tố. Thêm trực tiếp các tham số liên quan đến bộ đệm HTTP (bên ngoài tài liệu HTML) thực sự hiệu quả với tôi.

Mã mẫu trong Python bằng cách sử dụng web.headercác lệnh gọi web.txt sau. Tôi cố tình làm lại mã tiện ích không liên quan cá nhân của tôi.

    nhập web
    nhập khẩu hệ thống
    nhập khẩu cá nhân

    myname = "main.py"

    url = (
        '/', 'lớp chính'
    )

    main = web.application (url, globalals ())

    render = web.template.render ("samples /", base = "layout", cache = false)

    lớp main_group (đối tượng):
        def GET (tự):
            web.header ("Kiểm soát bộ đệm", "không có bộ đệm, không lưu trữ, phải xác nhận lại")
            web.header ("Thực dụng", "không có bộ đệm")
            web.header ("Hết hạn", "0")
            trả về render.main_form ()

        def POST (tự):
            tin nhắn = "Đã đăng:"
            form = web.input (chức năng = Không)
            web.header ("Kiểm soát bộ đệm", "không có bộ đệm, không lưu trữ, phải xác nhận lại")
            web.header ("Thực dụng", "không có bộ đệm")
            web.header ("Hết hạn", "0")
            return render.index_laid thừng (chúc mừng = tin nhắn + form.feft)

    if __name__ == "__main__":
        nargs = len (sys.argv)
        # Đảm bảo rằng có đủ đối số sau tên chương trình python
        nếu nargs! = 2:
            LOG-AND-DIE ("% s: Lỗi dòng lệnh, nargs =% s, nên là 2", myname, nargs)
        # Đảm bảo rằng số cổng TCP là số
        thử:
            tcp_port = int (sys.argv [1])
        ngoại trừ ngoại lệ như e:
            LOG-AND-DIE ("% s: tcp_port = int (% s) không thành công (không phải là số nguyên)", myname, sys.argv [1])
        # Tất cả đều tốt!
        JUST-LOG ("% s: Chạy trên cổng% d", myname, tcp_port)
        web.httpserver.runsimple (main.wsgifunc (), ("localhost", tcp_port))
        chính.run ()


Đây có phải là không được đề cập nhiều lần trong các câu trả lời đã có trên trang web trong nhiều năm?
Martin Tournoij

Các chỉ thị META hoạt động trong Internet Explorer và các phiên bản của Edge 18 trở về trước. Các trình duyệt hiện đại không hỗ trợ chúng. crorms.com/2763
EricLaw

0

Xem liên kết này đến Nghiên cứu Điển hình về Bộ nhớ đệm:

http://securityevaluators.com/ledgeledge/case_studies/caching/

Tóm tắt, theo bài viết, chỉ Cache-Control: no-storehoạt động trên Chrome, Firefox và IE. IE chấp nhận các điều khiển khác, nhưng Chrome và Firefox thì không. Các liên kết là một đọc tốt hoàn thành với lịch sử của bộ nhớ đệm và tài liệu bằng chứng về khái niệm.


0

Không chắc câu trả lời của tôi nghe có vẻ đơn giản và ngu ngốc không, và có lẽ nó đã được bạn biết đến từ lâu, nhưng vì việc ngăn ai đó sử dụng nút quay lại trình duyệt để xem các trang lịch sử của bạn là một trong những mục tiêu của bạn, bạn có thể sử dụng:

window.location.replace("https://www.example.com/page-not-to-be-viewed-in-browser-history-back-button.html");

Tất nhiên, điều này có thể không được thực hiện trên toàn bộ trang web, nhưng ít nhất là đối với một số trang quan trọng, bạn có thể làm điều đó. Hi vọng điêu nay co ich.


-1

bạn có thể sử dụng khối vị trí để đặt tệp riêng lẻ thay vì toàn bộ ứng dụng nhận bộ đệm trong IIS

 <location path="index.html">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Cache-Control" value="no-cache" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>
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.