docker-compose 环境中的 CORS 请求失败

Posted

技术标签:

【中文标题】docker-compose 环境中的 CORS 请求失败【英文标题】:CORS request failing in docker-compose environment 【发布时间】:2019-04-24 15:12:35 【问题描述】:

我希望找出在 Firefox 中运行的 React 应用程序中的 API 请求失败的原因。

标题如下:

Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
DNT 1
Host    backend:8080
origin  http://localhost:3000
Referer http://localhost:3000/
User-Agent  Mozilla/5.0 ...

在 Chrome 上,一条不透明的消息表明某种网络(ish)错误:

request.js?176a:41 GET http://backend:8080/api/foobar/ 
net::ERR_NAME_NOT_RESOLVED

在 Firefox 上,似乎有更多信息:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://backend:8080/api/foobar/. (Reason: CORS request did not succeed).

我有一个由两个相关节点组成的环境,frontendbackendfrontend 正在运行一个托管 React frontend 位的服务器。 backend 是一个提供一组简单 JSON API 的 Flask 应用程序。目的是让 frontend 通过 JSON API 调用 backend

docker-compose 配置使得它们在同一个逻辑网络上运行。起初,我怀疑这个问题是 docker-compose 问题,可能是一些 DNS 事故。但是,我可以通过手动停止frontend 节点并手动将同一个容器重新附加到网络来排除这种情况,这样我就可以运行bash shell 并pingbackend 主机。此外,我能够通过curlbackend 获取相同的位。所以这排除了它是一个 Docker 网络问题(我认为)。

下一个合乎逻辑的罪魁祸首是与 CORS 有关。 frontend 请求正在访问一个不同的域(例如 backend),因此这可以解释该行为。

在docs listed in the dev console of Firefox 之后,声称发生了“某种基本网络错误”。

为了更好地衡量,我在backend 上设置了Flask-CORS,并验证了正确的标头正在从服务器中继。准确地说,Access-Control-Allow-Origin: *

然而,从backend 服务器的日志中 - 仍然没有发出新的网络请求。我曾推测,根据Mozilla CORS Docs 中描述的特殊情况,可能在backend 处触发了OPTION 请求,但这是失败的。然而,这至少会在 Flask 控制台输出中触发一个日志条目,指示 OPTION 请求已被触发。为了放纵我的妄想症,我什至爆发了 Wireshark。 Firefox(或 Chrome)似乎没有发出任何相关的网络请求!

很可能我把这件事复杂化了,这是一件非常简单的事情。但会喜欢一些正确方向的指示。

【问题讨论】:

【参考方案1】:

TLDR - javascript 在浏览器中运行(后端开发人员说)

frontend 上引用的主机应该是localhost,因为backend 端口通过 Docker 在localhost 上公开。 frontend 代码在浏览器中运行(而不是仅在容器中)。容器只是提供这些位的过程。

不透明网络错误可能是由于引用了主机网络不存在的域名。因为它是docker-compose 虚拟网络的一部分。

【讨论】:

以上是关于docker-compose 环境中的 CORS 请求失败的主要内容,如果未能解决你的问题,请参考以下文章

从 docker-compose 替换 NGINX 配置中的环境变量

docker-compose 进阶篇

无法使用 spring mvc 和 $http 访问 CORS 环境中的自定义标头

如何解决 docker-compose 环境变量不起作用 ASP.Net Core MVC

使用 docker-compose 快速安装Jenkins

我如何管理 Angular 10 中的 CORS 错误?我已经使用代理,但我需要生产解决方案 [关闭]