由于前后端分离项目,前端项目使用nginx部署,并且做了本机代理转发,访问服务地址配置均为localhost(项目都在同一服务器上),如下图:
导致获取的IP地址均为127.0.0.1等本机IP,修改nginx配置文件,如下:
location / {
proxy_pass http://localhost:5000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
cmd管理员身份进入nginx目录,停止nginx,命令如下:
D:\nginx-1.21.5>nginx -s stop
重启nginx:
D:\nginx-1.21.5>start nginx
有时候nginx停止命令不能停止nginx,请使用资源管理器杀死进程(您有更好的方法可以留言给我,谢谢)。
写一个通用方法获取IP,代码如下:
/// <summary>
/// 获取客户Ip
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
static public string fnGetClientUserIp()
{
try
{
var userHostAddress = context.Request.Headers["X-Real-IP"].ToString();
if (string.IsNullOrWhiteSpace(userHostAddress))
{
userHostAddress = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
}
if (string.IsNullOrWhiteSpace(userHostAddress))
{
userHostAddress = context.Connection.RemoteIpAddress.MapToIPv4()?.ToString();
}
if (string.IsNullOrWhiteSpace(userHostAddress))
{
userHostAddress = context.Connection.RemoteIpAddress.ToString();//这个是直接IP,如果经过反向代理IP会变成代理机的,如果代理机就是本机就会变成127.0.0.1
}
if (!string.IsNullOrWhiteSpace(userHostAddress))
{
return userHostAddress;
}
return "127.0.0.1";
}
catch(Exception ex)
{
return ":1";
}
}
示例:
string sIp = this.HttpContext.fnGetClientUserIp();
我的方法封装为HttpContext的扩展方法,修改方法名,代码如下:
/// <summary>
/// 获取客户Ip
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
static public string fnGetClientUserIp(this HttpContext context)
如果上面代码段你定义为一个类内静态方法,调用方式如下:
string sIp = 你的Class类名.fnGetClientUserIp();