Случайная Querystring, чтобы избежать IE кеширования - PullRequest
10 голосов
/ 05 августа 2009

Это хорошо известная проблема, что IE кеширует слишком много html, даже когда дает заголовок Cache-Control: no-cache или Last-Modified для каждой страницы.

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

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

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

Ответы [ 6 ]

11 голосов
/ 20 ноября 2009

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

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

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

6 голосов
/ 05 августа 2009

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

var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime();
2 голосов
/ 24 августа 2009

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

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

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

2 голосов
/ 05 августа 2009

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

0 голосов
/ 05 августа 2009

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

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

См. Также раздел HTTP RFC на ETag

.
0 голосов
/ 05 августа 2009

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

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