我们正在将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规范吗?
Chrome和Safari Origin在相同来源的POST / PUT / DELETE请求上包含标头(相同来源的GET请求将没有Origin标头)。Firefox Origin在同源来源的请求中不包含标头。浏览器不希望源相同的请求具有CORS响应标头,因此,无论源是否具有CORS标头,对源相同的请求的响应都会发送给用户。
Origin
我建议检查Host标头,如果它与标头中的域匹配Origin,请不要将请求视为CORS。标头看起来像这样:
Host
Host: example.com Origin: http://example.com
请注意,Origin它将具有方案(http / https),域和端口,而Host仅具有域和端口。