Борьба с cache Flash’a в Internet Explorer

Когда мы отправляем на сервер запрос одной и той же структуры и с одними и теми же параметрами, он кешируется, поэтому когда нам нужно запросить новую порцию данных по этому же url, браузер говорит flash, что эти данные у него уже есть и запроса на сервер не делает. Это относительно распространенная проблема с кешированием в Internet Explorer. У меня она возникла при написании чата, требования к чату были такими, что можно было использовать только flash (только он помогает победить same-origin-policy), нужно было отправлять запросы к домену отличному от текущего. Подробнее о чате напишу как-нибудь в другой раз, про все эти политики безопасности и ограничения, и что предлагает flash для решения этих проблем. Итак, как исправлять ?!

Flash.

Решение в принципе лежит на поверхности, подобным пользуются не только в flash, это распространенный способ избежать кеширования в браузере. Мы просто добавляем уникальный параметр в запрос. В данном примере я использую timestamp через метод класса Date() — date.getTime(), который передаю в качестве параметра key в запросе.


var request:URLRequest = new URLRequest("http://domain.ru/chat_receive.php");
var variables:URLVariables = new URLVariables();
 var date:Date = new Date();
 variables.key = date.getTime();

 request.data = variables;
 request.method = URLRequestMethod.GET;

Важно передавать параметры через URLVariables, первый раз я просто добавил параметры прямо в строку url «http://domain.ru/chat_receive.php», почему-то IE это не очень понравилось, и он все равно все успешно кешировал.

Back-end.

Теперь делаем фикс на back-end, у меня это PHP, но реализации для других языков отличается не существенно. Зачем мы это делаем ? Способ который помог избежать проблемы, не отключает кеширование, то есть информация все равно попадает в кеш, и теперь ее на порядки больше. Для того чтобы не забивать кеш браузера, мы ставим в заголовок параметр Expires. А также отдаем в заголовке параметры, что кешировать не надо (в отличие от других браузеров ie этого не слушается, для этого мы и передавали уникальный параметр). Вот что у нас получилось:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // disable IE caching
 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("Pragma: no-cache"); // HTTP/1.0

Все Internet Explorer побежден.

4 thoughts on “Борьба с cache Flash’a в Internet Explorer

  1. Подскажите от чего может не работать флеш в IE еще.
    Ваше решение не помогло((
    php генерит файл отдает его флешу
    заголовки следующие
    while(ob_get_contents()) ob_end_clean();
    header(«Content-Type: text/xml; charset=UTF-8;»);
    echo $xml;
    exit();

    вставлял ваше решение после Content-Type.
    А в остальных браузерах все в порядке

    • В вашем коде я вижу только 1 заголовок, а зачем вы трогаете буфер вывода ? Просто поставьте все заголовки из примера, и кеша не будет. Какая версия IE, не 9я ? В ней не тестировал во всех остальных не кешируется.
      Можно проверить посылаются ли правильные заголовки установив какой-нибудь прокси пакетов.
      А про добавления уникального параметра в самом flash не забыли ?

  2. header(«Expires: Mon, 26 Jul 1997 05:00:00 GMT»); // disable IE caching
    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(«Pragma: no-cache»); // HTTP/1.0

    Зачем так много текста? Достаточно всего одной строчки:
    header(«Cache-Control: no-store, no-cache, must-revalidate»);

Comments are closed.