【问题标题】:Chrome adding Origin header to same-origin requestChrome将Origin标头添加到同源请求
【发布时间】:2013-03-08 21:14:56
【问题描述】:

我们正在向本地运行的服务器发布 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 规范?

【问题讨论】:

标签: javascript ajax html google-chrome cors


【解决方案1】:

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 将只有域和端口。

【讨论】:

  • 这很有意义 - 我们将相应地更改 CORS 过滤器。谢谢!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 2012-12-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2011-10-14
    • 2021-04-09
    • 2013-07-01
    相关资源
    最近更新 更多