.netcore获取IP地址,Nginx作为反向代理的情况下

第一步:增加nginx代理http头

复制代码
server {

    listen 80; 

    location / {

    proxy_set_header X-Real-IP $remote_addr;#反向代理的服务器的真实IP

    proxy_set_header Host $host;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#来自客户端的IP

    proxy_pass http://localhost:5000; 
}
}
复制代码

第二步:core项目中增加获取IP地址的帮助类

复制代码
        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))
                {
                    userHostAddress = context.Connection.RemoteIpAddress.ToString();//直接请求IP,如果经过反向代理IP会变成代理机的,如果代理机就是本机就会变成127.0.0.1
                }

                //最后判断获取是否成功,并检查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?)$");
            }
        }
复制代码

补充说明

HttpContext 对象获取的两种方式

1.在Mvc 控制器实例中包含了上下文对象,可以直接使用

 

2.使用IHttpContextAccessor接口获取HttpContext对象

2.1我们先要将它注册到ServiceCollection中,否则无法获取到这个对象。

public void ConfigureServices(IServiceCollection services)
{
    //services.AddHttpContextAccessor();
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

 2.2使用时,可以使用构造函数注入的方式获取到这个对象

 

2.3使用时,手动获取对象

复制代码
        public class TestClass
        {
            public static IServiceProvider ServiceProvider;
            public static HttpContext GetContext()
            {
                object factory = ServiceProvider.GetService(typeof(Microsoft.AspNetCore.Http.IHttpContextAccessor));

                HttpContext context = ((IHttpContextAccessor)factory).HttpContext;

                return context;
            }
        }
复制代码

 

posted @   海爬sir  阅读(743)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示