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();
}
Ответы
Ответ 1
Я использую дополнительный параметр, чтобы избежать кеширования:
url += '?_dc=' + Math.random().toFixed(20).replace('.', '');
Я не интерпретирую этот параметр на стороне сервера.
РЕДАКТИРОВАТЬ: Помимо хрома, многие вещи могут кэшировать запросы - например, пользовательский прокси-сервер. Я думаю, что дополнительный параметр запроса является хорошим решением для предотвращения кэширования.
Ответ 2
Магистраль использует jQuery или Zepto для выполнения запроса AJAX. Предполагая, что вы используете jQuery, отключите кеш.
Запустите это, чтобы отключить кеш в общем приложении, поэтому вам не нужно беспокоиться о кеше:
$.ajaxSetup({
cache : false
});
Если сохранение кеша важно для вашей компании, я думаю, что вы можете сделать что-то подобное для конкретных вызовов кеша:
model.save({}, {cache:false});