2013-07-08 10 views
2

我想获得ClientIP地址,但是当我打电话给Request.ServerVariables["HTTP_X_FORWARDED_FOR"]时,我总是得到NULLHTTP_X_FORWARDED_FOR从c中的servervariables丢失#

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

任何人都知道这是如何可能和如何解决?或者这是正常的,这个选项不在列表中,我错过了一些东西。

预先感谢

+0

'REMOTE_ADDR'怎么办? – V4Vendetta

+0

这是返回:: 1 - > ip6v相当于127.0.0.1 - 因为我已经搜索网络获取客户端地址,你首先检查HTTP_X_FORWARDED_FOR。如果这是空的,那么你得到remote_addr,因为这是返回一个不太准确的IP地址,路由器或...... thx回答btw – thomvlau

+0

也许这就是你的意思http://stackoverflow.com/questions/10413171/i-want -to-try-to-check-the-ip-using-servervariablesremote-addr-but-it-keeps – V4Vendetta

回答

7
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]

只会有一个值,如果该请求是由一个代理转发。通常您将通过使用Request.ServerVariables["REMOTE_ADDR"]来获得客户端IP。

+0

事实上,这并不能解释我调试request.servervariables并检查所有这个列表没有的键包含HTTP_X_FORWARDED_FOR的列表项 – thomvlau

+1

好吧,如果没有涉及代理,头将永远不会存在。如果您正在调试,您最有可能在本地主机上请求,因此不会通过任何类型的代理进行请求。如果您可以,您可以使用Cloudflare作为您的某个域或子域名。他们甚至会在传入的请求中添加更多标题... –

1

请试试这个:

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/

+0

感谢您提供更新,HTTP_X_FORWARDED_FOR可以包含多个地址,但我不建议剪切它并仅使用第一个地址。这应该由开发人员决定如何使用它 – Budda

+2

我相信在Trim()之后的ip分配丢失了。 – Budda

3
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"]; 
} 

这种方法对你也许有用。