我遇到了 ExpressJS 的一些奇怪行为。在对我的基于 node.js/express 的 API URL 的第二次请求时,它总是向 IE 返回 304 Not Modified 响应代码。其他浏览器获得 200(Chrome/FF)。问题是,即使内容实际上已更改,它也会返回 304。我试图搜索,但找不到有关该主题的任何内容。此外,我试图找出 IE 和 Chrome 的请求标头中的差异,并且可以看到任何可能导致这种情况的标头。任何帮助将不胜感激。
我必须添加连接通过 SSL,以防万一
我遇到了 ExpressJS 的一些奇怪行为。在对我的基于 node.js/express 的 API URL 的第二次请求时,它总是向 IE 返回 304 Not Modified 响应代码。其他浏览器获得 200(Chrome/FF)。问题是,即使内容实际上已更改,它也会返回 304。我试图搜索,但找不到有关该主题的任何内容。此外,我试图找出 IE 和 Chrome 的请求标头中的差异,并且可以看到任何可能导致这种情况的标头。任何帮助将不胜感激。
我必须添加连接通过 SSL,以防万一
Cache-Control 标头是一种解决方法。该错误存在于 Internet Explorer 对标头的 HTTP 1.1 规范的解释中。
我将此添加到我的路由处理程序中,从而解决了问题。您还需要一个Last-Modified
或ETag
标头,但 express 已经为我发送了该标头。
res.setHeader("Expires", "-1");
res.setHeader("Cache-Control", "must-revalidate, private");
请参阅:使 IE 缓存资源但始终重新验证
有同样的问题我环顾四周,事实证明问题来自 IE 对 ajax get 请求的愚蠢激进缓存。事实上,当您看到这个 304 时,实际请求从未到达服务器,但 IE 会使用缓存中的最新数据进行响应。这是 MS 的预期行为,因此只有解决方法。
我的首选是为每个 ajax get 请求附加一个包含当前时间的无用查询参数。它将强制 IE 始终从服务器检索。好的部分是如果你使用 jQuery,你可以自动配置它
$.ajaxSetup({cache:false})
另一种解决方法是使用 POST 请求而不是 GET,但这并不总是一种选择。
好吧,我设法通过添加 Cache-Control 标头来修复它