为什么ServerVariable["REMOTE_ADDR"]返回服务器IP ?

本文关键字:quot 返回 服务器 IP REMOTE ServerVariable 为什么 ADDR | 更新日期: 2023-09-27 18:04:11

我有以下代码:

string ip = Request.ServerVariables["REMOTE_ADDR"];

在测试环境中返回用户IP地址,但是当我们将网站部署到生产环境中时,该变量具有承载应用程序的服务器的IP。任何帮助吗?

为什么ServerVariable["REMOTE_ADDR"]返回服务器IP ?

我猜中间有一个代理。首先使用HTTP_X_FORWARDED_FOR,如果它为空,然后使用REMOTE_ADDR

来自MSDN文章:

虽然只检索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"

为什么使用旧的,vb风格的服务器变量而不是Request.UserHostAddress ?

参见MSDN库。

正如其他人所说,如果请求看起来不像来自原始客户端,您将获得反向代理/SSL终止器的IP地址(至少在ISA服务器中是可能的,可能在大多数其他反向代理中也是如此)。

如果没有,您将获得客户端的公共地址(这可能是客户端站点的路由器地址,因为大多数局域网都是NAT-ed的)。

您在生产环境中的设置与测试环境中的设置有何不同?

您实际上是在获取Web服务器的IP地址,还是同一网络中的其他服务器的IP地址?

我知道这是一个老问题,但我偶然发现它,我想我知道答案。答案比上面的更简单……我今天也遇到了同样的问题。我敢打赌,您正试图从XMLHTTP调用的页面获取IP,该页面将返回服务器IP,因为它是发出请求的页面,而不是用户。

相关文章: