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

求助:.NET Core应用获取带路由URL时IP与端口显示不符

解决.NET Core应用生成链接显示正确IP和路由端口的问题

你的问题核心是Request.Host默认获取的是直接请求到应用的端口(9907)和本地主机名,没有识别到前端路由转发的信息。要解决这个问题,需要分两步走:配置应用信任代理转发头,然后修正链接生成逻辑。

第一步:配置ForwardedHeaders让应用识别代理转发信息

.NET Core默认不信任代理传递的头信息,所以首先要在Program.cs中配置转发头处理,这样应用才能正确获取到路由层的端口和客户端看到的Host信息:

var builder = WebApplication.CreateBuilder(args);

// 配置ForwardedHeaders
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    // 启用转发的IP、协议和Host头
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
    // 添加你的路由/代理服务器的IP到信任列表(生产环境一定要指定具体IP,不要用AllowAll)
    options.KnownProxies.Add(IPAddress.Parse("10.132.x.x"));
    // 如果是整个网段,也可以这样配置:
    // options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.132.0.0"), 16));
});

// ... 其他服务配置

var app = builder.Build();

// 一定要在UseRouting之前启用ForwardedHeaders
app.UseForwardedHeaders();

// ... 其他中间件配置(UseRouting、UseAuthorization等)

app.Run();

同时,确保你的路由/代理服务器(比如Nginx、IIS ARR)已经配置了转发头,以Nginx为例,需要在反向代理配置中添加:

proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host:$server_port;

第二步:修正控制器中的链接生成代码

配置好转发头后,我们就可以正确获取到路由端口,同时替换localhost为服务器实际IP。修改后的代码如下:

// 获取sessionId
string startAppTicks = HttpContext.Session.Get<long>(Extensions.SessionExtensions.INSTANCE_UNIQUE_KEY).ToString();

// 从转发头获取正确的协议和Host(包含9900端口)
string scheme = Request.Headers["X-Forwarded-Proto"].FirstOrDefault() ?? Request.Scheme;
string forwardedHost = Request.Headers["X-Forwarded-Host"].FirstOrDefault() ?? Request.Host.Value;

// 获取服务器的实际IPv4地址(筛选10.132网段的IP,更精准)
var serverIp = Dns.GetHostEntry(Dns.GetHostName())
    .AddressList
    .FirstOrDefault(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork 
                        && ip.ToString().StartsWith("10.132."))?
    .ToString();

// 如果获取到了目标IP,替换Host中的localhost部分
if (!string.IsNullOrEmpty(serverIp))
{
    var hostParts = forwardedHost.Split(':');
    // 保留端口部分,替换IP
    forwardedHost = $"{serverIp}:{(hostParts.Length > 1 ? hostParts[1] : "9900")}";
}

// 拼接最终链接
string link = $"{scheme}://{forwardedHost}/Download?sessionId={startAppTicks}";

关键说明

  • 生产环境安全:不要在生产环境使用options.KnownProxies.Add(IPAddress.Any),必须指定信任的代理IP,防止恶意伪造转发头。
  • IP筛选逻辑:如果服务器有多个网卡,你可以根据实际网段(比如10.132.x.x)来筛选IP,确保获取到的是对外提供服务的IP。
  • 代理配置验证:如果还是获取不到正确的Host,先检查代理服务器是否正确传递了X-Forwarded-Host和X-Forwarded-Proto头,可以通过Request.Headers调试查看这些值是否存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:17:48