项目中使用laravel-admin,版本为:5.3.31,是老版本了。但是最近要升级软件环境,将PHP版本由5.6.34升级到7.3.28,升级后引出一系列问题,其他问题逐一解决,基本都是些函数弃用的问题。
但是项目中用到elasticsearch,搜索时报错:{“error”:“Content-Type header [] is not supported”,“status”:406},出现问题后网上也搜了一下,大都是curl请求时需要增加头部信息,问题也确实出在这,但是解决方法大都是命令行, 如:curl -H “Content-Type: application/json” -XPOST。一般命令行请求确实可以解决。
ES中需要改动部分文件。
解决办法为:找到文件:
CODE-XXX\vendor\elasticsearch\elasticsearch\src\Elasticsearch\Connections\Connection.php
构造方法中参数初始化,增加Content-Type等参数,如下:
/**
* Constructor
*
* @param $handler
* @param array $hostDetails
* @param array $connectionParams Array of connection-specific parameters
* @param \Elasticsearch\Serializers\SerializerInterface $serializer
* @param \Psr\Log\LoggerInterface $log Logger object
* @param \Psr\Log\LoggerInterface $trace
*/
public function __construct($handler, $hostDetails, $connectionParams,
SerializerInterface $serializer, LoggerInterface $log, LoggerInterface $trace)
{
if (isset($hostDetails['port']) !== true) {
$hostDetails['port'] = 9200;
}
if (isset($hostDetails['scheme'])) {
$this->transportSchema = $hostDetails['scheme'];
}
if (isset($hostDetails['user']) && isset($hostDetails['pass'])) {
$connectionParams['client']['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
$connectionParams['client']['curl'][CURLOPT_USERPWD] = $hostDetails['user'].':'.$hostDetails['pass'];
}
/*
* 是因为在 ES6.0 之后,ES 对 content-type 的检测更为严格,在 ES 的早期版本中,content-type 是可选的,
* 如果缺省或者 ES 无法辨别,ES 会根据请求内容进行猜测。
* 这个功能最先出现在 5.3 版本,http.content_type.required 是在配置中的,
* 在 5.x 版本中,默认参数是 false,但是在 6.0 版本中,这个参数是 true,并且不能改变。
* 为什么要对这个做出改变呢,是因为随着 ES 的发展,ES 认为可靠性和可预测性更重要,猜测一定会猜错,
* 但是增加了一点点内容,有助于安全和清晰,这是非常明智的。
* 转自链接:https://learnku.com/articles/46475
*/
//升级php7.3+后,es搜索报错:{"error":"Content-Type header [] is not supported","status":406}
//请求时需增加头部信息即可
$connectionParams['client']['curl'][CURLOPT_HTTPHEADER] = ['Accept: application/json', 'Content-Type: application/json'];
$host = $hostDetails['host'].':'.$hostDetails['port'];
$path = null;
if (isset($hostDetails['path']) === true) {
$path = $hostDetails['path'];
}
$this->host = $host;
$this->path = $path;
$this->log = $log;
$this->trace = $trace;
$this->connectionParams = $connectionParams;
$this->serializer = $serializer;
$this->handler = $this->wrapHandler($handler, $log, $trace);
}