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

SignalR+NGINX反向代理环境下CORS跨域错误求助

解决方案

1. 修正API Gateway的ForwardedHeaders配置

生产环境通过Nginx反向代理时,API Gateway需要正确识别客户端真实请求信息(包括Origin),需添加ForwardedHeaders配置并调整中间件顺序:

// 在Program.cs的builder.Services区域添加
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    // 添加Nginx服务器的IP地址到可信代理列表,生产环境建议指定具体IP/子网
    options.KnownProxies.Add(IPAddress.Parse("你的Nginx服务器IP"));
    // 容器环境可使用子网,例如:
    // options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.17.0.0"), 16));
});

// 确保ForwardedHeaders中间件在CORS之前执行
app.UseForwardedHeaders();

app.UseCors(x => x
    .AllowAnyMethod()
    .AllowAnyHeader()
    .SetIsOriginAllowed(origin => true)
    .AllowCredentials());

app.MapReverseProxy(proxyPipeline =>
{
    proxyPipeline.UseAuthentication(); 
    proxyPipeline.UseAuthorization(); 
    // 移除此处的UseForwardedHeaders,全局已配置
});

2. 调整Nginx的SignalR路由配置

Nginx需要转发真实的Origin头到后端,并正确处理CORS预请求(OPTIONS方法):

location /hub/myhub {
    proxy_pass        $forward_scheme://$server:$port$request_uri;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header Origin $http_origin; # 关键:转发客户端真实Origin
    proxy_cache_bypass $http_upgrade;
    
    # 处理CORS预请求,直接返回204并带上必要头
    if ($request_method = OPTIONS) {
        add_header Access-Control-Allow-Origin $http_origin;
        add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
        add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Upgrade";
        add_header Access-Control-Allow-Credentials "true";
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        return 204;
    }
}

3. 验证配置

使用curl测试预请求是否返回正确的CORS头:

curl -X OPTIONS -H "Origin: https://myfrontend.com" -H "Access-Control-Request-Method: POST" -v https://myserver.com/hub/myhub/negotiate

响应头中应包含Access-Control-Allow-Origin: https://myfrontend.com和Access-Control-Allow-Credentials: true。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:14:51