Chrome将Origin标头添加到同源请求中

时间:2013-03-19 23:16:58

标签: javascript ajax html5 google-chrome cors

我们正在向本地运行的服务器发布一个AJAX请求,即

xhr.open("POST", "http://localhost:9000/context/request");
xhr.addHeader(someCustomHeaders);
xhr.send(someData);

正在执行此javascript的页面也是从localhost:9000提供的,即这看起来像是一个同源请求。

但是,出于某种原因,Google Chrome总是在生成的请求中设置一个Origin标头,导致我们的服务器根据它的CORS请求的错误假设来阻止请求。

在Firefox中不会发生这种情况。

此外,Firefox和Chrome都没有发送OPTIONS预检请求,这令人困惑;为什么在没有先预检的情况下设置Origin标头以确保服务器允许Origin和Custom标头?

有谁知道这种情况发生了什么?我们是否误解了CORS规范?

2 个答案:

答案 0 :(得分:28)

Chrome和Safari在同源POST / PUT / DELETE请求中包含Origin标头(同源GET请求不具有Origin标头)。 Firefox在同源请求中不包含Origin标头。浏览器不期望同源请求上的CORS响应头,因此对同源请求的响应将发送给用户,无论它是否具有CORS头。

我建议检查Host标头,如果它与Origin标头中的域匹配,请不要将请求视为CORS。标题看起来像这样:

Host: example.com
Origin: http://example.com

请注意,Origin将具有方案(http / https),域和端口,而Host将只有域和端口。

答案 1 :(得分:14)

根据 RFC 6454 - 网络原始概念 - 对于任何HTTP请求,包括同源请求,Origin的存在实际上是合法的:

http://tools.ietf.org/html/rfc6454#section-7.3

  

“用户代理可以在任何HTTP中包含Origin头字段   请求“。