Chrome正在缓存HTTP PUT请求

我对Chrome有这个奇怪的问题。 它经常出现缓存PUT请求。

详细信息:我有一个使用backbone.js的应用程序,当尝试将某些更改保留到模型时(主干自动生成PUT请求),Chrome只是不会将该请求发送到服务器。 它在Firefox和IE中运行得非常好(到目前为止还没有在Safari中看到过这个问题)。

以下是Chrome开发者工具“网络”标签的屏幕截图。 如您所见,PUT请求的响应是从缓存返回的(请求没有到达服务器!!) Chrome会缓存PUT请求

这是同一请求的标题详细信息的屏幕截图。 再一次,很明显Chrome并不打算将PUT请求发送到服务器。 Chrome缓存了PUT请求标头

请求的有效负载是JSON数据。 有关为什么会发生这种情况的想法/我做错了什么?

更新: Chromium已经确认这确实是一个错误 (感谢JanHanč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(); } 

我使用额外的参数来避免缓存:

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

我不解释服务器端的这个参数。

编辑:除了chrome之外,还有很多东西可以缓存请求 – 例如用户的代理服务器。 我认为额外的查询参数是一个很好的解决方案,以防止缓存。

Backbone使用jQuery或Zepto来发出AJAX请求。 假设您正在使用jQuery,请关闭缓存。

运行此命令可在整个应用程序中关闭缓存,因此您无需担心缓存:

 $.ajaxSetup({ cache : false }); 

如果保持缓存对您的业务很重要,我认为您可以针对特定的无缓存调用执行类似的操作:

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