CORS Access-Control-Max-Age 被忽略

Posted

技术标签:

【中文标题】CORS Access-Control-Max-Age 被忽略【英文标题】:CORS Access-Control-Max-Age is ignored 【发布时间】:2014-06-25 23:02:55 【问题描述】:

我在不同的域上托管一个 WebApp 和他的 API,并使用 CORS 来解决相同的源策略。到目前为止,一切都很好。这行得通。

为了每次会话只发送一次 CORS 预检,我设置了 Access-Control-Max-Age 到 20 天,但这不起作用(在 Chrome 中测试): https://db.tt/vfIW3fD2

我需要改变什么?

【问题讨论】:

【参考方案1】:

如果您使用的是 Chrome 开发工具,请确保您有“禁用缓存(在开发工具打开时)”未选中。我遇到了“Access-Control-Max-Age”的问题,只是意识到我已经选中了该选项。

【讨论】:

你绝对让我头疼不已!!之前忘了检查那个:D 这很明显但是....我从来没有想过它!谢谢! 刚刚意识到 devtools 中有这样的东西,并且成功了,谢谢【参考方案2】:

Chrome/Blink 规定的最大预检时间为 10 分钟(600 秒)。这是定义它的源代码中的位置:

https://chromium.googlesource.com/chromium/blink/+/master/Source/core/loader/CrossOriginPreflightResultCache.cpp#40

任何超过 10 分钟的预检时间都将被忽略,而是使用 10 分钟。

不同的浏览器可能有不同的最大年龄政策。 Safari/WebKit 最多缓存 5 分钟,而 Firefox 最多缓存 24 小时。 Chrome 源代码表明存在最大值是为了“将切换到安全网络后使用中毒缓存的风险降至最低”。

如果代码无法解析 max-age 标头(或者服务器没有指定 max-age 标头),浏览器默认为 5 秒。

【讨论】:

您好,感谢您的解释。这仍然不能解释为什么 5 秒后再次进行预检。任何想法 我用关于何时选择 5 秒超时的部分更新了答案。但在您的特定情况下,超时应该是 5 分钟而不是 5 秒,因为您的 max-age 标头看起来有效。唯一可能是 +Ray Nicholus 上面提到的内容(标题或来源不匹配)。你能在 test-cors.org 上重新创建它吗? 我无法重新创建 test-cors.org 的问题,因为问题出现在第二个请求中。这是我的请求和响应,应该(但不会)导致缓存的 OPTIONS 请求。 gist.github.com/rolandschuetz/cd278a9489b5065a256d 2 年后,chrome 仍然忽略缓存:(...在 54.0.2840.50 beta(64 位)上测试【参考方案3】:

我不会过于依赖预检缓存。

来自规范:

用户代理可以在 max-age 字段中指定的时间过去之前清除缓存条目。

另外,请记住以下几点(来自 CORS 规范):

当预检结果缓存中存在满足以下条件的缓存条目时,存在缓存匹配:

源字段值是源源的区分大小写匹配。

url 字段值是请求 URL 的区分大小写匹配。

凭证字段值为真且省略凭证标志未设置,或者为假 并设置了省略凭据标志。

您的屏幕截图无法确定上述任何一项是否属实。

【讨论】:

您好!前两个是的,第三个在哪里?这是对应的 HAR:gist.github.com/rolandschuetz/cd278a9489b5065a256d 如果 XHR 实例上的withCredentials 设置了省略凭据标志!== true。凭据字段值是指服务器响应中可能存在或不存在的 Access-Control-Allow-Credentials 标头。换句话说,如果发送并缓存了其他类似的预检请求,听起来好像不会查询预检缓存,但预检缓存中的匹配项确实包含 cookie,但响应中不包含 Access-Control-Allow-Credentials=true ,或者在请求中未包含 cookie,但在响应中包含 Access-Control-Allow-Credentials=true。 ...不是 100% 确定我的理解,但我没有更好的解释。也许@monsur 可以反驳或证实我的理解...... 我想我理解这个概念。如果有帮助,我会尝试。谢谢

以上是关于CORS Access-Control-Max-Age 被忽略的主要内容,如果未能解决你的问题,请参考以下文章

CORS详解

AspNet.Cors 和 AspNet.WebApi.Cors 有啥区别?

为啥启用 CORS 后仍然出现 CORS 错误

Wagtail、CORS 和 Django-Cors-Headers。如何启用 CORS 以便 AXIOS 可以访问端点

javascript [在服务器上启用CORS]允许服务器请求CORS #javascript #node #cors

我收到 CORS 错误 - cors() 不工作