Подтвердить что ты не робот

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

У меня есть эта странная проблема с Chrome. Часто не хватает кэширования запросов PUT.

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

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

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

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

ОБНОВЛЕНИЕ: Chromium подтвердил, что это действительно ошибка в конце (спасибо Ян Ханчич).

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

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

Ответ 1

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

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

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

РЕДАКТИРОВАТЬ: Помимо хрома, многие вещи могут кэшировать запросы - например, пользовательский прокси-сервер. Я думаю, что дополнительный параметр запроса является хорошим решением для предотвращения кэширования.

Ответ 2

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

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

$.ajaxSetup({
      cache : false
});

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

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