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

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

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

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Chrome

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

1411
задан Peter Mortensen 25 June 2019 в 21:57
поделиться

9 ответов

У меня были лучшие и самые последовательные результаты через все браузеры установкой Pragma: без кэшей

4
ответ дан petr k. 25 June 2019 в 21:57
поделиться

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

3
ответ дан Harry 25 June 2019 в 21:57
поделиться

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

    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);
6
ответ дан Community 25 June 2019 в 21:57
поделиться

Установка измененного 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
6
ответ дан Anders Sandvig 25 June 2019 в 21:57
поделиться

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

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

8
ответ дан Dave Cheney 25 June 2019 в 21:57
поделиться

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

Управление Кэша: без кэшей

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

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

Это, как также предполагается, работает на браузеры HTTP 1.1.

6
ответ дан Chris Dail 25 June 2019 в 21:57
поделиться

ПРАВОВАЯ ОГОВОРКА: Я настоятельно рекомендую читать ответ @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
ответ дан Steven Oxley 25 June 2019 в 21:57
поделиться

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

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

6
ответ дан Community 25 June 2019 в 21:57
поделиться

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

В 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

20
ответ дан Edward Wilde 25 June 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: