docker - 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
解决方案
@vincent-德科
晚了几个月,但如果你或任何人需要让这个工作,我可以通过包含这个标签来让 Traefik2 + 授权标头与允许来源的“通配符”一起工作:
traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginListRegex=(.*?)
请参阅:https ://doc.traefik.io/traefik/middlewares/headers/#accesscontrolalloworiginlistregex
它允许使用正则表达式来评估有效来源,而不是使用 accessControlAllowOrigin="hostname"。如果可以避免的话,这对于生产环境来说不是一个好主意,但对于我们的开发环境来说非常棒,开发人员可能会针对我们的开发/测试环境“公共”API 在本地修补我们的 UI。对于生产,我有一个正则表达式,它将允许的来源限制为一小组可接受的域/主机。
推荐阅读
- logstash - 我需要为下面的 websphere 日志定义 grok grok 模式
- javascript - 为什么 JavaScript 不能在 localhost 上运行,但在我的机器上却能完美运行?
- c++ - wxDVC 渲染器的 Xcode 编译失败
- android - Android:在网络响应上加载 Oncreate 布局
- python - dask.bag / dask.delayed for loop有什么区别,为dask中的python并行作业选择更好的方法
- firebase - 检测到 0 个或 2 个或多个 [DropdownMenuItem] 具有相同的值
- html - 仅在 CSS 动画完成后显示 HTML 正文(使用纯 CSS)
- c# - 如何在c#中限制用户在特定时间段后取消预订
- postgresql - 在 PostgreSQL 触发器中循环和测试 cte 的结果
- html - 如何使用 BeautifulSoup 提取每个 df1 内容(优点、缺点、df_tit)?