我正在开发一个应用程序,它应该为“正常”浏览器请求提供不同的内容,并为所请求的相同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
如何避免此行为的任何想法?
答案 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
:响应可能不存储在任何高速缓存中。尽管可以设置其他指令,但是仅此一个指令就可以防止现代浏览器中缓存响应。