Как контролировать кэширование веб-страниц во всех браузерах? - PullRequest
1390 голосов
/ 08 сентября 2008

Наши исследования показали, что не все браузеры одинаково уважают директивы кеша http.

В целях безопасности мы не хотим, чтобы определенные страницы в нашем приложении кэшировались, когда-либо, веб-браузером. Это должно работать как минимум для следующих браузеров:

  • Internet Explorer 6 +
  • Firefox 1.5 +
  • Safari 3 +
  • Опера 9 +
  • Chrome

Наше требование было получено в результате проверки безопасности. После выхода из нашего веб-сайта вы можете нажать кнопку «Назад» и просмотреть кэшированные страницы.

Ответы [ 26 ]

2355 голосов
/ 15 января 2010

Введение

Правильный минимальный набор заголовков, который работает на всех упомянутых клиентах (и прокси):

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-сервлета или 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.

Использование 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()); 

Использование 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:

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.

Использование Apache .htaccess file:

<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 и тегах HTML <meta http-equiv>, то тот, который указан в Заголовок ответа HTTP будет иметь приоритет над метатегом HTML. Метатег HTML будет использоваться только при просмотре страницы из файловой системы локального диска по URL-адресу file://. Смотрите также W3 HTML спецификация глава 5.2.2 . Будьте осторожны, когда вы не указываете их программно, потому что веб-сервер может включать некоторые значения по умолчанию.

Как правило, лучше просто , а не указывать метатеги HTML, чтобы избежать путаницы со стороны начинающих, и полагаться на жесткие заголовки HTTP-ответов. Более того, именно эти теги <meta http-equiv> являются недействительными в HTML5. Разрешены только значения http-equiv, указанные в спецификации HTML5 .

Проверка фактических заголовков ответа HTTP

Для проверки того и другого вы можете увидеть / отладить их в мониторе HTTP-трафика набора инструментов разработчика веб-браузера. Для этого нажмите F12 в Chrome / Firefox23 + / IE9 +, а затем откройте панель вкладок «Сеть» или «Сеть», а затем щелкните интересующий HTTP-запрос, чтобы раскрыть все подробности о HTTP-запросе и ответе. ниже скриншот из Chrome:

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

Я хочу установить эти заголовки и при загрузке файлов

Прежде всего, этот вопрос и ответ нацелены на «веб-страницы» (HTML-страницы), а не на «загрузки файлов» (PDF, zip, Excel и т. Д.). Вам лучше кэшировать их и использовать некоторый идентификатор версии файла где-нибудь в пути URI или строку запроса, чтобы принудительно выполнить повторную загрузку измененного файла. В любом случае, применяя эти заголовки без кэширования к загрузке файлов, остерегайтесь ошибки IE7 / 8 при обработке загрузки файлов по HTTPS вместо HTTP. Подробнее см. IE не может загрузить foo.jsf. IE не смог открыть этот интернет-сайт. Запрашиваемый сайт либо недоступен, либо не найден .

224 голосов
/ 31 марта 2011

(всем, пожалуйста: не просто бездумно копируйте и вставляйте все заголовки, которые вы можете найти)

Прежде всего, История кнопки возврата - это , а не кеш :

Модель свежести (раздел 4.2) не обязательно применяется к механизмам истории. То есть механизм истории может отображать предыдущее представление, даже если срок его действия истек.

В старой спецификации HTTP формулировка была еще сильнее, явно указав браузерам игнорировать директивы кэша для истории кнопок возврата.

Предполагается, что Back возвращается во времени (ко времени, когда пользователь был вошел в систему). Он не переходит к ранее открытому URL.

Однако на практике кэш может влиять на кнопку возврата в очень специфических обстоятельствах:

  • Страница должна быть доставлена ​​через HTTPS , в противном случае эта очистка кэша не будет надежной. Кроме того, если вы не используете HTTPS, то ваша страница может быть украдена многими другими способами.
  • Вы должны отправить Cache-Control: no-store, must-revalidate (некоторые браузеры наблюдают no-store, а некоторые must-revalidate)

Вам никогда не нужно:

  • <meta> с заголовками кэша - это не работает вообще. Совершенно бесполезно.
  • post-check / pre-check - это директива только для IE, которая применяется только к кэшируемым ресурсам.
  • Отправка одного и того же заголовка дважды или десятком частей. Некоторые фрагменты PHP фактически заменяют предыдущие заголовки, в результате чего отправляется только последний.

Если хотите, вы можете добавить:

  • no-cache или max-age=0, что сделает ресурс (URL) устаревшим и потребует, чтобы браузеры проверили с сервером, существует ли более новая версия (no-store уже подразумевает, что это еще сильнее).
  • Expires с датой в прошлом для клиентов HTTP / 1.0 (хотя real клиентов только с HTTP / 1.0 полностью не существует в наши дни).

Бонус: Новый HTTP-кеширование RFC .

94 голосов
/ 29 августа 2013

Как указано в porneL, вам нужно не деактивировать кеш, а деактивировать буфер истории. В разных браузерах есть свои тонкие способы отключения буфера истории.

В Chrome (v28.0.1500.95 m) мы можем сделать это только Cache-Control: no-store.

В FireFox (v23.0.1) будет работать любой из них:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (только https)

  3. Pragma: no-cache (только https)

  4. Vary: * (только https)

В Opera (v12.15) мы можем сделать это только с помощью Cache-Control: must-revalidate (только https).

В Safari (v5.1.7, 7534.57.2) будет работать любой из них:

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

  2. Cache-Control: no-store (только https)

В IE8 (v8.0.6001.18702IC) будет работать любой из этих:

  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 (только https)

  7. Vary: * (только https)

Объединение вышесказанного дает нам решение, которое работает для Chrome 28, FireFox 23, IE8, Safari 5.1.7 и Opera 12.15: Cache-Control: no-store, must-revalidate (только https)

Обратите внимание, что https необходим, потому что Opera не деактивирует буфер истории для простых http-страниц. Если вы действительно не можете получить https и готовы игнорировать Opera, лучшее, что вы можете сделать, это:

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

Ниже показаны необработанные журналы моих тестов:

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="">
    Fail: Opera 12.15
    Успех: 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="">
    Fail: Opera 12.15
    Успех: 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: *
    Ошибка: Safari 5.1.7, Opera 12.15
    Успех: 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: *
    Ошибка: Safari 5.1.7, Opera 12.15
    Успех: 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="">
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: 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="">
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: 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="">
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: 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="">
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: IE8

  9. Cache-Control: no-store
    Ошибка: Safari 5.1.7, Opera 12.15
    Успех: Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Ошибка: Opera 12.15
    Успех: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: IE8

  12. Vary: *
    Ошибка: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Успех: нет

  13. Pragma: no-cache
    Ошибка: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Успех: нет

  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="">
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: 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="">
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: IE8

  16. Cache-Control: must-revalidate, max-age=0
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Успех: IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Ошибка: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Успех: нет

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Ошибка: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Успех: нет

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Сбой: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Успех: нет

  3. Vary: *
    Ошибка: Chrome 28, Safari 5.1.7, Opera 12.15
    Успех: FireFox 23, IE8

  4. Pragma: no-cache
    Ошибка: Chrome 28, Safari 5.1.7, Opera 12.15
    Успех: FireFox 23, IE8

  5. Cache-Control: no-cache
    Ошибка: Chrome 28, Safari 5.1.7, Opera 12.15
    Успех: FireFox 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Ошибка: Chrome 28, Safari 5.1.7, Opera 12.15
    Успех: FireFox 23, IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Ошибка: Chrome 28, Safari 5.1.7, Opera 12.15
    Успех: 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: *
    Ошибка: Chrome 28, Safari 5.1.7, Opera 12.15
    Успех: FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Ошибка: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Успех: Опера 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    Ошибка: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Успех: Опера 12.15

  11. Cache-Control: must-revalidate, max-age=0
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7
    Успех: 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="">
    Ошибка: Chrome 28, Safari 5.1.7
    Успех: 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="">
    Ошибка: Chrome 28, Safari 5.1.7
    Успех: FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Fail: Opera 12.15
    Успех: 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="">
    Fail: Opera 12.15
    Успех: 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="">
    Fail: Opera 12.15
    Успех: 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: *
    Ошибка: Chrome 28, Safari 5.1.7, Opera 12.15
    Успех: FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7,
    Успех: IE8, Opera 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7,
    Успех: IE8, Opera 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7,
    Успех: 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="">
    Ошибка: Chrome 28, FireFox 23, Safari 5.1.7,
    Успех: IE8, Opera 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Ошибка: Chrome 28, Safari 5.1.7
    Успех: FireFox 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    Ошибка: нет
    Успех: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15

32 голосов
/ 15 июня 2012

Я нашел маршрут web.config полезным (пытался добавить его к ответу, но, похоже, он не был принят, поэтому размещать здесь)

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

А вот способ Express / node.js сделать то же самое:

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();
});
25 голосов
/ 15 января 2010

Я обнаружил, что у всех ответов на этой странице все еще были проблемы. В частности, я заметил, что ни один из них не помешает IE8 использовать кэшированную версию страницы, когда вы открыли ее, нажав кнопку «назад».

После долгих исследований и испытаний я обнаружил, что мне действительно нужны были только два заголовка:

Cache-Control: нет магазина
Варьируется: *

Для объяснения заголовка Vary, проверьте http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

В IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 и Opera 9-10 эти заголовки вызывали запрос страницы с сервера при нажатии на ссылку на страницу, или поместите URL прямо в адресную строку. Это охватывает около 99% всех браузеров, используемых на январь '10.

В IE6 и Opera 9-10 нажатие кнопки «Назад» по-прежнему вызывало загрузку кэшированной версии. Во всех других браузерах, которые я тестировал, они получали свежую версию с сервера. До сих пор я не нашел ни одного набора заголовков, который бы заставлял эти браузеры не возвращать кэшированные версии страниц при нажатии кнопки «Назад».

Обновление: После написания этого ответа я понял, что наш веб-сервер идентифицирует себя как сервер HTTP 1.0. Заголовки, которые я перечислил, являются правильными для того, чтобы ответы от сервера HTTP 1.0 не кэшировались браузерами. Для сервера HTTP 1.1 посмотрите BalusC answer .

19 голосов
/ 08 сентября 2008

После небольшого исследования мы пришли к следующему списку заголовков, которые, похоже, покрывали большинство браузеров:

В ASP.NET мы добавили их, используя следующий фрагмент:

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 

Найдено из: http://forums.asp.net/t/1013531.aspx

8 голосов
/ 18 сентября 2008

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я настоятельно рекомендую прочитать ответ @ BalusC. Прочитав следующий учебник по кэшированию: http://www.mnot.net/cache_docs/ (я тоже рекомендую его прочитать), я считаю, что это правильно. Однако по историческим причинам (и потому, что я сам проверил это), я приведу свой оригинальный ответ ниже:

<ч />

Я попробовал «принятый» ответ для PHP, который мне не помог. Затем я провел небольшое исследование, нашел небольшой вариант, проверил его, и это сработало. Вот оно:

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');

Это должно сработать. Проблема заключалась в том, что при установке одной и той же части заголовка дважды, если false не отправляется в качестве второго аргумента функции заголовка, функция заголовка просто перезапишет предыдущий вызов header(). Таким образом, при установке Cache-Control, например, если вы не хотите помещать все аргументы в один вызов функции header(), он должен сделать что-то вроде этого:

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

См. Более полную документацию здесь .

8 голосов
/ 17 сентября 2008

Использование заголовка прагмы в ответе - сказка жены. RFC2616 определяет его только как заголовок запроса

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

7 голосов
/ 13 июня 2013

В IE6 есть ошибка

Содержимое с «Content-Encoding: gzip» всегда кэшируется, даже если вы используете «Cache-Control: no-cache».

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

Вы можете отключить сжатие gzip для пользователей IE6 (проверьте агент пользователя на наличие «MSIE 6»)

7 голосов
/ 19 мая 2016

Для ASP.NET Core создайте простой класс промежуточного программного обеспечения:

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: /32632/kak-kontrolirovat-keshirovanie-veb-stranits-vo-vseh-brauzerah
            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 );
    }
}

затем зарегистрируйте его с помощью Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

Убедитесь, что вы добавили это где-то после

app.UseStaticFiles();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...