我正在开发一个Angular 1.6.3应用程序,该应用程序使用elasticsearch.js库来查询在远程服务器上运行的ElasticSearch 5.4实例。最近,我们的应用程序开始遇到问题,当它最初接触到ElasticSearch数据时会收到多个Response for preflight is invalid (redirect)
错误。目前此问题仅发生在Chrome中:
此错误似乎是随机发生的,当用户在Chrome的隐身模式或其他浏览器(如Firefox)中访问应用时,它不会发生。
在做了一些研究之后,我发现这个OPTIONS
请求是浏览器发出的预检请求,询问服务器是否可以发送包含我的实际POST
想要查询ElasticSearch。发生预检的原因是因为我尝试使用application/json
作为Content-Type
标题进行发布,这不是"标准"之一。 Content-Type
标题的值。
我的问题是 - 我该如何解决这个问题?我已将elasticsearch.yml
中的CORS设置更改为无效:
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: "X-Requested-With, X-Auth-Token, Content-Type, Content-Length, Authorization"
我还尝试更改每个ElasticSearch请求的elasticsearch.js Content-Type
标头,但每个请求都会继续发送application/json
,就像设置不听我输入的内容一样:
var client = elasticsearch.Client({
hosts: [{
host: 'es-proxy.company.net',
port: 80,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}]
});
从Chrome DevTool net-internals事件页面失败的OPTION
请求的屏幕截图:
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
问题的原因可以在OPTION
请求底部附近的Chrome DevTool net-internals事件页面中看到,其中显示CHROME_EXTENSION_REDIRECTED_REQUEST
。 Chrome扩展程序随机将我的请求重定向到ElasticSearch,实际取消了它们。由于它是我公司安装的Chrome扩展程序(通过企业策略),因此无法移除,因此我能够将ElasticSearch主机添加到扩展程序的白名单中。