首页 > 解决方案 > Traefik 2 和 Docker - ElasticSearch api 上的 CORS 错误

问题描述

我使用 Docker 和 Traefik 来管理调用 ElasticSearch API 的 ReactJS 应用程序。

这是我的 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
xpack.security.enabled: true
xpack.security.authc.api_key.enabled: true

这里是我的 Elasticsearch 服务的 docker-compose 条目:

elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
    restart: always
    volumes:
      - ${DATA_FOLDER_ELASTICHSEARCH}:/usr/share/elasticsearch/data
      - ./infra/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    environment:
      - discovery.type=single-node      
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.elasticsearch.rule=Host(`myElastic.domain.com`)"
      - "traefik.http.routers.elasticsearch.entrypoints=websecure"
      - "traefik.http.routers.elasticsearch.middlewares=testHeader"   
      - "traefik.http.middlewares.testHeader.headers.accesscontrolallowmethods=GET,OPTIONS,POST"
      - "traefik.http.middlewares.testHeader.headers.accesscontrolalloworiginlist=*"
      - "traefik.http.middlewares.testHeader.headers.accesscontrolmaxage=100"
      - "traefik.http.middlewares.testHeader.headers.addvaryheader=true"
    networks:
      - myNetwork

如果我调用我的 ElasticSearch API(例如/myIndex/_search使用 Postman 的简单 POST,我有我的响应标头:

Access-Control-Allow-Origin : *
Vary : Origin

但是我的 React 应用程序使用 fetch 仍然存在 CORS 问题(现在我直接使用我的反应中的 ElasticSearch API)。

我需要从 fetch api 更改任何内容吗?

编辑

查看CORS:当凭据标志为 true 时,无法在 Access-Control-Allow-Origin 中使用通配符,看来我无法*用来定义允许的域,所以我输入:

- "traefik.http.middlewares.testHeader.headers.accesscontrolalloworiginlist=https://reactApp.domain.com"

但没有成功......在我的 Chrome 控制台中,我收到了这条消息:

preflight wildcard origin not allowed

标签: dockertraefik

解决方案


@vincent-德科

晚了几个月,但如果你或任何人需要让这个工作,我可以通过包含这个标签来让 Traefik2 + 授权标头与允许来源的“通配符”一起工作:

traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginListRegex=(.*?)

请参阅:https ://doc.traefik.io/traefik/middlewares/headers/#accesscontrolalloworiginlistregex

它允许使用正则表达式来评估有效来源,而不是使用 accessControlAllowOrigin="hostname"。如果可以避免的话,这对于生产环境来说不是一个好主意,但对于我们的开发环境来说非常棒,开发人员可能会针对我们的开发/测试环境“公共”API 在本地修补我们的 UI。对于生产,我有一个正则表达式,它将允许的来源限制为一小组可接受的域/主机。


推荐阅读