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文件,做两处修改:
- 在
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")); }); }
- 在
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
相关产品推荐
相关产品推荐

