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

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

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

我需要改变什么?

【问题讨论】:

    标签: http http-headers cors same-origin-policy access-control


    【解决方案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 可以反驳或证实我的理解......
    • 我想我理解这个概念。如果有帮助,我会尝试。谢谢
    猜你喜欢
    • 2020-04-04
    • 2019-01-31
    • 2018-03-11
    • 2012-06-30
    • 2017-08-08
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多