Как отключить Ajax-кеширование в браузере Safari? - PullRequest
10 голосов
/ 30 марта 2012

У меня проблема с кэшированием ajax. Это также было проблемой в браузере IE, но я исправил ее, написав следующий код.

    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("expires","-1");
    response.setHeader("pragma","no-cache");

Но я вижу, что Safari4.0 на MAC кэширует запрос Ajax (у нас есть требование для поддержки этого).Огонь Фокса никогда не проблема.Что касается этого «Expire», я устанавливаю его на -1, я вижу много мест, где ему установлено 0, или какую-то старую дату из прошлого.Будет ли это иметь значение?

Ответы [ 3 ]

13 голосов
/ 30 марта 2012

Отправьте дополнительный параметр с вашим запросом GET, который никогда не будет прежним, например, текущую метку времени.Что-то вроде:

url = url + '&nocache=' + new Date().getTime();

Это предотвратит кеширование.

3 голосов
/ 30 марта 2012

Во-первых, заметка в заголовке Expires. В вашем вопросе не указано, какую серверную платформу вы используете, поэтому я не уверен, применимо ли это. Однако, похоже, вы отправляете неверный заголовок Expires.

RFC требует, чтобы Expires была датой , однако вы, похоже, устанавливаете заголовок на литерал "-1". Существует множество платформ, которые имеют свойство expires в своем объекте ответа HTTP, который принимает целое число и автоматически вычисляет дату, равную этому количеству секунд с этого момента.

Используйте инспектор HTTP , чтобы убедиться, что ваш сервер отправляет корректно отформатированную дату, а не -1 в заголовке Expires.


Вы можете попытаться сделать заголовок Cache-Control более строгим:

response.setHeader("Cache-Control", "private, no-cache, no-store, must-revalidate");

must-revalidate говорит кешам, что они должны подчиняться любой информации о свежести, которую вы им предоставляете. HTTP позволяет кешам обслуживать устаревшие представления в особых условиях; указав этот заголовок, вы сообщаете кешу, что хотите, чтобы он строго следовал вашим правилам. [1]

1 голос
/ 30 марта 2012

Согласно RFC 2616 раздел 9.5 о POST

   Responses to this method are not cacheable, unless the response
   includes appropriate Cache-Control or Expires header fields. However,
   the 303 (See Other) response can be used to direct the user agent to
   retrieve a cacheable resource.

Таким образом, браузер не должен кэшировать ответы POST, если в ответе не указано иное. В то же время браузеры могут кэшировать ответы GET, если в ответе не указано иное. Таким образом, для запросов, которые не должны кэшироваться , таких как запросы AJAX, POST является предпочтительным методом.

Если вы по какой-либо причине не хотите использовать POST для AJAX, вы должны использовать трюк , упомянутый minitech , на самом деле он широко используется для принудительного использования браузера загрузить текущую версию любого ресурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...