K.I*_*.I. 4 django nginx cors reactjs docker-compose
我有一个关于 django 中 cors 实现的问题。设置正确的 cors 值时出现问题。我的部署是在docker上。我部署了 3 个容器:
一切都在本地主机上。我使用前端的 axios 来调用 get/post 请求。(我调用 1338 端口,然后我认为它被重定向到 8000 端口上的内部服务)对于后端,我必须安装 django-cors-headers 包才能使用 CORS。我想我设置正确。但有些情况下它不起作用。
在设置.py
INSTALLED_APPS = [
...
"corsheaders",
]
...
MIDDLEWARE = [
...
"corsheaders.middleware.CorsMiddleware",
"django.middleware.common.CommonMiddleware",
...
]
Run Code Online (Sandbox Code Playgroud)
nginx 镜像的 Nginx.conf:
upstream backend {
server backend:8000;
}
server {
listen 80;
add_header Access-Control-Allow-Origin *;
location / {
proxy_pass http://backend;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host:1337;
proxy_redirect off;
}
location /static/ {
alias /home/app/web/staticfiles/;
}
}
Run Code Online (Sandbox Code Playgroud)
第一个场景
在设置.py
CORS_ALLOW_ALL_ORIGINS = True
Run Code Online (Sandbox Code Playgroud)
没有 get/post 请求工作。获取消息:
不允许 CORS 多源
第二种情况
在settings.py中
CORS_ALLOWED_ORIGINS = ["http://localhost:1337"]
Run Code Online (Sandbox Code Playgroud)
适用于 get 请求,但不适用于 post 请求。
对于帖子请求:
如果我不使用 nginx 作为后端,它就可以工作。
按照评论中的要求添加请求标头。
我不确定我还能在这里添加什么。所以我部署的项目就在这里(如果你的机器上有docker,启动起来也很容易: https://gitlab.com/k.impolevicius/app-001
小智 5
我不久前遇到过这个问题,我认为问题出在标题上。在 MDN 文档中,这里指出,除了简单请求之外,我们将使用OPTIONS方法获取预检请求。根据您的情况,我们需要发送 3 个主要标头作为响应
Access-Control-Allow-Origin: http://localhost:1337
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
Run Code Online (Sandbox Code Playgroud)
从外观上看,您已经配置了第一个标头,您也应该在网络选项卡中看到它,并且由于错误是关于缺少允许标头,因此您需要将Access-Control-Allow-Methods标头添加到您的 nginx 文件中
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
Run Code Online (Sandbox Code Playgroud)
在请求的标头上查看网络选项卡将在此处提供更多上下文,通常您应该在请求中看到Access-Control-Request-Method和Access-Control-Request-Headers标头OPTIONS。如果有一些您不允许的标头,请为其编写一条 nginx 规则。您可以查看此解决方案以获取更多参考
| 归档时间: |
|
| 查看次数: |
2739 次 |
| 最近记录: |