Случайная Querystring, чтобы избежать кэширования IE

Хорошо известно, что IE кэширует слишком много html, даже когда вы указываете заголовок Cache-Control: no-cache или Last-Modified на каждую страницу.

Это поведение действительно вызывает беспокойство при работе с querystrings для получения динамической информации, поскольку IE считает, что это одна и та же страница (например: http://example.com/?id=10) и обслуживает кешированную версию.

Я решил это добавить либо случайное число, либо timestring к querystring (как другие сделали), как это http://example.com/?id=10&t=2009-08-06_13:12:56, что я просто игнорирую serveride.

Есть ли лучший вариант? Есть ли другой, более чистый способ сделать это? Я знаю, что POST не кэшируется, но семантически корректно использовать GET здесь.

Ответ 1

Итак, в конце концов, единственный надежный способ сделать это (благодаря IE6) - использовать random, или привязка к времени Строка запроса.

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

Если у вас есть a стандарт совместимый браузер, вы можете избежать использования только ETags.

Ответ 2

Предполагая, что вы используете jQuery, вместо использования $.get или $.getJson используйте более общий $.ajax и явно установите значение кеша в значение false. Ниже приведен пример:

$.ajax({
        url: "/Controller/Action",
        cache: false,
        type: "GET",
        dataType: "json",
        success: function(data, textStatus) {
                         alert("success");
                 }
    });

Требуется немного больше кода (не так много), чем использование .getJson или .get, но решит проблему без добавления случайных чисел.

Ответ 3

Вы также можете использовать текущее время Unix в миллисекундах, чтобы избежать проблемы с множеством запросов за одну секунду (у него гораздо меньше шансов иметь несколько запросов за одну миллисекунду)

var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime();

Ответ 4

Использование случайного числа (не временной метки) в строке запроса или фактическое изменение имени файла - это два рекомендуемых метода. Стив Соудерс и YAHOO! группа эффективности опубликовала массу полезной информации и практик, которые они обнаружили и разработали, оптимизируя один из самых популярных в мире свойств.

Ответ 5

У меня такая же проблема, но будьте осторожны, через одну секунду может быть много запросов. Вот почему я использую это:

$.getJSON("http://server/example?param=value&dummy=" + Math.random(), ...);

Ответ 6

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

Я не уверен, что такое поведение IE, но с последними версиями он должен работать.

См. также Раздел HTTP RFC в ETag