CORS Access-Control-Max-Age 适用于相同的来源或相同的请求 url

Posted

技术标签:

【中文标题】CORS Access-Control-Max-Age 适用于相同的来源或相同的请求 url【英文标题】:CORS Access-Control-Max-Age works for same origin or just same request url 【发布时间】:2017-06-27 04:02:29 【问题描述】:

现在我们有一些 CORS 请求(get, range header)

get http://example.com/01.mv (request a1)
get http://example.com/01.mv (request a2)
get http://example.com/02.mv (request b1)
get http://example.com/02.mv (request b2)

在发送请求 a1 之前,浏览器会发送一个 OPTIONS 请求, 我们可以找到Access-Control-Max-Age: 3600作为回应。

这是我的问题:

在请求a2中,会发送一个OPTIONS请求吗?

在请求b1中,会发送一个OPTIONS请求吗?

在请求 b2 中,会发送一个 OPTIONS 请求吗?

【问题讨论】:

【参考方案1】:

简答:浏览器应用Access-Control-Max-Age per-URL,而不是 per-origin。

在请求a2中,会发送一个OPTIONS请求吗?

不,因为由于该 URL 的 Access-Control-Max-Age 标头,浏览器将缓存 CORS 预检的结果但仅限于该 http://example.com/01.mv URL

在请求b1中,会发送一个OPTIONS请求吗?

是的,因为它用于一个不同的 URL,http://example.com/02.mv

CORS 协议对每个 URL 而不是每个源进行预检,因此请求 a1 URL 的另一个 Access-Control-Max-Age 的值不适用于不同的 b1 URL。

在请求 b2 中,会发送一个 OPTIONS 请求吗?

不,出于同样的原因,它不会针对请求 a2 发送:由于 Access-Control-Max-Age,浏览器将缓存 http://example.com/02.mv 的 CORS 预检结果。


就 CORS 规范在这里定义的相关要求而言,如果您跟踪规范中的步骤,他们会带您到规范中对术语 cache match 的定义:

有一个缓存匹配 对于 request 如果 origin 是 request 的来源,url 是 request 的当前 url...

换句话说,缓存的预检将仅用于请求,如果两者

    请求的来源与缓存预检的来源相匹配 并且请求的 URL 与缓存的预检的 URL 匹配

【讨论】:

为什么 b1 会发送一个 OPTIONS 请求?它们具有相同的来源http://example.com 因为 OPTIONS 预检是按 URL 启动的,而不是按源启动的。浏览器不会从对来自特定来源的一个 URL 的响应中接收到预检结果,并将其重用于来自该来源的所有其他 URL 的请求。那是没有意义的。一方面,第二个 URL 空间的所有者可能与第一个 URL 规范的所有者完全不同。因此,不同的所有者需要控制他们自己的 URL 空间的 CORS 行为。等等。

以上是关于CORS Access-Control-Max-Age 适用于相同的来源或相同的请求 url的主要内容,如果未能解决你的问题,请参考以下文章

CORS详解

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

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

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

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

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