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

loo*_*ook 3 browser google-chrome http cors

现在我们有一些 CORS 请求(获取,范围标头)

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)
Run Code Online (Sandbox Code Playgroud)

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

这是我的问题:

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

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

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

sid*_*ker 5

简短回答:浏览器应用Access-Control-Max-Age每个 URL,而不是每个来源。

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

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

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

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

CORS 协议通过按 URL 执行预检而不是按来源进行操作,因此Access-Control-Max-Age请求a1URL 的其他值不适用于不同的b1URL。

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

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


至于 CORS 规范在这里定义的相关要求,如果您跟踪规范中的步骤,他们将带您到规范中术语缓存匹配的定义:

有一个缓存匹配要求,如果原产地要求的起源,网址是要求目前的网址...

换句话说,缓存的预检将仅用于以下两种情况的请求:

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