Nginx+Django+Angular环境SSL配置遇CORS问题求排查
解决Nginx+Angular+Django SSL配置下的CORS问题
一、Nginx核心CORS配置遗漏点
你的CORS错误核心是请求资源未返回Access-Control-Allow-Origin响应头,必须在监听8000 SSL的Nginx服务器块中添加以下配置:
1. 处理OPTIONS预请求
浏览器发起跨域请求前会先发送OPTIONS预请求验证权限,需要直接返回200并带上CORS头:
if ($request_method = OPTIONS) { add_header Access-Control-Allow-Origin "https://servername:4200"; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"; add_header Access-Control-Max-Age 3600; add_header Content-Length 0; add_header Content-Type text/plain; return 200; }
2. 给常规请求添加CORS头
确保所有非OPTIONS请求也能拿到正确的CORS响应头:
add_header Access-Control-Allow-Origin "https://servername:4200"; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With";
注意:生产环境不要用
*代替具体域名,仅测试场景可临时使用;如果Angular部署在标准HTTPS端口(443),需把地址改成https://servername。
二、SSL与反向代理配置补充
检查Nginx服务器块的SSL和反向代理参数是否完整,确保和Django配置匹配:
server { listen 8000 ssl; server_name your-server-domain; # SSL证书路径 ssl_certificate /path/to/your/fullchain.pem; ssl_certificate_key /path/to/your/privkey.pem; # 推荐的SSL安全配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 插入上述CORS配置 # 反向代理到Django location / { proxy_pass http://127.0.0.1:8000; # 替换为Django实际监听地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 必须配置,对应Django的SECURE_PROXY_SSL_HEADER } }
这里的X-Forwarded-Proto头是关键,确保Django能识别到HTTPS协议,避免后续逻辑出现异常。
三、Django侧的辅助检查
如果使用了django-cors-headers库,需确保配置与Nginx一致:
INSTALLED_APPS = [ # ...其他应用 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # ...其他中间件 ] CORS_ALLOWED_ORIGINS = [ "https://servername:4200", ]
避免Nginx和Django的CORS配置冲突,建议优先通过Nginx统一处理跨域。
内容的提问来源于stack exchange,提问作者thulasi39
相关产品推荐
相关产品推荐

