OPTIONS请求时,从浏览器使用ElasticSearch失败



我正在使用jQuery的ajax方法向我的Elastic的_search API发出POST请求。

当在查询中传递参数时,一切都很好:

$.ajax({
  url: '//localhost:9200/my_index/_search/?q=hello',
  method: 'POST'
}).then(function(body){
  console.log(body);
});

当在主体(json)中传递参数时,问题开始出现:

$.ajax({
  url: '//localhost:9200/my_index/_search/',
  method: 'POST',
  dataType: 'json',
  contentType: "application/json",
  data: this.params
}).then(function(body){
  console.log(body);
});

浏览器(Chrome)不发送POST请求,而是发送OPTIONS请求。

阅读jQuery的文档我看到:

对于跨域请求,将内容类型设置为application/x-www-form-urlencoded、multipart/form-data或text/plain以外的任何内容都将触发浏览器向服务器发送preflight OPTIONS请求。

所以这可能就是它的来源。

问题是,在那次飞行前请求之后什么都没发生。

查看Wireshark:中的请求本身

OPTIONS /my_index/_search/ HTTP/1.1
Host: localhost:9200
Connection: keep-alive
Cache-Control: max-age=0
Access-Control-Request-Method: POST
Origin: http://localhost:4000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Access-Control-Request-Headers: accept, content-type
Accept: */*
Referer: http://localhost:4000/search/?q=hello
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,fr;q=0.6
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: 
Access-Control-Max-Age: 1728000
date: Tue, 12 Apr 2016 07:30:50 GMT
content-length: 0

我注意到响应的Access-Control-Allow-Methods字段是空的,所以我认为它可能是相关的。

我的elasticsearch.yml文件包含:

http.cors.enabled: true
http.cors.allow-origin: "*"

我补充道:

http.cors.allow-methods : OPTIONS, HEAD, GET, POST, PUT, DELETE

但这并没有改变任何事情。

这是由这个问题引起的,这个问题已经修复,将在2.3.2 中发布

最新更新