我有一个网站,它有以下设置:
- 客户端是一个角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。
所以我尝试了任何我能想到的,我是相当多,所以任何想法或任何有关这个问题的信息将不胜感激。
1条答案
按热度按时间w3nuxt5m1#
我检查了我的浏览器的网络选项卡,我注意到
OPTIONS
请求(用于CORS预检请求)失败,错误为301,这是重定向。然后我注意到graphql URL是mydomain.com/graphql
,而不是www.mydomain.com/graphql
,我在nginx配置中重定向到www。我禁用了nginx中的头,我更喜欢在nginx配置之外控制它。
server.py与starlette的配置成功了。当然,现在我将使它更安全。