Вступ
Правильний мінімальний набір заголовків, який працює для всіх згаданих клієнтів (і проксі):
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Це Cache-Control
відповідає специфікації HTTP 1.1 для клієнтів та проксі-серверів (і явно їх вимагають деякі клієнти поруч Expires
). Розмір Pragma
специфікації HTTP 1.0 для доісторичних клієнтів. Показник Expires
HTTP 1.0 та 1.1 для клієнтів та проксі. У HTTP 1.1 Cache-Control
перевага має перевагу Expires
, тож, зрештою, це лише проксі-сервери HTTP 1.0.
Якщо вам не байдуже IE6 та його порушене кешування під час розміщення сторінок лише через HTTPS no-store
, ви можете пропустити Cache-Control: no-cache
.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Якщо ви не переймаєтесь клієнтами IE6 та HTTP 1.0 (HTTP 1.1 був запроваджений у 1997 році), ви можете пропустити Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Якщо ви також не переймаєтесь проксі-серверами HTTP 1.0, тоді можете пропустити Expires
.
Cache-Control: no-store, must-revalidate
З іншого боку, якщо сервер автоматично включає дійсний Date
заголовок, ви також можете теоретично пропустити Cache-Control
і покладатися Expires
лише на них.
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
Але це може вийти з ладу, якщо, наприклад, кінцевий користувач маніпулює датою операційної системи, а клієнтське програмне забезпечення покладається на неї.
Інші Cache-Control
параметри, такі як не max-age
мають значення, якщо вказані вищевказані Cache-Control
параметри. Last-Modified
Тема, включені в більшості інших відповідей тут тільки цікаво , якщо ви на справді хочете , щоб кешувати запит, так що вам не потрібно вказувати його взагалі.
Як його встановити?
Використання PHP:
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
Використання Java Servlet або 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.
Використання 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.
Використання веб-API 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());
Використання 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.
Використання 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";
Використання 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.
Використання Ruby on Rails або 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.
Використання 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.
Використання Python / Pyramid:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Використання 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.
Використання .htaccess
файлу 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>
Використання 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">
Мета-теги HTML проти заголовків відповідей HTTP
Важливо знати, що коли HTML-сторінка подається через HTTP-з'єднання, і заголовок присутній як у заголовках відповідей HTTP, так і в <meta http-equiv>
тегах HTML , то той, який вказаний у заголовку відповіді HTTP, матиме перевагу над метатегом HTML. Мета-тег HTML буде використовуватися лише тоді, коли сторінку переглядається з локальної дискової файлової системи через file://
URL-адресу. Див. Також специфікацію W3 HTML, розділ 5.2.2 . Будьте обережні, якщо веб-сервер не визначає їх програмно, оскільки веб-сервер може містити деякі значення за замовчуванням.
Як правило, вам краще просто не вказувати метатеги HTML, щоб уникнути плутанини перед початківцями та покладатися на жорсткі заголовки відповідей HTTP. Крім того, спеціально ці <meta http-equiv>
теги є недійсними в HTML5. Дозволені лише http-equiv
значення, вказані в специфікації HTML5 .
Перевірка фактичних заголовків відповідей HTTP
Щоб перевірити одне та інше, ви можете побачити / налагодити їх у моніторі трафіку HTTP набору інструментів розробника веб-браузера. Ви можете потрапити туди, натиснувши клавішу F12 у Chrome / Firefox23 + / IE9 +, а потім відкривши панель вкладок "Мережа" або "Мережа", а потім натиснувши HTTP-запит, що цікавить, щоб розкрити всю інформацію про запит та відповідь HTTP. Нижче скріншот від Chrome:
Я хочу встановити ці заголовки і для завантаження файлів
Перш за все, це питання та відповіді орієнтовані на "веб-сторінки" (HTML-сторінки), а не на "завантаження файлів" (PDF, zip, Excel тощо). Вам краще їх кешувати і використовувати якийсь ідентифікатор версії файлу десь на шляху URI або запиту рядка, щоб примусити повторне завантаження зміненого файлу. Застосовуючи ці заголовки без кешу для завантаження файлів, будьте остерігайтеся помилки IE7 / 8, коли обслуговуєте завантаження файлів через HTTPS замість HTTP. Детальніше див. IE не може завантажити foo.jsf. IE не зміг відкрити цей веб-сайт. Запитаний сайт або недоступний, або його неможливо знайти .