Ajax 根据http接受头提供内容-缓存问题?

Ajax 根据http接受头提供内容-缓存问题?,ajax,http,google-chrome,Ajax,Http,Google Chrome,我正在开发一个应用程序,它应该为“普通”浏览器请求和相同URL请求的AJAX请求提供不同的内容。 (事实上,如果请求是AJAX,则将响应HTML封装在JSON对象中) 为此,我在服务器端检测AJAX请求,并适当地处理响应,请参见下面的伪代码: function process_response(request, response) { if request.is_ajax { response.headers['Content-Type'] = 'application/json';

我正在开发一个应用程序,它应该为“普通”浏览器请求和相同URL请求的AJAX请求提供不同的内容。 (事实上,如果请求是AJAX,则将响应HTML封装在JSON对象中)

为此,我在服务器端检测AJAX请求,并适当地处理响应,请参见下面的伪代码:

function process_response(request, response)
{
 if request.is_ajax 
 {
   response.headers['Content-Type'] = 'application/json';
   response.headers['Cache-Control'] = 'no-cache';
   response.content = JSON( some_data... )
 }
}
问题是,当对当前查看的URL发出第一个AJAX请求时,Google Chrome上会发生奇怪的事情,如果在响应发出并通过JavaScript处理后,用户单击某个链接(静态,重定向到其他页面),然后单击浏览器中的“上一步”按钮,他看到的是返回的JSON代码,而不是呈现的网站(记录服务器,我可以说没有发出请求)。在我看来,Chrome存储了特定URL的最新请求响应,并且没有考虑到它有不同的内容类型等

这是Chrome中的错误还是我误用了HTTP协议

---更新12:11 2012,12:38 UTC

根据PatrikAkerstrand的回答,我发现了以下Chrome错误:

任何关于如何避免这种行为的想法

你还应该包括:


Vary
是在内容协商中控制缓存上下文的标准方法。不幸的是,它在某些浏览器中也有错误的实现,请参阅

我建议使用唯一的URL。 根据您的框架功能,您可以将浏览器重定向(302)到URL+
.html
,以强制响应格式并使缓存键在浏览器会话中唯一。然后对于AJAX请求,您仍然可以保留无后缀的URL。或者,您可以使用
.json
作为AJAX URL的后缀


另一个选项是:使用
/api
作为AJAX请求的前缀,或者添加一些缓存增强查询参数
?rand=1234
缓存控制设置为
无存储
,而
无缓存
在我的情况下没有。但这可能会产生不必要的副作用

无存储
:响应可能不会存储在任何缓存中。虽然可以设置其他指令,但这是在现代浏览器上防止缓存响应所需的唯一指令

资料来源:


嗯,它没有解决问题。然而,根据你的回答,我发现这是一个谷歌浏览器的错误。现在,有没有办法避免这种行为?*Vary列出响应不同的请求字段。
response.headers['Vary'] = 'Content-Type'