CORS Access-Control-Max-Age 缓存了啥

Posted

技术标签:

【中文标题】CORS Access-Control-Max-Age 缓存了啥【英文标题】:What is cached with CORS Access-Control-Max-AgeCORS Access-Control-Max-Age 缓存了什么 【发布时间】:2018-03-11 18:11:31 【问题描述】:

如果我响应包含access-control-request-method:PUT 的cors 请求,响应标头access-control-allow-origin 与原点匹配,并且仅access-control-allow-method:PUTaccess-control-max-age:7200 将被缓存2 小时并且始终只返回方法PUT 或者我会如果说下一个请求是 access-control-request-method:POST,是否能够仅使用请求的特定方法进行响应?

【问题讨论】:

【参考方案1】:

如果我响应包含 access-control-request-method:PUT 的 cors 请求,响应标头 access-control-allow-origin 与源匹配,并且仅 access-control-allow-method:PUTaccess-control-max-age:7200 将被缓存 2 小时

是的,尽管在 Chrome 中它只会被缓存 10 分钟。 The Chrome sources hardcode an upper limit for it of 600 seconds(10 分钟)无论您指定多大的值。

并且总是只返回 PUT 方法,或者如果说下一个请求是 access-control-request-method:POST,我是否能够只使用请求的特定方法进行响应?

它不会总是只返回PUT;如果下一个请求有access-control-request-method: POST,那么缓存将被跳过,新的请求将发送到您的服务器。

这是根据Fetch spec(当前为 CORS 协议定义浏览器行为的规范)中的相关要求;具体来说,浏览器需要为每个方法缓存预检,并且仅在有 “method cache match” 时才使用缓存。

因此,您使用PUT 方法的第一个请求会为PUT 请求创建一个预检缓存条目,其到期时间为Access-Control-Max-Age 秒 - 任何使用POST 方法的下一个请求都会创建一个单独的预检缓存条目对于POST 请求,其自身的到期时间为Access-Control-Max-Age 秒。

【讨论】:

以上是关于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() 不工作