Search code examples
elasticsearchaxios

Axios - Request header content-type was not present in the Access-Control-Allow-Headers list - ElasticSearch


I'm new to a lot of this technology, but I think I've diagnosed my issue and need some help. I've seen numerous posts on SO regarding this issue, but none have worked, though they have helped me diagnose issue.

I believe the issue is when I send the Header Content-Type w/ my pre-flight w/ Axios, it fails. This is possibly due to lower/case upper case? The error has lower case, but I tried both on the server without luck.

Basically, if I don't specify any header and Axios uses json as content-type, it works, but as soon as I specify Content-Type my pre-flight fails (even though I think post would work..).

Here is the elasticsearch.yml

cluster.name: "docker-cluster"
network.host: 0.0.0.0
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
#http.cors.allow-credentials: true

Here is my JS that I'm testing BTW w/ an Office Add-In solution in Visual Studio 2017 which I think is using IE as a browser.

Main Func:

var URL = "https://elasticsearch:9200/users/_search"
const data = {
    "query": {
        "match": {
            "name": "freesoftwareservers"
        }
    }
};
Do_Axios('get', URL, data, null, false)
Do_Axios('post', URL, data, null, false)

Do_Axios:

async function Do_Axios(method, URL, data, headers, withCredentials) {
    return axios({
        method: method,
        url: URL,
        withCredentials: withCredentials,
        //contentType: 'application/json', // does nothing
        //data: JSON.stringify(data), //Causes urlformencoded which is wrong
        data: data, //caues type to be json and I get error
        headers: {
            //"Content-Type": "application/json"
        },
    })
        .then(function (response) {
            console.log("Axios " + method + " response:");
            console.log(response)
            return response;
        })
        .catch(function (error) {
            console.log(error);
        });
}

Note: I can get/post if I comment out //data but then the post doesn't run my query. If I uncomment data then Axios uses urlformencoded but that doesn't work.

For now, I've been able to search API via urlformencoded queries, but I'd like to fix my ability to POST correctly to resolve future errors. I'm unsure if issue should be pointed to Axios or Elasticsearch if I open a request.


Solution

  • I found these snippets and this was the magic that needed added to my NGINX Proxy configuration which is where the issue was:

    proxy_pass_header Access-Control-Allow-Origin;
    proxy_pass_header Access-Control-Allow-Methods;
    proxy_hide_header Access-Control-Allow-Headers;
    add_header Access-Control-Allow-Headers 'X-Requested-With, Content-Type';
    add_header Access-Control-Allow-Credentials true;
    

    https://gist.github.com/sahilsk/b16cb51387847e6c3329