3

我正在开发一个应用程序,该应用程序应该为“正常”浏览器请求和 AJAX 请求提供不同内容的相同 URL 请求。(实际上,如果请求是 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 协议

--- 更新 2012 年 12 月 11 日 12:38 UTC

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

任何想法如何避免这种行为

4

3 回答 3

2

您还应该包括Vary-header

response.headers['Vary'] = 'Content-Type'
于 2012-11-12T12:24:08.047 回答
0

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

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

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

于 2014-11-11T22:00:18.090 回答
0

设置cache-controlno-store我的情况下,虽然no-cache没有。不过,这可能会产生不必要的副作用。

no-store:响应可能不会存储在任何缓存中。尽管可以设置其他指令,但仅此一项是您在现代浏览器上防止缓存响应所需的唯一指令。

来源:  Mozilla 开发者网络 - HTTP Cache-Control

于 2020-08-06T15:22:52.390 回答