Как запретить браузеру отдавать кэш на http запрос
Настольное приложение Internet Explorer 11 будет снято с службы поддержки 15 июня 2022 г. (список того, что имеется в области, см. в faq). Те же приложения и сайты IE11, которые вы используете сегодня, могут открываться в Microsoft Edge режиме Internet Explorer. Подробнее см. здесь.
Оригинальная версия продукта: Internet Explorer
Исходный номер КБ: 234067
Аннотация
С помощью Microsoft Internet Information Server (IIS) можно легко отметить высокостабильную или чувствительную страницу с помощью следующего сценария в крайнем начале определенных страниц ASP (ASP):
Истечение срока действия и заглавная дата истечения срока действия
Всегда используйте заглавную папку Expires, чтобы указать наиболее разумное время, когда определенный файл на сервере должен быть обновлен клиентом. При регулярном обновлении страниц наиболее эффективным является следующий период обновления. Возьмем, например, ежедневную страницу новостей в Интернете, которая обновляется каждый день в 5 утра. Веб-сервер для этой страницы новостей должен возвращать заготвка Expires со значением для 5 утра. на следующий день. После этого браузеру не нужно снова связываться с веб-сервером, пока страница не изменится.
Во многих случаях веб-серверы имеют одну или несколько волатильных страниц на сервере, которые содержат сведения, которые подлежат немедленному изменению. Эти страницы должны быть помечены сервером со значением "-1" для загона Expires. В случае будущих запросов пользователя Internet Explorer обычно обращается к веб-серверу для обновления этой страницы с помощью условного запроса If-Modified-Since. Однако страница остается в кэше диска (Временные файлы Интернета). И страница используется в соответствующих ситуациях без контакта с удаленным веб-сервером, например:
- когда кнопки BACK и FORWARD используются для доступа к истории навигации.
- когда браузер находится в автономном режиме.
Заглавная Cache-Control
Загон Pragma: No-Cache
Параметры сервера для кэшинга
Не стоит использовать этот заготвщик глобально на всем веб-сервере. Ограничить его использование исключительно контентом, который абсолютно не должен быть кэшным для клиента.
Контрольный список проблем
Если вы применяли методы в этой статье и у вас по-прежнему возникают проблемы с кэшингом и internet Explorer, просмотрите этот удобный контрольный список шаг за шагом, прежде чем обращаться в Корпорацию Майкрософт за технической поддержкой:
Порой, бывает необходимо запрещать браузеру кэшировать страницу, так как информация на ней обновляется каждый раз. Это может быть генерация данных, соответственно выбранным фильтрам или другой контент, который каждый раз создается по-новому. Одним словом, бывают моменты, когда необходимо запретить коварной программе кэшировать страницу. Сегодня, мы узнаем, как реализовать это разными способами, с помощью PHP или HTML или .htaccess.
Запрет кэширования страницы на HTML
Сделать это можно с помощью мета тегов. Сейчас мы разберем разные варианты запрета на кэширование.
Запрет на кэширование браузером и прокси-сервером
Запрет кэширования страницы, только браузером
Установка кэширования на определенное время, для браузера
С помощью кода ниже, мы можем сообщить браузеру, сколько хранить документ в кэше. После чего, кэш будет обновлен.
Установка кэширования на определенное время, для прокси-сервера
Практически, то же самое, что и в предыдущем коде, только указание стоит конкретно для прокси-сервера.
Запретить кэширование страницы с помощью PHP
Практически, все тоже самое, что в случае с HTML, только информацию будем выводить через header заголовки. Вот, как реализовать абсолютный запрет на кэш:
Также, можно разрешать кэшировать на определенное время. Например, разрешим кэширование только на 1 час.
Запретить кэширование страницы с помощью .htaccess
Для простоты реализации идеи, можно все сделать на уровне конфигураций сервера Apache. Перед этим, нам нужно убедиться в том, что необходимые модули находятся в рабочем состоянии. Открываем конфигурационный файл Apache и наблюдаем следующую картину:
Теперь в файле .htaccess, собственно запрещаем кэшировать выводимые данные. Как нам известно, .htaccess файл будет распространяться на директорию, в которой лежит, и на все субдиректории.
Важно заметить, что полный запрет кэширования, повышает нагрузку на сервер. Поэтому, играйтесь с этим осторожно! А лучше, установите определенное время, на которое можно кэшировать документы. Например, установим кэширование на 1 час:
Заключение
Это все известные для меня способы запрета на кэш. Если знаете что-то новенькое, просьба поделиться в комментариях. Надеюсь, статья была полезной, если это так, вас не затруднит поставить +1 и поделиться ею в социальных сетях.
Современные браузеры достаточно часто используют в своей работе локальный кэш. Что это означает? Это означает что браузер, получив от сервера html-документ, картинку или другой ресурс, размещает его в своем локальном кэше (проще говоря, записывает полученный ресурс на жесткий диск машины пользователя) и при последующих запросах к такому ресурсу не обращается на сервер, а получает ресурс из локального кеша.
Данная алгоритм работы браузеров резко повышает скорость загрузки html-документов. Так как если ресурс уже загружался, и как следствие расположен в локальном кэше, то время доступа определяется не пропускной способностью канала связи (например, модемного подключения) а скоростью работы жесткого диска.
Однако наряду с достоинствами данный метод так же порождает ряд проблем. В частности большинство начинающих web-программистов, при разработке динамических сайтов, сталкивается с одной и той же проблемой. Суть этой проблемы заключается в том, что вместо повторного обращения на сервер за страницей, запускающей на сервере скрипт, модифицирующий некую информацию, браузер обращается в локальный кэш. И в результате, например трех обращений, происходит не три модификации информации, расположенной на сервере, а только одна.
Для того, что бы заставить браузер каждый раз обращаться за страницей на сервер необходимо запретить браузеру заносить данный ресурс в кэш. Ниже приведены наиболее распространенные методы, запрещающие кэширование или позволяющие его обойти.
Генерация нового URL
Каждый раз результат такого запроса будет кэшироваться, но так как кэширование производится по всему url, то каждый раз будет получаться новый url и браузер будет вынужден запрашивать с сервера ресурс, так как url двух запросов не будут совпадать в точности.
Поля заголовков
Поле заголовка Expires
Значением данного заголовка является дата, после которой содержимое ресурса устареет. Если пользователь после этой даты обратиться к ресурсу, браузер должен запросить ресурс у сервера, а не из локального кэша.
Поле заголовка Last-Modified
Значением данного заголовка является дата последнего обновления ресурса. Большинство современных браузеров используют следующий алгоритм, если ресурс уже находится в локальном кэше:
Если ресурс, расположенный на сервере, содержит в данном поле текущую дату, то браузер будет каждый раз запрашивать ресурс с сервера, а не из локального кэша. Следующий листинг демонстрирует использование поля заголовка Last-Modified:
Поля заголовка Cache-Control и Pragma
по соображениям безопасности мы не хотим, чтобы определенные страницы в нашем приложении кэшировались,никогда, веб-браузером. Это должно работать по крайней мере для следующих браузеров:
- Internet Explorer 6+
- Firefox 1.5+
- сафари 3+
- Opera 9+
- Chrome
наши требование пришло из теста безопасности. После выхода с нашего сайта вы можете нажать кнопку "назад" и просмотреть кэшированные страницы.
правильный минимальный набор заголовков, который работает во всех упомянутых клиентов (и прокси):
с другой стороны, если сервер автоматически включает действительное Date заголовок, тогда вы можете теоретически опустить Cache-Control тоже и положиться на Expires только.
но это может не сработать, если, например, пользователь манипулирует датой операционной системы, и клиентское программное обеспечение полагается на нее.
использование сервлета Java или узла.js:
использование Ruby on Rails или Python/Flask:
Использование Python / Django:
Использование Python / Pyramid:
Использование Google Go:
(Эй, все: пожалуйста, не просто бездумно копировать и вставлять все заголовки, которые вы можете найти)
модель свежести (раздел 4.2) не обязательно применяется к механизмам истории. То есть механизм истории может отображать предыдущее представление, даже если оно истекло.
Back должен вернуться во времени (к тому времени, когда пользователь был logged in). Он не переходит к ранее открытому URL-адресу.
вы никогда надо:
- <meta> с заголовками кэша - он вообще не работает. Абсолютно бесполезный.
- post-check / pre-check - это директива IE-only, которая применяется только к cachable ресурсы.
- отправка одного и того же заголовка дважды или в дюжине частей. Некоторые фрагменты PHP фактически заменяют предыдущие заголовки, в результате чего отправляется только последний.
если вы хотите, вы можете добавить:
как заявил porneL, вы хотите не деактивировать кэш, а деактивировать буфер истории. Различные браузеры имеют свои собственные тонкие способы отключения буфера истории.
в Chrome (v28.0.1500.95 м) мы можем сделать это только Cache-Control: no-store .
в FireFox (v23.0.1) любой из них будет работать:
в Safari (v5.1.7, 7534.57.2) любой из них будет работать:
Cache-Control: no-store
<body onunload=""> в html
In IE8 (v8.0.6001.18702 IC) любой из них будет работать:
Cache-Control: must-revalidate, max-age=0
Cache-Control: must-revalidate
Expires: 0
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
ниже показаны необработанные журналы моего тесты:
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
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
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Fail: Safari 5.1.7, Opera 12.15
успех: Chrome 28, FireFox 23, IE8
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: *
Fail: Safari 5.1.7, Opera 12.15
Успех: Chrome 28, FireFox 23, ИЕ8
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
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
успех: ИЕ8
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
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
успех: ИЕ8
Cache-Control: no-store
Fail: Safari 5.1.7, Opera 12.15
успех: Chrome 28, FireFox 23, IE8
Cache-Control: no-store
<body onunload="">
Fail: Opera 12.15
успех: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: no-cache
Сбой: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
успех: ИЕ8
Vary: *
сбой: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
успех: ничего
Pragma: no-cache
сбой: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
успех: ничего
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
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
Cache-Control: must-revalidate, max-age=0
Сбой: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
успех: ИЕ8
Cache-Control: must-revalidate
Expires: 0
Сбой: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
успех: IE8
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
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
успех: ничего
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
успех: ничего
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, Сафари 5.1.7, Опера 12.15
успех: ничего
Vary: *
Сбой: Chrome 28, Safari 5.1.7, Opera 12.15
успех: FireFox 23, IE8
Pragma: no-cache
Сбой: Chrome 28, Safari 5.1.7, Opera 12.15
успех: FireFox 23, IE8
Cache-Control: no-cache
Сбой: Chrome 28, Safari 5.1.7, Opera 12.15
успех: FireFox 23, IE8
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
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, ИЕ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
Cache-Control: must-revalidate
сбой: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Успех: Опера 12.15
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
<body onunload="">
сбой: Chrome 28, FireFox 23, IE8, Сафари 5.1.7
Успех: Опера 12.15
Cache-Control: must-revalidate, max-age=0
Сбой: Chrome 28, FireFox 23, Safari 5.1.7
успех: IE8, Opera 12.15
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
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
Cache-Control: no-store
Fail: Opera 12.15
успех: Chrome 28, FireFox 23, IE8, Safari 5.1.7
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
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
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
Cache-Control: must-revalidate
Expires: 0
Сбой: Chrome 28, FireFox 23, Safari 5.1.7,
успех: IE8, Opera 12.15
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
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
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
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
Cache-Control: no-store, must-revalidate
Fail: нет
успех: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Я нашел в интернете.config route полезен (пытался добавить его в ответ, но, похоже, не был принят, поэтому разместите здесь)
и вот экспресс / узел.JS способ сделать то же самое:
после долгих исследований и тестирования я обнаружил, что мне действительно нужны только два заголовка:
на IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 и Opera 9-10, эти заголовки заставили страницу запрашиваться с сервера при нажатии на ссылку на страницу или поместить URL-адрес непосредственно в адресной строке. Это охватывает около 99% всех браузеров, используемых с января ' 10.
после небольшого исследования, мы придумали следующий список заголовков, которые, казалось, покрывали большинство браузеров:
- истекает: Пн, 26 июля 1997 05:00: 00 GMT
- Кэш-Контроля: нет-кэш, частного, должен-revalidate, max-stale=0, post-check=0, pre-check=0 no-store
- Прагма: нет-кэш
использование заголовка pragma в ответе-это история жен. RFC2616 определяет его только как заголовок запроса
я попробовал "принятый" ответ для PHP, который не работал для меня. Затем я провел небольшое исследование, нашел небольшой вариант, протестировал его и это сработало. Вот это:
это должно сработать. Проблема заключалась в том, что при установке одной и той же части заголовка дважды, если false не отправляется в качестве второго аргумента функции заголовка, функция заголовка просто перезапишет предыдущий header() звонок. Итак, при установке Cache-Control , например, если вы не хотите помещать все аргументы в один header() вызов функции, он должен сделать что-то вроде этого:
посмотреть более полную документацию здесь.
в IE6 есть ошибка
содержимое с "Content-Encoding: gzip" всегда кэшируется, даже если вы используете "Cache-Control: no-cache".
вы можете отключить сжатие gzip для пользователей IE6 (проверьте агент пользователя для "MSIE 6")
эти директивы не уменьшают никакой риск для безопасности. Они действительно предназначены для того, чтобы заставить UA обновлять изменчивую информацию, а не удерживать UA от сохранения информации. См.этот же вопрос. По крайней мере, нет никакой гарантии, что все маршрутизаторы, прокси и т. д. также не будет игнорировать директивы кэширования.
на более положительной ноте, политики в отношении физического доступа к компьютерам, установки программного обеспечения и тому подобное поставят вам мили опережает большинство фирм в плане безопасности. Если потребители этой информации являются представителями общественности, единственное, что вы действительно можете сделать, это помочь им понять, что как только информация попадает на их машину, эта машина их ответственность, не твоя.
на документация PHP для функции заголовка имеет довольно полный пример (предоставлено третьим лицом):
Если вы столкнулись с проблемами загрузки с IE6-IE8 через SSL и cache:no-cache header (и аналогичные значения) с файлами MS Office,вы можете использовать cache: private, no-store header и return file по запросу POST. Это работает.
в моем случае я исправляю проблему в chrome с помощью этого
где мне нужно очистить содержимое данных формы previus, когда пользователи нажимают кнопку назад по соображениям безопасности
затем зарегистрировать его в Startup.cs
убедитесь, что вы добавить это где-то после
У меня были лучшие и наиболее последовательные результаты во всех браузерах, установив Pragma: no-cache
принятый ответ, похоже, не работает для IIS7+, учитывая большое количество вопросов о заголовках кэша, которые не отправляются в II7:
принятый ответ Правильный, в котором заголовки должны быть установлены, но не в том, как они должны быть установлены. Этот способ работает с IIS7:
первая строка задает Cache-control to no-cache , а вторая строка добавляет другие атрибуты no-store, must-revalidate
кроме того, просто для хорошей меры, убедитесь, что вы сбросили ExpiresDefault в своем .htaccess файл, если вы используете это для включения кэширования.
после этого вы можете использовать ExpiresByType установить конкретные значения для файлов, которые вы хотите кэшировать:
это также может пригодиться, если ваши динамические файлы, например php и т. д. кэшируются браузером, и вы не можете понять, почему. Проверка ExpiresDefault .
Читайте также: