Https 运行停靠的FastAPI应用程序时出现CORS问题
我有一个应用程序正在运行,工作正常。我想使用fastapi应用程序作为部署在firebase主机(https)上的react前端的后端。在本地运行(http fastpi和react),我通过在FastAPI中启用CORS使其工作Https 运行停靠的FastAPI应用程序时出现CORS问题,https,cors,google-kubernetes-engine,Https,Cors,Google Kubernetes Engine,我有一个应用程序正在运行,工作正常。我想使用fastapi应用程序作为部署在firebase主机(https)上的react前端的后端。在本地运行(http fastpi和react),我通过在FastAPI中启用CORS使其工作 从starlette.middleware.cors导入CORSMiddleware app.add\u中间件( Corsmidware, 允许_origins=[“*”], allow_credentials=True, 允许_方法=[“*”], 允许_头=[“*”
从starlette.middleware.cors导入CORSMiddleware
app.add\u中间件(
Corsmidware,
允许_origins=[“*”],
allow_credentials=True,
允许_方法=[“*”],
允许_头=[“*”],
)
但当我部署时,我意识到我不能将fastapi作为HTTP提供服务,因为我的前端是HTTPS。我继续在谷歌云中创建了一个kubernetes集群,并进入了我的对接fastapi应用程序(公开为HTTPS)。当我卷曲到我的HTTPS fastapi端点时,这是可行的,但我在react应用程序中再次遇到CORS问题,这次我不知道如何解决它。为什么上述情况不再适用
CORS错误是
在'https://my-api-domain“起源”https://my-frontend-domain'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源
编辑
我只是做了一些进一步的调查,我可以得出结论,如果我使用docker run
在本地运行我的容器,那么access control allow origin
会正确地返回到标题中。但当部署在GKE上时,则没有访问控制允许源站
更新
我尝试过安装nginx-ingres而不是GKE-ingres,但这使全局静态IP和谷歌托管证书的问题变得复杂。我需要一个能让我
我正在使用带有
cert manager
的Nginx入口控制器,它就像一个魔咒。额外信息:使用skaffold和kustomize运行所有内容-许多很棒的工具发布此社区Wiki
,以获得更好的可视性,正如评论部分提到的解决方案一样
如果您想在Google云平台上使用CORS
,您必须使用Nginx入口
和特定的GCP
注释。有关这方面的更多详细信息,请参阅
解决方案
这个问题的解决方案是使用和添加适当的注释
同时,OP也证实了它的工作
我正在使用Nginx入口控制器
和cert-manager
配合使用,它就像一个魔咒。额外信息:使用skaffold
和kustomize
运行所有东西-这么多很棒的工具
在默认端点之后添加中间件为我解决了这个问题
app = FastAPI()
@app.get("/")
def home():
return {"message":"Health Check Passed!"}
app.add_middleware(CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],)
浏览器在devtools控制台中记录的确切错误消息是什么?@sideshowbarker我已经在原始帖子中提供了错误消息。您检查过这个线程吗?是,它使用nginx入口。我不能将Google托管证书与nginx ingress一起使用,这是一项要求。Google托管证书是一项要求有什么特殊原因吗?例如,在gke集群内部使用cert manager
就不能做到这一点吗?请看这里:。如果得出结论认为可以使用证书管理器
,nginx入口应满足所有要求。
app = FastAPI()
@app.get("/")
def home():
return {"message":"Health Check Passed!"}
app.add_middleware(CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],)