Express对IE的重复请求返回304状态码。

11

我遇到了一些奇怪的ExpressJS行为。在对我的基于node.js/express的API URL进行第二次请求时,它总是返回304未修改的响应代码给IE浏览器,而其他浏览器则会得到200(Chrome/FF)。问题是,即使内容实际上已更改,它也会返回304。我尝试搜索并找不到有关此主题的任何信息。此外,我尝试查找IE和Chrome的请求标头之间的差异,并且没有看到可能导致此问题的任何标头。将不胜感激任何帮助。

我必须补充说明,连接通过SSL进行,以防它有影响。


你是如何确定IE获取哪个响应代码的? - josh3736
josh3736,我正在检查IE开发者工具中的网络日志。 - bbbonthemoon
3个回答

6
缓存控制头是一种解决方法。这个bug出现在Internet Explorer对HTTP 1.1规范头部的解释上。 我在路由处理程序中添加了这个,问题得到了解决。你还需要一个Last-Modified或ETag头部,但是express已经为我发送了它们。
res.setHeader("Expires", "-1");
res.setHeader("Cache-Control", "must-revalidate, private");

参见:让IE缓存资源但始终重新验证


5

我发现有同样的问题,经过大量搜索,实际上这个问题源于IE对ajax get请求进行了愚蠢而激进的缓存。事实上,当你看到304状态码时,实际的请求从未到达服务器,而是IE直接从它的缓存中返回最新数据。这是微软预期的行为,因此只有一些解决方法。

我推荐的解决方法是,在每个ajax get请求中添加一个无用的查询参数,其中包含当前时间信息。这样会强制IE始终从服务器检索。好处是,如果你使用jQuery,你可以自动将其配置为:

$.ajaxSetup({cache:false})

另一种解决方法是使用POST请求而不是GET,但这并非总是可行的。


为什么IE会说它得到了304?这种愚蠢的事情让与IE一起工作变得非常痛苦... - Jasper
同时,不要滥用POST方法来实现此功能,因为这只是错误地实现了HTTP方法。相反,可以采用时间戳解决方案或Cache-Control解决方案。 - Jasper

3

好的,我通过添加Cache-Control头来解决了它。


那更像是一种变通方法。希望有人能够发布一个解决方案。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接