Chrome 不缓存预检

Posted

技术标签:

【中文标题】Chrome 不缓存预检【英文标题】:Chrome not caching preflight 【发布时间】:2015-10-16 14:29:14 【问题描述】:

我正在实现一个应该支持跨域请求的 REST API。使用 CORS 我想实现这一点。几乎我的所有请求都是“不简单”的,这意味着对于所有非 GET 请求,必须由浏览器发送预检请求。

为了限制预检/OPTIONS 请求的数量,我尝试让浏览器缓存 OPTIONS 请求。这似乎适用于 Firefox 和 Safari,但不适用于 Chrome。我知道 Chrome 只会将预检请求缓存 10 分钟,但就我而言,似乎根本没有缓存。

这些是 Chrome 发送/接收的 HTTP 请求和响应:

请求:

OPTIONS /api/v1/sessions HTTP/1.1
Host: xxxxxxx
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/44.0.2403.107 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Referer: http://localhost:8000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4

回复:

HTTP/1.1 200 OK
Date: Sun, 26 Jul 2015 09:33:27 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: php/5.5.9-1ubuntu4.9
Cache-Control: private, max-age=1440, pre-check=1440
Access-Control-Allow-Origin: http://localhost:8000
Access-Control-Allow-Methods: GET,POST,PATCH,DELETE
Access-Control-Max-Age: 86400
Access-Control-Allow-Headers: content-type
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

【问题讨论】:

您在请求中设置了 Pragma: no-cacheCache-Control: no-cache。尝试从请求中删除它们 是的,但我没有明确设置它们。 Chrome 会在请求中发送这些内容,我该如何删除? 我在 chrome 中检查了我的 api 请求,但那些请求标头没有通过.. 所以我怀疑 chrome 本身就是设置那些,你需要检查你的代码从哪里设置 哎呀,谢谢。我的缓存似乎被禁用了。 【参考方案1】:

您在请求中设置了 Pragma: no-cacheCache-Control: no-cache 标头。 尝试删除它们。

默认情况下,Api 请求不设置这些标头,我怀疑 chrome 确实如此 要么。 你应该检查你的代码并找出它们在哪里 设置自。

现在,鉴于它在其他浏览器上运行良好,您最好检查一下您是否在Dev Tools 上设置了no-cache 选项。

【讨论】:

有史以来最好的答案,我们都启用了该选项。 =) 我希望我们能在 1 小时前找到这个,太棒了! 如果您在 DevTools 中激活“禁用缓存”,Chrome 会添加 Pragma: no-cache; Cache-Control: no-cache。因此,“禁用缓存”也禁用了所有预检请求的缓存。这似乎也是 OP 的罪魁祸首。

以上是关于Chrome 不缓存预检的主要内容,如果未能解决你的问题,请参考以下文章

CORS 预检响应如何实际缓存在浏览器中?

如何在浏览器中实际缓存CORS预检响应?

如何在Firefox中检查预检结果缓存的内容

如何禁用 Angular 服务工作者的预检缓存控制标头(调用事件流时)?

怎样设置chrome不缓存文件

记一次清理缓存的小事情(chrome) chrome下清理缓存不生效的问题