9

我正在使用角度服务通过休息 api 获取资源。服务器将ETag标头设置为某个值,并Cache-Control: no-cache在其响应中进行设置。

这在使用 Firefox 时按预期工作,但是当我使用 Chrome 访问同一个应用程序时,它不会发送If-None-Match. 我已经在 Mac 和 Ubuntu 机器上尝试了当前的 Chrome 开发和稳定频道,两者都是一样的,而 Firefox 正在If-None-Match正确添加。

现在,还有其他非 xhr/静态资源被有条件地获取,并且所有这些请求都正确地得到了304 NOT MODIFIED响应。

我可以做些什么来获取有关 Chrome 为什么If-None-Match不仅为 XHR 请求发送标头的更多信息?

4

1 回答 1

6

如果您在 Chrome 中通过 HTTPS 发出 Ajax 查询,任何证书错误(例如在 API 服务器上使用自签名证书)都会阻止响应被缓存。这似乎是设计使然。

显然存在Chrome 缺陷 ,但在 Webkit 中得到修复,并在 2010 年左右将其纳入 Chromium / Chrome。

另一个问题建议使用 jQuery 的 ifModified: true 和 cache: true 选项手动设置 If-Modified-Since 和 If-None-Match 标头。不幸的是,这不会覆盖 Chrome 的预期行为,即不缓存来自具有自签名证书的服务器的 HTTPS 响应。

在具有有效签名 SSL 证书的服务器上进行测试为我解决了这个问题;Chrome 使用默认的 jQuery AJAX 方法按预期收到了 text/html 内容的 304。

于 2013-11-20T17:08:12.580 回答