我们正在向本地运行的服务器发布一个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规范?
答案 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头字段 请求“。