【发布时间】:2019-11-13 09:15:26
【问题描述】:
我正在开发一个 ASP.NET 项目,我需要确定客户端的 IP 地址。
目前,我们的生产服务器上有以下代码
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
返回与生产服务器的 IP 地址在同一子网中的 IP 地址(即,没有解决我的问题,因为它不是 客户端的 IP 地址)。
但是,在我们的测试服务器上,同一行代码会返回客户端的 IP 地址(所需的结果)。有人知道为什么吗?
我尝试在以下值中使用上述代码行,所有这些值都返回 null 或空字符串:
"HTTP_X_COMING_FROM"
"HTTP_X_FORWARDED_FOR"
"HTTP_X_FORWARDED"
"HTTP_X_REAL_IP"
"HTTP_VIA"
"HTTP_COMING_FROM"
"HTTP_FORWARDED_FOR"
"HTTP_FORWARDED"
"HTTP_FROM"
"HTTP_PROXY_CONNECTION"
"CLIENT_IP"
"FORWARDED"
作为替代方案,我发现以下代码确实返回了一个 IP 数组并包含客户端的 IP 地址(在索引 4 处):
string strHostName = System.Net.Dns.GetHostName();
IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
string ip = addr[4] != null ? addr[4].ToString() : "";
在调试时,我注意到 addr 中的 IPAddress 对象有 (A) 地址错误(如果它是 IPv6 地址)或 (B) ScopeId 错误 如果它是 IPv4 地址。这些错误似乎不是问题,但我不确定它们在生产中是否重要。
有没有比我这里更好的方法来获取客户端的 IP 地址?
【问题讨论】:
-
您的生产流量是否通过负载均衡器?它可以将
REMOTE_ADDR替换为负载均衡器的地址。可能需要将负载均衡器配置为将原始 IP 地址添加到HTTP_X_FORWARDED_FOR。