Когда мы отправляем на сервер запрос одной и той же структуры и с одними и теми же параметрами, он кешируется, поэтому когда нам нужно запросить новую порцию данных по этому же 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 побежден.
Большое спасибо!
Подскажите от чего может не работать флеш в 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 не забыли ?
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»);