Loc*_*Loc 6 cross-domain browser-cache cors preflight
我想知道浏览器如何处理包含Vary: Origin和Access-Control-Max-Age标头的CORS 预检响应。
本声明来自https://www.w3.org/TR/cors/
希望使自己能够与多个源共享但不以“*”统一响应的资源必须在实践中动态生成 Access-Control-Allow-Origin 标头以响应它们希望允许的每个请求。因此,此类资源的作者应发送 Vary: Origin HTTP 标头或提供其他适当的控制指令以防止缓存此类响应,如果跨源重用可能会不准确
从这个声明我明白Vary: Origin会告诉浏览器阻止预检响应的缓存(如果 allow-origin: * not used)
Access-Control-Max-Age将告诉浏览器将缓存预检响应一段时间。
问题:
如果预检响应中存在两个标头,它是否有效?
如果响应包含这两个标头,浏览器如何处理预检响应?
谢谢!
根据规范要求,Vary: Origin\xe2\x80\x99 不会影响CORS 预检缓存的行为。
\n\n如果两个标头都存在于预检响应中是否有效?
\n
是的,\xe2\x80\x99s 有效。但如果Vary标头存在,则不会影响 CORS 预检缓存。
\n\n如果响应包含这两个标头,浏览器如何处理预检响应
\n
对于 CORS-preflight 缓存,浏览器完全忽略Varyheader,只使用 header 的值Access-Control-Max-Age。
\n\n我的理解是变化的:Origin会告诉浏览器不会缓存预检结果
\n
\xe2\x80\x99 不是 Fetch 规范中的要求。
\nCORS预检缓存不是 HTTP 规范中要求涵盖的通用 HTTP 缓存。它\xe2\x80\x99是一个特殊的缓存,其行为由Fetch规范专门定义。而且 Fetch 规范没有规定任何要求,甚至间接说明 CORS 预检缓存的行为是否受到响应标头的影响Vary。
相反,Fetch 规范只是这样说的:
\n\n\n令max-age
\nAccess-Control-Max-Age为提取给定标头列表值和响应\xe2\x80\x99s 标头列表的结果。
这并没有说明Vary在设置 max-age之前检查标头值的任何内容。
并且由于规范Vary在决定是否填充 CORS 预检缓存时没有明确说明是否/如何使用,因此浏览器在执行此操作时不得使用Vary。
如果浏览器确实Vary在处理 CORS 预检缓存时使用,则该浏览器将不符合 CORS 预检缓存的规范要求。