【问题标题】:HTTP_X_FORWARDED_FOR missing from servervariables in c#c# 中的服务器变量缺少 HTTP_X_FORWARDED_FOR
【发布时间】:2013-07-05 11:15:21
【问题描述】:

我想获取 ClientIPaddress,但是当我调用 Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 时,我总是得到 NULL

查看Servervariables 列表后,我注意到HTTP_X_FORWARDED_FOR 不在选项列表中。

任何人都知道这怎么可能以及如何解决?或者这个选项不在列表中并且我遗漏了什么是正常的。

提前致谢

【问题讨论】:

  • REMOTE_ADDR 呢?
  • 这返回 ::1 --> ip6v 相当于 127.0.0.1 - 因为我已经搜索了网络以获取客户端地址,所以您首先检查 HTTP_X_FORWARDED_FOR。如果这是空的,那么你会得到 remote_addr,因为这会返回一个不太准确的 ip 地址、路由器或 ... thx 来回答 btw
  • 也许这就是你的意思stackoverflow.com/questions/10413171/…

标签: c# asp.net ip


【解决方案1】:

Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 只会有一个值,如果请求是由代理转发的。通常使用Request.ServerVariables["REMOTE_ADDR"]获取客户端IP。

【讨论】:

  • 确实,但这并不能解释当我调试 request.servervariables 并检查此列表不包含 HTTP_X_FORWARDED_FOR 的列表项的所有键
  • 好吧,如果不涉及代理,则标头将永远不会出现。如果您正在调试,您很可能在 localhost 上请求,因此不通过任何类型的代理发出请求。如果可以的话,您可以将 Cloudflare 用于您的域或子域之一。他们甚至会在传入的请求中添加更多标头……
【解决方案2】:
public string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current;
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }

    return context.Request.ServerVariables["REMOTE_ADDR"];
}

此方法可能对您有用。

【讨论】:

  • 我尝试了这段代码,但得到的是“::1”。我没有得到 IP 地址。
  • 我尝试了这段代码,但得到的是“::1”。我在某处看到它是 IPv6 IP 地址。如何获取其等效的 IPv4 地址(如“xxx.xxx.x.xx”这种格式)?
  • 不需要第二个if。如果ipAddress 不为空且不包含任何,,则address 将包含一个元素,其等效于ipAddress
【解决方案3】:

请试试这个:

public static string GetUserIP() {   
    var ip = ( HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null
          && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != "" )
         ? HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
         : HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    if (ip.Contains( "," ))
        ip = ip.Split( ',' ).First();
    return ip.Trim();
}

在这里找到:
http://mycodepad.wordpress.com/2013/04/26/c-getting-a-user-ip-behind-a-proxy-http_x_forwarded_for/

【讨论】:

  • 感谢您更新 HTTP_X_FORWARDED_FOR 可以包含多个地址,但我不建议将其剪切并仅使用第一个。这应该由开发人员决定如何使用它
  • 而且我相信在 Trim() 之后对 ip 的分配丢失了。
【解决方案4】:

如果你在本地机器上运行,看不到任何东西是正常的,否则你在真正的外部主机上运行它。

.net HTTP_X_FORWARDED_FOR NULL on localhost

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多