http - пример - кэширование в браузере




Как управлять кэшированием веб-страниц во всех браузерах? (18)

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

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

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Хром

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


Вступление

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

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.

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

response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response.headers["Pragma"] = "no-cache" # HTTP 1.0.
response.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')
    )
)

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

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

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

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

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

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

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


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

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

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

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

Возврат должен возвращаться во времени (до момента входа пользователя в систему). Он не перемещается вперед к ранее открытому URL-адресу.

Однако на практике кеш может влиять на кнопку «Назад» в особых обстоятельствах:

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

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

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

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

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

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


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

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

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

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


Для 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://.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();

Если вы столкнулись с проблемами с загрузкой IE6-IE8 через SSL и кеш: заголовок no-cache (и аналогичные значения) с файлами MS Office, вы можете использовать кеш: закрытый, не хранить заголовок и возвращать файл по запросу POST. Оно работает.


Заголовки в ответе, предоставленные BalusC, не мешают Safari 5 (и, возможно, более старым версиям) отображать содержимое из кеша браузера при использовании кнопки возврата браузера. Способ предотвращения этого заключается в том, чтобы добавить к тегу body пустой атрибут обработчика события onunload:

<body onunload=""> 

Этот хак, по-видимому, ломает кеш обратно-назад в Safari: есть ли кросс-браузерное событие onload при нажатии кнопки «Назад»?


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

В Chrome (v28.0.1500.95 м) мы можем сделать это только с помощью 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


Настройка измененного http-заголовка на некоторую дату в 1995 году обычно делает трюк.

Вот пример:

Expires: Wed, 15 Nov 1995 04:58:08 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Cache-Control: no-cache, must-revalidate

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

В 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


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

  • Что-то вызывает реакцию на кеш-контроль: частный в IIS7
  • IIS7: настройка кеша не работает ... почему?
  • IIS7 + ASP.NET MVC-кеширование кэшей заголовков не работает
  • Установить кеш-контроль для страниц aspx
  • Cache-control: no-store, must-revalidate не отправляется браузеру клиента в IIS7 + ASP.NET MVC

И так далее

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

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

Первая строка устанавливает Cache-controlдля no-cache, а вторая строка добавляет другие атрибутыno-store, must-revalidate


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

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


Я нашел полезный маршрут 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();
});

в моем случае я исправляю проблему в хром с этим

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

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


См. Эту ссылку на пример из кэширования:

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

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


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


Для завершения BalusC -> answer Если вы используете 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, браузеры игнорировали их и кэшировали страницу.


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

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

    import web
    import sys
    import PERSONAL-UTILITIES

    myname = "main.py"

    urls = (
        '/', 'main_class'
    )

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

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

    class main_class(object):
        def GET(self):
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return 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("Expires", "0")
            return render.index_laid_out(greeting = msg + form.function)

    if __name__ == "__main__":
        nargs = len(sys.argv)
        # Ensure that there are enough arguments after python program name
        if nargs != 2:
            LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs)
        # Make sure that the TCP port number is numeric
        try:
            tcp_port = int(sys.argv[1])
        except Exception as e:
            LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1])
        # All is well!
        JUST-LOG("%s: Running on port %d", myname, tcp_port)
        web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port))
        main.run()


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

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




http-headers