我想知道浏览器如何处理包含 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 会告诉浏览器会在一段时间内缓存预检响应。
问题:
如果预检响应中存在两个标头,它是否有效?
如果响应包含两个标题,浏览器如何处理预检响应?
谢谢!
答案 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预检缓存的规范要求。