Chrome кэширует запрос HTTP PUT

у меня есть эта странная проблема с Chrome. Он довольно часто появляется для кэширования запросов PUT.

Детали: у меня есть приложение с использованием магистрали.js и при попытке сохранить некоторые изменения в модели (магистраль автоматически генерирует запрос PUT), Chrome просто не отправит этот запрос на сервер. Он отлично работает в Firefox и IE (до сих пор не видел проблему в Safari).

вот скриншот из вкладки сети инструментов разработчика Chrome. Как вы можете видеть, что ответ на запрос PUT возвращается из кэша (запрос не попадает на сервер!!) Chrome caches PUT request

вот скриншот подробностей заголовка этого же запроса. Еще раз, очевидно, что Chrome не беспокоит отправку запроса PUT на сервер. Chrome cached PUT request header

полезных данных запрос данных JSON. Любые мысли о том, почему это происходит / что я делаю неправильно?

обновление: хром подтвердил, что это действительно ошибка на его конце (спасибо Яна Hančič).

ВРЕМЕННОЕ РЕШЕНИЕ Я закончил переопределение Backbone.sync метод и добавление метки времени в строку запроса запросов PUT, POST и DELETE, чтобы они всегда были уникальными:

if(!options.data && model && (method == 'create' || method == 'update' || method == 'delete')) {
    params.url += (params.url.indexOf('?') == -1 ? '?' : '&') + '_=' + new Date().getTime();
}

2 ответов


Я использую дополнительный параметр, чтобы избежать кэширования:

url += '?_dc=' + Math.random().toFixed(20).replace('.', '');

Я не интерпретирую этот параметр на стороне сервера.

EDIT: помимо chrome есть много вещей, которые могут кэшировать запросы-например, прокси-сервер пользователя. Я думаю, что дополнительный параметр запроса-хорошее решение для предотвращения кэширования.


Backbone используйте jQuery или Zepto, чтобы сделать запрос AJAX. Предполагая, что вы используете jQuery, установите кэш.

запустите это, чтобы установить кэш в общем приложении, так что вам не нужно будет беспокоиться о кэше:

$.ajaxSetup({
      cache : false
});

Если сохранение кэша важно для вашего бизнеса, я думаю, что вы могли бы сделать что-то подобное для конкретных вызовов кэша:

model.save({}, {cache:false});