使用AngularJS和ElasticSearch对预检的响应无效(重定向)

时间:2017-06-02 13:29:12

标签: angularjs elasticsearch

我正在开发一个Angular 1.6.3应用程序,该应用程序使用elasticsearch.js库来查询在远程服务器上运行的ElasticSearch 5.4实例。最近,我们的应用程序开始遇到问题,当它最初接触到ElasticSearch数据时会收到多个Response for preflight is invalid (redirect)错误。目前此问题仅发生在Chrome中:

Response for preflight is invalid (redirect)

开发者工具中的请求屏幕截图:HTTP request in network tab

此错误似乎是随机发生的,当用户在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请求的屏幕截图: enter image description here

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

问题的原因可以在OPTION请求底部附近的Chrome DevTool net-internals事件页面中看到,其中显示CHROME_EXTENSION_REDIRECTED_REQUEST。 Chrome扩展程序随机将我的请求重定向到ElasticSearch,实际取消了它们。由于它是我公司安装的Chrome扩展程序(通过企业策略),因此无法移除,因此我能够将ElasticSearch主机添加到扩展程序的白名单中。