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

Caddy反向代理后Django服务器GET请求CORS问题求助

问题分析与解决方案

你的核心问题是反向代理场景下Django的CORS响应头未正确返回,结合你的配置和报错信息,主要排查方向集中在配置冲突、反向代理头传递、中间件生效情况这几个点,以下是具体解决步骤:


1. 修复Django CORS配置冲突

你同时设置了CORS_ALLOW_ALL_ORIGINS = True和CORS_ALLOWED_ORIGINS,这两个配置互斥:当CORS_ALLOW_ALL_ORIGINS为True时,CORS_ALLOWED_ORIGINS会被忽略,冗余配置可能导致中间件逻辑异常。

修改settings.py,二选一即可:

# 方案A:允许所有跨源请求(适合开发环境)
CORS_ALLOW_ALL_ORIGINS = True
# 注释掉下面的指定源配置
# CORS_ALLOWED_ORIGINS = [
# "https://www.example.net",
# "http://localhost:5000",
# "http://127.0.0.1:5000",
# "http://127.0.0.1:5501"
# ]

# 方案B:仅允许指定源(适合生产环境)
# CORS_ALLOW_ALL_ORIGINS = False
# CORS_ALLOWED_ORIGINS = [
# "http://localhost:5000",
# "http://127.0.0.1:5000",
# "http://127.0.0.1:5501"
# ]

2. 配置Django识别反向代理的HTTPS请求

Caddy作为反向代理,会将HTTPS请求转为HTTP转发给Django,若Django未识别这一转换,django-cors-headers可能无法正确生成CORS响应头。

在settings.py中添加:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

确保已保留USE_X_FORWARDED_HOST = True,让Django信任Caddy传递的请求头。


3. 检查Caddy反向代理的头传递配置

Caddy必须正确转发Origin、X-Forwarded-Proto等关键头,否则Django无法识别跨域请求来源。修改你的Caddyfile,确保配置如下:

https://www.example.net {
    reverse_proxy http://127.0.0.1:8000 {  # 替换为你的Django服务地址
        header_up Host {host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
        # 禁止添加移除CORS响应头的配置
        # 例如:不要出现 header_down -Access-Control-Allow-Origin 这类语句
    }
}

4. 移除视图中手动添加的CORS头

既然使用django-cors-headers中间件处理CORS,手动设置response["Access-Control-Allow-Origin"] = "*"会与中间件逻辑冲突,直接删除该行代码:

@csrf_exempt
def get_vertex_data(request):
    try:
        id = request.GET.get('nid', '')
        graphdb = GDM.get_graph_database()
        vertices = graphdb['vertices']
        vertRaw = vertices.find_one({'id':int(id)})
        vertRaw.pop("_id", None)
        
        response = JsonResponse(vertRaw, safe=False)
        # 移除下面这行手动设置的头
        # response["Access-Control-Allow-Origin"] = "*"
        
        return response
    except Exception as e:
        print(e)
        return HttpResponse("Something broke sorry")

5. 验证配置是否生效

重启Django和Caddy服务后,用curl模拟跨域请求测试响应头:

curl -H "Origin: http://localhost:5000" -I https://www.example.net/nodeData/?nid=13

若响应头中包含Access-Control-Allow-Origin: *(或你指定的源),说明配置生效,此时再用前端fetch请求测试即可。


内容的提问来源于stack exchange,提问作者Indrajeet Haldar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:59:51