我有以下代码:
string ip = Request.ServerVariables["REMOTE_ADDR"];
其中,在测试环境中确实返回用户IP地址,但是当我们将网站部署到生产环境时,此变量具有托管应用程序的服务器的IP。有什么帮助吗?
答案 0 :(得分:25)
我的猜测是中间有一个代理。首先使用HTTP_X_FORWARDED_FOR
,如果为空,则使用REMOTE_ADDR
来自MSDN article:
虽然只检索REMOTE_ADDR服务器变量应该足够了,但我发现在线资源表明这样的代码也应该检查HTTP_X_FORWARDED_FOR变量;如果请求来自翻译地址的代理服务器,则此变量包含正确的地址。如果请求不存在的服务器变量,则ServerVariables属性将返回空字符串。因此,即使我的测试中没有出现此属性,尝试检索其值也不会造成麻烦。
<强>更新强>
如果您的设备已更改为负载均衡器,则应询问他们是否可以通过原始IP。我知道这可以通过微软的ISA服务器完成。
如果这不是一个选项,那么您可以尝试这些其他服务器变量,看看它们是否产生结果:
"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"
答案 1 :(得分:4)
为什么使用旧的VB风格的服务器变量而不是Request.UserHostAddress
?
请参阅MSDN Library。
正如其他人所说,如果不能使请求看起来像是来自原始客户端,那么您将获得反向代理/ SSL终结器的IP地址(至少可以在ISA服务器中使用,并且可能在大多数其他反向代理中。)
如果没有,您将获得客户端的公共地址(可能是客户端站点的路由器地址,因为大多数LAN都是NAT)。
您在生产环境中的设置与测试环境有何不同?
您实际上是在获取Web服务器的IP地址,还是同一网络中的其他服务器的IP地址?
答案 2 :(得分:0)
我认为这是一个古老的问题,但我碰到了它,我想我知道答案。答案比上面那些简单......我今天遇到了同样的问题。我打赌你试图从XMLHTTP调用的页面获取IP,这将返回服务器IP,因为它是发出请求的页面而不是用户。