【问题标题】:CORS Access-Control-Max-Age works for same origin or just same request urlCORS Access-Control-Max-Age 适用于相同的来源或相同的请求 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 请求吗?

【问题讨论】:

    标签: google-chrome http browser cors


    【解决方案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...

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

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

    【讨论】:

    • 为什么 b1 会发送一个 OPTIONS 请求?它们具有相同的来源http://example.com
    • 因为 OPTIONS 预检是按 URL 启动的,而不是按源启动的。浏览器不会从对来自特定来源的一个 URL 的响应中接收到预检结果,并将其重用于来自该来源的所有其他 URL 的请求。那是没有意义的。一方面,第二个 URL 空间的所有者可能与第一个 URL 规范的所有者完全不同。因此,不同的所有者需要控制他们自己的 URL 空间的 CORS 行为。等等。
    猜你喜欢
    • 2019-01-31
    • 2014-06-25
    • 2018-03-11
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2021-08-22
    • 2014-12-08
    相关资源
    最近更新 更多