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-Control
theo 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 Pragma
là thông số kỹ thuật HTTP 1.0 cho các máy khách thời tiền sử. Đây Expires
là thông số kỹ thuật HTTP 1.0 và 1.1 cho máy khách và proxy. Trong HTTP 1.1, Cache-Control
quyề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 Date
tiêu đề hợp lệ , thì về mặt lý thuyết bạn cũng có thể bỏ qua Cache-Control
và 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-Control
tham số khác như max-age
không liên quan nếu các Cache-Control
tham số nêu trên được chỉ định. Các Last-Modified
tiê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 .htaccess
tệ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-equiv
giá 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:
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 .