使用Daphne在nginx中启用cors,使用反向代理到草莓图形库python应用程序,使用asgi

ws51t4hk  于 2022-11-21  发布在  Nginx
关注(0)|答案(1)|浏览(196)

我有一个网站,它有以下设置:

  • 客户端是一个角14投影
  • 服务器是一个python应用程序,带有用于graphql的草莓
  • 使用nginx作为Web服务器
  • 使用asgi python脚本运行应用程序

当我尝试从Angular 应用程序访问graphql时,出现cors相关错误
Access to XMLHttpRequest at 'https://URL/graphql' from origin 'https://URL' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
在nginx服务器中,我设置了来自let加密的证书listen 443 ssl http2;
我为python项目创建了一个上游设置:

upstream myproj-server {
  server 127.0.0.1:8001;
  }

创建了一个位置后端:

location @backend {
    proxy_pass http://myproj-server; # <--- THIS DOES NOT HAVE A TRAILING '/'
    #proxy_set_header 'Access-Control-Allow-Origin' "*";
    #proxy_set_header 'Access-Control-Allow-Credentials' 'true';
    #proxy_set_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
    #proxy_set_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With';
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-NginX-Proxy true;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_cache_bypass $http_upgrade;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto $scheme;
}

和设置Graphql位置:

location /graphql {
#           add_header 'Access-Control-Allow-Origin' "*" always;
#        add_header 'Access-Control-Allow-Credentials' 'true' always;
#        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
#        add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;

        try_files $uri $uri/ @backend;
    }

我注解掉了带有#的CORS行,但我确实尝试启用它们,以便在/graphql位置或在backend中配置的代理上添加cors,这两种配置都没有更改任何内容。
接下来,我有一个带有asgi应用程序的server.py,该应用程序带有graphql的草莓插件:

from strawberry.asgi import GraphQL

from app import schema

app = GraphQL(schema, graphiql=False)

daphne -b 0.0.0.0 -p 8001 server:app开头
这里我尝试修改server.py以使用Starlette CORS中间件

from strawberry.asgi import GraphQL
from starlette.middleware.cors import CORSMiddleware
from starlette.middleware import Middleware
from starlette.applications import Starlette

from app import schema

middleware = [
    Middleware(CORSMiddleware, allow_origins=['*'],
    allow_methods=["*"],
    allow_credentials=True,
    allow_headers=["*"],)
]

graphql_app=GraphQL(schema, graphiql=True)

app = Starlette(middleware=middleware)
app.add_route("/graphql", graphql_app)
app.add_websocket_route("/graphql", graphql_app)

结果也是一样的
我确信反向代理可以正常工作,因为如果我将graphiql设置为True并浏览mydomain/graphql,它确实会打开graphql-playground。
所以我尝试了任何我能想到的,我是相当多,所以任何想法或任何有关这个问题的信息将不胜感激。

w3nuxt5m

w3nuxt5m1#

我检查了我的浏览器的网络选项卡,我注意到OPTIONS请求(用于CORS预检请求)失败,错误为301,这是重定向。然后我注意到graphql URL是mydomain.com/graphql,而不是www.mydomain.com/graphql,我在nginx配置中重定向到www。
我禁用了nginx中的头,我更喜欢在nginx配置之外控制它。
server.py与starlette的配置成功了。当然,现在我将使它更安全。

相关问题