2017-03-17 92 views
2

我想知道浏览器如何处理CORS预检响应,其中包括Vary:原始访问控制最大年龄标题。CORS预检响应包括Vary:Origin和Access-Control-Max-Age?

这种说法是从那些希望使自己与多个 起源可以共享,但不带“*”必须在实践中 产生的访问控制允许来源均匀响应https://www.w3.org/TR/cors/

资源动态地在 响应他们希望允许的每个请求。因此,这样的资源的 作者应该发送各不相同:原产HTTP标头或 提供其他合适的控制指令来防止 这样的响应,这可能是不准确的高速缓存如果使用的重新跨起源

从这句话我的理解有所不同:产地会告诉浏览器防止预检响应的高速缓存(如果允许来源:*未使用)

访问控制-max-age的会告诉浏览器将预检快取回应一段时间。

的问题:

  1. 它是有效的,如果两个头的预检响应存在吗?

  2. 如果响应包含两个标头,浏览器如何处理Preflight响应?

谢谢!

回答

2

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

如果两个标题都存在于预检响应中,它有效吗?

是的,它是有效的。但是,如果存在Vary标头,则它不会影响CORS预检缓存。

如何浏览器处理预检响应,如果响应包括将首

对于CORS-预检快取,浏览器完全忽略Vary头和只使用Access-Control-Max-Age头的值。

我的理解是有所不同:产地会告诉浏览器将不缓存预检结果

这不是在获取规范的要求说什么。

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

相反the Fetch spec says just this

最大年龄是提取给出Access-Control-Max-Age响应的标题列表标题列表值的结果。

这并不是说有关设置最大年龄之前咨询Vary头的任何有价值的东西。

而且由于规范中没有明确说明,如果/决定是否填充CORS-预检缓存时如何使用Vary,然后浏览器必须这样做的时候不使用Vary

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

+0

Upvoted。 w3网站说头Vary:Origin会阻止缓存。你可以看看它。谢谢! – Loc

+0

干杯 - 请注意,您从https://www.w3.org/TR/cors/中引用的文本仅仅是一个内容丰富的注释 - 不是规范性要求的陈述 - 但无论如何,它没有提及任何有关CORS-preflight缓存&并不打算与CORS预检缓存相关。相反,它说,“防止缓存这样的响应”,在上下文中只是意味着正常的HTTP响应。 HTTP规范定义的'Vary'标头是影响正常HTTP缓存的东西,这是浏览器全部在浏览器依赖的任何网络堆栈中实现的,不一定在核心浏览器代码中实现 – sideshowbarker