CORS预检响应包括Vary:Origin和Access-Control-Max-Age?

时间:2017-03-17 02:32:08

标签: cors cross-domain browser-cache preflight

我想知道浏览器如何处理包含 Vary:Origin Access-Control-Max-Age 标题的CORS Preflight响应。

此声明来自https://www.w3.org/TR/cors/

  

希望自己与多个人共享的资源   起源,但没有统一回应" *"必须在实践中   动态生成Access-Control-Allow-Origin标头   响应他们希望允许的每个请求。作为结果,   此类资源的作者应发送Vary:Origin HTTP标头或   为阻止缓存提供其他适当的控制指令   此类回复,如果跨原点重复使用可能不准确

从这个陈述我明白 Vary:Origin 会告诉浏览器阻止Preflight响应的缓存(如果allow-origin:*未使用)

Access-Control-Max-Age 会告诉浏览器会在一段时间内缓存预检响应。

问题:

  1. 如果预检响应中存在两个标头,它是否有效?

  2. 如果响应包含两个标题,浏览器如何处理预检响应?

  3. 谢谢!

1 个答案:

答案 0 :(得分:3)

根据规范要求Vary: Origin不会影响CORS-preflight cache的行为。

  

如果预检响应中存在两个标题,它是否有效?

是的,它是有效的。但是如果存在Vary标头,则它对CORS-preflight缓存没有影响。

  

如果响应包含两个标题

,浏览器如何处理预检响应

对于CORS-preflight缓存,浏览器完全忽略Vary标头,仅使用Access-Control-Max-Age标头的值。

  

我理解 Vary:Origin 会告诉浏览器不会缓存预检结果

这不是Fetch规范中的要求所说的。

CORS-preflight cache不是HTTP规范中要求所涵盖的常规HTTP缓存。它是一个特殊的缓存,其行为仅由Fetch规范定义。并且Fetch规范没有说明任何要求 - 甚至间接 - 关于CORS预检高速缓存的行为受Vary响应头的影响。

取而代之的是the Fetch spec says just this

  

max-age 是提取给定Access-Control-Max-Age响应的标题列表的标题列表值的结果。

在设置 max-age 之前,没有说明咨询Vary标题的价值。

因为在决定是否填充CORS-preflight缓存时,规范没有明确说明是否/如何使用Vary,所以浏览器不得使用Vary这样做。

如果浏览器在处理CORS-preflight缓存时确实使用Vary,那么该浏览器将不符合CORS预检缓存的规范要求。