服务内容取决于http接受标头 - 缓存问题?

时间:2012-11-12 12:18:42

标签: 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';
   response.headers['Cache-Control'] = 'no-cache';
   response.content = JSON( some_data... )
 }
}

问题在于,当对当前查看的网址发出第一个AJAX请求时, Google Chrome上发生了奇怪的事情 - 如果在响应发生后立即通过JavaScript处理,用户点击了一些链接(静态,重定向到其他页面)然后单击浏览器中的后退按钮,他看到返回的JSON 代码而不是渲染的网站(记录服务器我可以说没有请求< / strong>制作完成)。在我看来,Chrome存储了针对特定网址的最新请求响应,并没有考虑到它具有不同的内容类型等。

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

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

根据PatrikAkerstrand的回答,我发现了以下Chrome错误:http://code.google.com/p/chromium/issues/detail?id=94369

如何避免此行为的任何想法?

3 个答案:

答案 0 :(得分:3)

您还应该添加Vary-header

response.headers['Vary'] = 'Content-Type'

答案 1 :(得分:0)

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

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

另一个选项是:使用/api为AJAX请求加前缀或添加一些缓存提升查询参数?rand=1234

答案 2 :(得分:0)

在我的情况下,将cache-control设置为no-store,而no-cache却没有。不过,这可能会带来不良的副作用。

no-store:响应可能不存储在任何高速缓存中。尽管可以设置其他指令,但是仅此一个指令就可以防止现代浏览器中缓存响应。

来源:Mozilla Developer Network - HTTP Cache-Control