【问题标题】:Request.UserHostAddress return IP address of Load BalancerRequest.UserHostAddress 返回负载均衡器的 IP 地址
【发布时间】:2013-03-08 15:35:06
【问题描述】:

我的网站中有一行关键代码在我们的开发环境中工作,但在生产环境中却没有。好吧,我说它在开发中有效,但事实是它给出了::1,这是 IPv6 环回地址。

无论如何,我想要做的是捕获访问该站点的用户的 IP 地址。因此,我使用Request.UserHostAddress 来做到这一点。正如我所说,在开发过程中,它给了我回送地址,这是正确的,因为我是从我的机器上运行该站点的。在现场,它做了一些完全不同的事情。它总是返回负载均衡器的地址。

我想了解的是这个。使用 Request.UserHostAddress 捕获用户的 IP 地址是我错了,还是我们的网络设置有问题或其他问题?

谢谢,

萨钦

【问题讨论】:

    标签: c# request load-balancing


    【解决方案1】:

    在您自己的应用程序中,如果没有其他任何措施可以帮助您,那么您就会陷入困境。这就是您可以获得的尽可能多的信息。

    如果幸运的话,您的负载均衡器已被配置为添加一个或多个额外的标头,其中包含有关原始请求的信息。

    一种常见的解决方案是X-Forwarded-For 标头:

    X-Forwarded-For (XFF) HTTP 标头字段是一个事实上的标准,用于识别通过 HTTP 代理或负载平衡器连接到 Web 服务器的客户端的原始 IP 地址。

    然后您将通过 Request.Headers 属性访问它。

    但是发现这个(或另一个)标头是否可用不是我们可以提供帮助的事情 - 您需要与为您的组织配置负载平衡器的人员交谈。

    【讨论】:

      【解决方案2】:

      参考@Damien_The_Unbelieveranswer,这里是完整的解决方案:

      public static string GetIpAddress()
      {
        var request = HttpContext.Current.Request;
        // Look for a proxy address first
        var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
      
        // If there is no proxy, get the standard remote address
        if (string.IsNullOrWhiteSpace(ip)
            || string.Equals(ip, "unknown", StringComparison.OrdinalIgnoreCase))
          ip = request.ServerVariables["REMOTE_ADDR"];
        else
        {
          //extract first IP
          var index = ip.IndexOf(',');
          if (index > 0)
            ip = ip.Substring(0, index);
      
          //remove port
          index = ip.IndexOf(':');
          if (index > 0)
            ip = ip.Substring(0, index);
        }
      
        return ip;
      }
      

      【讨论】:

      • 如果转发的地址包含多个地址,那么如何识别正确的地址呢?
      • @It'satrap 当有多个IP地址时,第一个定义客户端地址,其余为代理地址。通常像下面的client1、proxy1、proxy2。
      【解决方案3】:

      使用此代码检查生产环境...它对我有用:

          System.Web.HttpRequest oRequest = System.Web.HttpContext.Current.Request;
      
          string header;
          string ip;
      
          header = "HTTP_X_FORWARDED_FOR";
          ip = oRequest.ServerVariables[header];
          Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);
      
          header = "REMOTE_ADDR";
          ip = oRequest.ServerVariables[header];
          Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);
      
          header = "HTTP_CLIENT_IP";
          ip = oRequest.ServerVariables[header];
          Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);
      
          header = "Request.UserHostAddress";
          ip = oRequest.UserHostAddress;
          Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);
      

      【讨论】:

      • 你能不能解释一下这是做什么的,而不仅仅是一堆代码?
      • 当我说“使用此代码检查生产环境”时,我的意思是有几种检索客户端 IP 的方法,但彼此之间略有不同。我所做的是打印所有变量以检查女巫一个是否正确,事实上,HTTP_X_FORWARDED_FOR 对我来说工作得很好!
      • 只是为了补充 OP 的建议,在您的网站上创建一个页面,例如 IP.aspx 并将其放在上面
      • ...[contd] OP 的代码 在 OP 的结尾 %> 添加
      猜你喜欢
      • 2021-01-21
      • 1970-01-01
      • 2016-11-21
      • 2021-11-07
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多