c#获取http请求访问者的ip

本文详细介绍了通过X-Real-IP、X-Forwarded-For和RemoteIp三种方式获取客户端真实IP地址的方法,并讨论了每种方式的可信度及应用场景。在存在多个代理服务器的情况下,如何准确地获取到最终请求者的IP地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依次获取三种来源的ip(X-Real-IP、X-Forwarded-For、RemoteIp)

 

1.X-Real-IP

(1)是自定义的http头,由服务器自行在http请求的请求头上添加。

(2)如有多个服务器进行添加,则保留最后一个。

(3)如果我方服务器没有赋值,则此ip不可信。相反,在我方外层服务器覆盖ip数值,则可以认为是请求者的真实ip,就可信。

 

2.X-Forwarded-For

(1)是自定义的http头,由服务器自行在http请求的请求头上添加。

(2)如有多个服务器进行添加,则以逗号分隔保留全部ip。

(3)如果我方服务器没有赋值,则此ip不可信。相反,在我方外层服务器追加ip数值,则可以认为最后一个ip是请求者的真实ip,就可信。

 

3.RemoteIp

(1)是已有的信息

(2)服务器不能改变

(3)此ip可信,但拿到的只是进行连接的服务器的ip,如果我方有在用服务器转发,会拿到我方转发服务器的ip,意义就不大。

 

// ip
string ip="";
string type = "";

// context 是 从过滤器拿的ActionExecutingContext 
try
{
    if (string.IsNullOrEmpty(ip))
    {
        ip = context.HttpContext.Request.Headers["X-Real-IP"].FirstOrDefault();
        type = "X-Real-IP";
    }
    if (string.IsNullOrEmpty(ip))
    {
        ip = context.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault();
        type = "X-Forwarded-For";
    }
    if (string.IsNullOrEmpty(ip))
    {
        ip = context.HttpContext.Connection.RemoteIpAddress.ToString();
        type = "RemoteIp";
    }

    // 判断是否多个ip
    if (ip.IndexOf(",") != -1)
    {
        //有“,”,估计多个代理。取最后一个的IP。  
        string[] temparyip = ip.Split(",");
        ip = temparyip[temparyip.Length - 1].Trim();
    }

    // 去除::ffff:
    if (ip.IndexOf("::ffff:") != -1)
    {
        ip = ip.Substring(7);
    }

    if (string.IsNullOrEmpty(ip))
    {
        ip = "NoGet";
        type = "NoGet";
    }
}
catch
{
    ip = "NoGet";
    type = "NoGet";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值