在 HTTP CORS 规范中,Allow-Headers 和 Expose-Headers 有啥区别?

Posted

技术标签:

【中文标题】在 HTTP CORS 规范中,Allow-Headers 和 Expose-Headers 有啥区别?【英文标题】:In the HTTP CORS spec, what's the difference between Allow-Headers and Expose-Headers?在 HTTP CORS 规范中,Allow-Headers 和 Expose-Headers 有什么区别? 【发布时间】:2015-03-22 08:20:49 【问题描述】:

在 HTTP CORS 规范中,5.6 Access-Control-Allow-Headers 和 5.3 Access-Control-Expose-Headers 有什么区别?

[Allow-Headers] 标头表示,作为响应的一部分 预检请求,在预检过程中可以使用哪些标头字段名称 实际要求

更新:我希望有人会告诉我每个请求(飞行前)都会发送其中一个标头...但是,还有另一个标头用于此目的:5.9 Access-Control-Request-Headers

[Request-Headers] 标头指示在实际请求中将使用哪些标头作为预检请求的一部分

顺便说一句,我喜欢他们 (W3C) 如何谨慎地措辞 5.9,以便 请求标头 可以有一个名为 _Something_ Request Header 的字段。

我完全迷失在规范中,有没有图表可以让我更好地理解这个过程?

【问题讨论】:

【参考方案1】:

访问控制允许标头

用于响应预检请求,以指示在发出实际请求时可以使用哪些 HTTP 标头。

访问控制公开标头

此标头允许服务器将允许浏览器访问的标头列入白名单。例如:

来源: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

【讨论】:

所以,基本上这些名字都不好。前者是请求头,后者是对脚本可见的响应头,对吧? MDN documentation 声明:“Access-Control-Allow-Headers 响应标头用于响应预检请求,以指示哪些 HTTP 标头将通过 Access-Control-Expose 可用- 发出实际请求时的标头。” 这是不正确的吗? 如果请求有一个不包含在Access-Control-Allow-Headers 中的标头会发生什么。例如,服务器发回“A,B,C”,但真正的请求头是“A,B,C,D”。浏览器会拒绝发送真正的请求吗?【参考方案2】:

只是为了澄清上面的评论,即这些名称错误,这些名称并没有错误。

它们具有不同的功能。

Access-control-allow-headers 指定允许哪些标头更改服务器的状态。 虽然Access-control-expose-headers 有一个get 方法,但getResponseHeader() 方法会返回特定响应标头的值。在 CORS 请求期间,getResponseHeader() 方法只能访问简单的响应标头。为了能够访问其他标头,您需要在此处指定它。

【讨论】:

它们具有不同的功能,但它们的名称非常相似。他们的名字肯定很糟糕。

以上是关于在 HTTP CORS 规范中,Allow-Headers 和 Expose-Headers 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

CORS跨域djangosetting.py 配置

用CORS 解决vue.js django跨域调用

在 http 请求中使用 CORS

对无效CORS请求的预期响应是什么?

netty系列之:在netty中处理CORS

调试 CORS 错误的方法