Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome向同一来源请求添加来源标头_Javascript_Ajax_Html_Google Chrome_Cors - Fatal编程技术网

Javascript Chrome向同一来源请求添加来源标头

Javascript Chrome向同一来源请求添加来源标头,javascript,ajax,html,google-chrome,cors,Javascript,Ajax,Html,Google Chrome,Cors,我们正在向本地运行的服务器发送一个AJAX请求,即 xhr.open("POST", "http://localhost:9000/context/request"); xhr.addHeader(someCustomHeaders); xhr.send(someData); 执行此javascript的页面也由localhost:9000提供服务,也就是说,这看起来完全像一个同源请求 然而,出于某种原因,Google Chrome总是在生成的请求中设置一个Origin头,导致我们的服务器基于

我们正在向本地运行的服务器发送一个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都没有发送选项飞行前请求,这令人困惑;为什么要在没有先预处理的情况下设置原始标头,以确保服务器允许原始标头和自定义标头


有人知道这件事是怎么回事吗?我们是否误解了CORS规范?

Chrome和Safari在同一来源POST/PUT/DELETE请求中包含一个
来源
标题(同一来源GET请求将不包含来源标题)。Firefox在相同来源请求中不包含
来源
头。浏览器不希望在同一来源请求上使用CORS响应头,因此对同一来源请求的响应将发送给用户,而不管它是否具有CORS头

我建议检查
Host
头,如果它与
Origin
头中的域匹配,则不要将请求视为CORS。标题如下所示:

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

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

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

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


这很有道理-我们将相应地更改CORS过滤器。谢谢查看哪些答案解释了为什么源站标题适用于相同的源站POST请求。这是一种CSRF保护机制。