.NetCore使用nginx做反向代理获取到客户端ip的问题

310 阅读1分钟
  1. 一般情况下.NetCore获取客户端IP是比较简单的,通过下面的这段代码就能获取到客户端的IP地址
public static string GetRealIP(this HttpContext context)
{
    var context = HttpContext.Current;
    if (context == null) return "";
    var result = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
    if (string.IsNullOrEmpty(result))
    {
        result = context.Connection.RemoteIpAddress.ToString();
    }
    return result;
}
  1. 但是有时候在用nginx做.NetCore的反向代理后,这样指向的就是本地的IP了,所以需要将nginx获取到的ip传递到.NetCore web站点中。

  2. 首先我们需要在Startup.cs中添加

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto
	});
 	app.UseEndpoints(endpoints =>
        {
          endpoints.MapControllerRoute(
               name: "default",
               pattern: "{controller=Home}/{action=Index}/{id?}");
       });   
}
  1. 然后在nginx中添加一行配置,之后重新加载nginx配置文件就ok了

image.png

# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;