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

ASP.NET Core 2.0部署于Ubuntu 16.04的Nginx后,远程IP始终为127.0.0.1

解决ASP.NET Core 2.0在Nginx反向代理下获取真实IP的问题

这是反向代理部署ASP.NET Core时非常常见的问题,核心原因是两个关键配置没到位:Nginx没有正确转发客户端真实IP,同时ASP.NET Core默认不信任代理传递的头信息。下面分两步帮你搞定:

第一步:更新Nginx配置,转发客户端真实IP

你的现有Nginx配置缺少传递真实IP的关键请求头,需要在location /块中添加以下配置项:

proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;

修改后的完整location块示例:

location / {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Forwarded-Proto-Version $http2;
    # 新增转发真实IP的配置
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    client_max_body_size 32m;
    keepalive_timeout 200;
    send_timeout 20;
    ...
}

简单解释:

  • X-Forwarded-For:记录客户端的真实IP地址
  • X-Forwarded-Proto:告诉ASP.NET Core请求原本的协议(HTTP/HTTPS)
  • X-Real-IP:作为备选的真实IP头,兼容部分场景

第二步:配置ASP.NET Core信任反向代理

ASP.NET Core默认只信任本地回环地址(127.0.0.1)的代理请求,所以需要明确让应用信任Nginx所在的代理服务器,并启用转发头解析。

打开项目的Startup.cs文件,做两处修改:

  1. 在ConfigureServices方法中添加转发头配置:
using Microsoft.AspNetCore.HttpOverrides;
using System.Net;

public void ConfigureServices(IServiceCollection services)
{
    // 其他服务配置...
    
    services.Configure<ForwardedHeadersOptions>(options =>
    {
        // 启用解析X-Forwarded-For和X-Forwarded-Proto头
        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        // 如果Nginx和Core应用在同一机器,添加127.0.0.1到信任列表;若Nginx在其他服务器,替换为对应IP
        options.KnownProxies.Add(IPAddress.Parse("127.0.0.1"));
    });
}
  1. 在Configure方法中,必须在其他中间件(如UseMvc、UseStaticFiles)之前调用UseForwardedHeaders():
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // 先处理转发头,确保后续中间件能拿到真实IP
    app.UseForwardedHeaders();
    
    // 其他中间件配置...
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

验证效果

修改完成后,重启Nginx(sudo systemctl restart nginx)和你的ASP.NET Core应用,之后在代码中通过HttpContext.Connection.RemoteIpAddress获取的就是客户端的真实IP了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:52:28