19

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

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

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

然而,由于某种原因,谷歌浏览器总是在结果请求中设置一个 Origin 标头,导致我们的服务器基于它是 CORS 请求的错误假设而阻止该请求。

这在 Firefox 中不会发生。

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

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

4

2 回答 2

33

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

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

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

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

于 2013-03-20T02:10:30.407 回答
19

根据RFC 6454 - The Web Origin Concept - Origin 的存在对于任何 HTTP 请求实际上都是合法的,包括同源请求:

https://www.rfc-editor.org/rfc/rfc6454#section-7.3

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

于 2013-05-08T13:43:21.623 回答