为什么 XMLHttpRequest 包含 Origin 标头?

Gre*_*lis 6 javascript jquery xmlhttprequest cross-domain

我想更好地理解这一点。我目前使用的心理模型是这样的:

  1. foo.com 托管的 JS 希望访问 bar.com 托管的资源。这不是浏览器喜欢向用户展示的类型,除非可以表明 bar.com 欢迎此请求。
  2. 因此 foo.com JS 本质上将请求分成两半。首先,我们通过 XMLHttpRequest 对象发送适当类型的无数据请求(GET、POST 等)。bar.com 上的服务器返回它通常会响应的任何请求,其中可能包含也可能不包含 Access-Control-Allow-Origin 标头。(编辑:这是一个误解 - 请参阅下面 apsillers 的精彩评论)
  3. 如果浏览器确实获得了这样的标头,它会扫描它以查找源(在本例中为 foo.com)。如果存在,它将继续发送要求发送的实际请求。如果没有,则拒绝。(编辑:这也不太正确)

如果这个模型是正确的,我很困惑为什么浏览器会通过这个初步请求发送 Origin 标头。检查匹配不是发生在客户端吗?发送这个 header 能达到什么目的呢?

epa*_*llo 3

这就是CORS 的工作原理。这基本上是一次握手,表示欢迎您与我交谈。除非联系第 3 方,否则您无法知道是否可行。

以下是MDN 文章Preflighted_requests 部分的部分内容:

与简单请求(如上所述)不同,“预检”请求首先将 HTTP OPTIONS 请求标头发送到其他域上的资源,以确定实际请求是否可以安全发送。跨站点请求会像这样进行预检,因为它们可能会对用户数据产生影响。特别是,在以下情况下,请求会被预检:

它使用 GET 或 POST 以外的方法。另外,如果 POST 用于发送 Content-Type 不是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 的请求数据,例如,如果 POST 请求向服务器发送 XML 有效负载使用 application/xml 或 text/xml,然后对请求进行预检。它在请求中设置自定义标头(例如,请求使用 X-PINGOTHER 等标头)