Как мы контролируем кэширование веб-страниц во всех браузерах?

http caching https http-headers

848784 просмотра

26 ответа

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

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

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Опера 9+
  • Хром

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

Автор: Edward Wilde Источник Размещён: 01.09.2019 04:04

Ответы (26)


2408 плюса

Решение

Вступление

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

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.

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

Монитор HTTP-трафика набора инструментов разработчика Chrome, показывающий заголовки ответа HTTP на stackoverflow.com

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

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

Автор: BalusC Размещён: 14.01.2010 11:50

233 плюса

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

Прежде всего, история кнопки «Назад» не является кешем :

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

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

Назад должна вернуться назад во времени (к тому времени , когда пользователь был в системе). Он не перемещается вперед к ранее открытому 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 (хотя настоящие клиенты только с HTTP / 1.0 полностью отсутствуют в наши дни).

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

Автор: Kornel Размещён: 30.03.2011 11:08

94 плюса

Как сказал 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="">
    Ошибка: 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="">
    Ошибка: 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
    Успех: Opera 12.15

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

Автор: Pacerier Размещён: 29.08.2013 04:50

35 плюса

Я нашел маршрут 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();
});
Автор: Joseph Connolly Размещён: 15.06.2012 02:40

25 плюса

Я обнаружил, что у всех ответов на этой странице все еще были проблемы. В частности, я заметил, что ни один из них не помешает 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 .

Автор: Chris Vasselli Размещён: 14.01.2010 11:35

20 плюса

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

В 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

Автор: Edward Wilde Размещён: 08.09.2008 12:11

8 плюса

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

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

Автор: Dave Cheney Размещён: 17.09.2008 02:18

8 плюса

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я настоятельно рекомендую прочитать ответ @ 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);

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

Автор: Steven Oxley Размещён: 18.09.2008 10:36

7 плюса

Эти директивы не снижают риск для безопасности. Они действительно предназначены для того, чтобы заставить UA обновлять изменчивую информацию, а не удерживать UA от сохранения информации. Смотрите этот похожий вопрос . По крайней мере, нет никакой гарантии, что любые маршрутизаторы, прокси и т. Д. Также не будут игнорировать директивы кэширования.

С другой стороны, политика в отношении физического доступа к компьютерам, установки программного обеспечения и т. П. Позволит вам значительно опередить большинство компаний в плане безопасности. Если потребители этой информации являются представителями общественности, единственное, что вы действительно можете сделать, это помочь им понять, что как только информация попадает на их машину, эта машина становится их ответственностью, а не ваша.

Автор: Dustman Размещён: 19.09.2008 03:08

7 плюса

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

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

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

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

Автор: Edson Medina Размещён: 13.06.2013 03:23

7 плюса

Для 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: 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 );
    }
}

затем зарегистрируйте его Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

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

app.UseStaticFiles();
Автор: kspearrin Размещён: 19.05.2016 07:55

6 плюса

В RFC для HTTP 1.1 говорится, что правильный метод - добавить заголовок HTTP для:

Cache-Control: без кеша

Старые браузеры могут игнорировать это, если они не соответствуют должным образом HTTP 1.1. Для тех, кто может попробовать заголовок:

Прагма: без кеша

Это также должно работать для браузеров HTTP 1.1.

Автор: Chris Dail Размещён: 08.09.2008 12:14

6 плюса

Установка модифицированного заголовка http на некоторую дату в 1995 году обычно делает свое дело.

Вот пример:

Истекает: ср, 15 ноября 1995 04:58:08 GMT
Дата последнего изменения: среда, 15 ноября 1995 г. 04:58:08 GMT
Cache-Control: без кеша, обязательна повторная проверка
Автор: Anders Sandvig Размещён: 08.09.2008 12:10

6 плюса

В документации по PHP для функции header есть довольно полный пример (предоставленный третьей стороной):

    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);
Автор: Grey Panther Размещён: 08.09.2008 12:19

6 плюса

If you're facing download problems with IE6-IE8 over SSL and cache:no-cache header (and similar values) with MS Office files you can use cache:private,no-store header and return file on POST request. It works.

Автор: Albert Размещён: 21.09.2012 09:02

6 плюса

in my case i fix the problem in chrome with this

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

where i need to clear the content of a previus form data when the users click button back for security reasons

Автор: user2321638 Размещён: 19.06.2013 05:28

4 плюса

I've had best and most consistent results across all browsers by setting Pragma: no-cache

Автор: petr k. Размещён: 17.09.2008 12:32

4 плюса

The headers in the answer provided by BalusC does not prevent Safari 5 (and possibly older versions as well) from displaying content from the browser cache when using the browser's back button. A way to prevent this is to add an empty onunload event handler attribute to the body tag:

<body onunload=""> 

This hack apparently breaks the back-forward cache in Safari: Is there a cross-browser onload event when clicking the back button?

Автор: Tobias Размещён: 23.04.2011 09:24

4 плюса

The accepted answer does not appear to work for IIS7+, going by the large number of questions about cache headers not being sent in II7:

And so on

The accepted answer is correct in which headers must be set, but not in how they must be set. This way works with IIS7:

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

The first line sets Cache-control to no-cache, and the second line adds the other attributes no-store, must-revalidate

Автор: JK. Размещён: 18.03.2014 12:45

4 плюса

Кроме того, просто для правильной меры, убедитесь, что вы сбросили ExpiresDefaultв своем .htaccessфайле, если вы используете это для включения кэширования.

ExpiresDefault "access plus 0 seconds"

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

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

Это также может пригодиться, если ваши динамические файлы, например php и т. Д., Кэшируются браузером, и вы не можете понять, почему. Проверьте ExpiresDefault.

Автор: Obinwanne Hill Размещён: 19.08.2016 08:47

3 плюса

В дополнение к заголовкам рассмотрите возможность обслуживания вашей страницы через https . Многие браузеры не будут кэшировать https по умолчанию.

Автор: Harry Размещён: 19.11.2008 08:31

3 плюса

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

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>
Автор: yongfa365 Размещён: 06.02.2013 08:52

2 плюса

Для завершения BalusC -> ОТВЕТ. Если вы используете perl, вы можете использовать CGI для добавления заголовков HTTP.

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

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

Примечание: когда я пытался использовать html META, браузеры игнорировали их и кэшировали страницу.

Автор: Carlos Escalera Alonso Размещён: 13.02.2014 12:12

0 плюса

Я просто хочу отметить, что если кто-то хочет запретить кэширование ТОЛЬКО динамического контента, добавление этих дополнительных заголовков должно производиться программно.

Я отредактировал файл конфигурации моего проекта, добавив заголовки без кэширования, но это также отключило кэширование статического содержимого, что обычно нежелательно. Изменение заголовков ответов в коде гарантирует, что изображения и файлы стилей будут кэшироваться.

Это совершенно очевидно, но все же стоит упомянуть.

И еще одно предупреждение. Будьте осторожны, используя метод ClearHeaders из класса HttpResponse. Это может привести к ушибам, если вы будете использовать это безрассудно. Как будто это дало мне.

После перенаправления на событие ActionFilterAttribute последствия очистки всех заголовков теряют все данные сеанса и данные в хранилище TempData. Во время перенаправления безопаснее перенаправлять из действия или не очищать заголовки.

На второй мысли я отговариваю всех использовать метод ClearHeaders. Заголовки лучше убирать отдельно. И чтобы правильно установить заголовок Cache-Control, я использую этот код:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Автор: user3253726 Размещён: 20.05.2014 12:35

0 плюса

Мне не повезло с <head><meta>элементами. Добавление параметров, связанных с HTTP-кешем напрямую (вне HTML-документа), действительно работает для меня.

Пример кода на Python с использованием web.headerвызовов web.py приведен ниже. Я намеренно отредактировал свой личный ненужный служебный код.

    импортировать веб
    импорт системы
    импорт ЛИЧНЫЕ КОММУНАЛЬНЫЕ ПРЕДПРИЯТИЯ

    myname = "main.py"

    URL = (
        '/', 'main_class'
    )

    main = web.application (urls, globals ())

    render = web.template.render ("templates /", base = "layout", cache = False)

    Класс main_class (объект):
        def GET (self):
            web.header («Cache-control», «no-cache, no-store, must-revalidate»)
            web.header ("Pragma", "no-cache")
            web.header («Истекает», «0»)
            вернуть render.main_form ()

        def POST (self):
            msg = "POSTed:"
            form = web.input (function = None)
            web.header («Cache-control», «no-cache, no-store, must-revalidate»)
            web.header ("Pragma", "no-cache")
            web.header («Истекает», «0»)
            return render.index_laid_out (приветствие = msg + form.function)

    if __name__ == "__main__":
        nargs = len (sys.argv)
        # Убедитесь, что после имени программы Python достаточно аргументов
        если наргс! = 2
            LOG-AND-DIE ("% s: ошибка командной строки, nargs =% s, должно быть 2", myname, nargs)
        # Убедитесь, что номер порта TCP числовой
        пытаться:
            tcp_port = int (sys.argv [1])
        кроме исключения как e:
            LOG-AND-DIE («% s: tcp_port = int (% s) не удалось (не целое число)», мое имя, sys.argv [1])
        # Все хорошо!
        JUST-LOG ("% s: работает на порте% d", myname, tcp_port)
        web.httpserver.runsimple (main.wsgifunc (), ("localhost", tcp_port))
        main.run ()

Автор: Richard Elkins Размещён: 10.08.2016 10:11

0 плюса

Посмотрите эту ссылку на пример кеширования:

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

Резюме, согласно статье, Cache-Control: no-storeработает только на Chrome, Firefox и IE. IE принимает другие элементы управления, а Chrome и Firefox - нет. Ссылка представляет собой хорошее чтение с историей кеширования и документальным подтверждением концепции.

Автор: Paul Размещён: 03.07.2014 02:51
Вопросы из категории :
32x32