You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:09:53