背景:

     通过上一篇的配置,想必大家都能连上elasticsearch了,能看到首页的index,但是发现当点击“数据浏览”的标签栏时候,发现根本没有数据。

版本为:elasticsearch 7.14.1      mobz/elasticsearch-head:5

解决思路:

1.打开浏览器的开发者工具,发现有一个http的response 406的错误,于是查看了406 Not Acceptable - HTTP | MDN  ,得到的答案是请求的数据类型和响应的数据类型不一致,导致浏览器无法解析或服务器端无法提供与  Accept-Charset 以及 Accept-Language 消息头指定的值相匹配的响应。

2.在网上搜索答案,很多资料显示要修改es-head中_site/vendor.js的6886行和7573行,将原来的

contentType: "application/x-www-form-urlencoded" 修改为 contentType: "application/json;charset=UTF-8"
我按照所说进行了更改。

如果在docker里面无法更改,请使用volume把容器内部的代码映射到本地磁盘,然后再进行修改即可,具体如下:

docker run --name head -p 9100:9100 -v elasticsearch-head:/usr/src/app -d mobz/elasticsearch-head:5

本来以为没有问题了,但是还是看不到数据,这也是为什么要记录本篇文章的目的,发现很多资料都没有写,也无法查到。

3.为什么还是看不到数据呢,有什么问题呢? 下面几张图显示了跨域的问题,分别是浏览器开发者工具的部分截图。

es 连接 401 es head 连接不上es_big data

es 连接 401 es head 连接不上es_big data_02

 

es 连接 401 es head 连接不上es_big data_03

 

“Request header field content-type  is not allowed by itself in preflight response”,也就是说服务器不接受这个Content-Type这个请求头参数,导致跨域不成功。搜索了一些跨域的资料,参考文献2

4.如何修改呢,我又细看了一下mobz/elasticsearch-head文档。GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster

es 连接 401 es head 连接不上es_big data_04

 之前的登录认证是通过修改跨域的headers,那么Content-Type是否也可以写在elasticsearch.yml的http.cors.allow-headers: Authorization, Content-Type  ??? 

我们按照文档的套路试一试,修改为:

es 连接 401 es head 连接不上es_es 连接 401_05

最后重启elasticsearch

# docker restart  elasticsearch

再打开elasticsearch-head发现能访问了,能实现跨域访问elasticsearch了,成功了。

总结: 

 1. 第一个问题是http 406 ,需要修改elasticsearch-head的_site/vendor.js的6886行和7573行

 2.第二个问题是跨域, 需要修改elasticsearch的elasticsearch.yml文件,新增content-type请求头参数。

 3.文档真有用,干活前要读文档能事半功倍,不能一上来不看文档就瞎干蛮干,又费劲又耽误时间。