C# .Net Nginx组合获取客户端真实IP

nginx.conf配置文件部分信息

server {
    listen 80;
    server_name www.luofenming.com;
    location / {
        proxy_pass http://localhost:8711;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_cache_bypass $http_upgrade;
    }
}

C# 获取IP帮助类代码

using Microsoft.AspNetCore.Http;
using System.Linq;

namespace lqwvje
{
    public static class GetHostIP
    {
        /// <summary>
        /// 获取客户Ip
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public static string GetClientUserIp(this HttpContext context)
        {
            var userHostAddress = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
            if (string.IsNullOrEmpty(userHostAddress))
            {
                //这个是直接IP,如果经过反向代理IP会变成代理机的,如果代理机就是本机就会变成127.0.0.1
                userHostAddress = context.Connection.RemoteIpAddress.ToString();
            }

            //最后判断获取是否成功,并检查IP地址的格式
            if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))
            {
                return userHostAddress;
            }
            return "127.0.0.1";
        }

        /// <summary>
        /// 检查IP地址格式
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        public static bool IsIP(string ip)
        {
            return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
        }
    }
}

获取IP调用

//Startup.cs 文件注册服务务
 public void ConfigureServices(IServiceCollection services)
 {

     services.AddControllers();
     services.AddSwaggerGen(c =>
     {
         c.SwaggerDoc("v1", new OpenApiInfo { Title = "lqwvje", Version = "v1" });
     });
     //注册下面服务
     services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
 }
 
 
//下面是接口返回IP的方法
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet("GetIP")]
    public string GetIP()
    {
        HttpContextAccessor context = new HttpContextAccessor();
        return GetHostIP.GetClientUserIp(context.HttpContext);
    }
}

本文来自 www.luofenming.com