【问题标题】:Why does ServerVariable["REMOTE_ADDR"] returns the server IP?为什么 ServerVariable["REMOTE_ADDR"] 返回服务器 IP?
【发布时间】:2023-03-24 08:43:01
【问题描述】:

我有以下代码:

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

其中,在测试环境中确实返回了用户 IP 地址,但是当我们将网站部署到生产环境时,此变量具有托管应用程序的服务器的 IP。有什么帮助吗?

【问题讨论】:

  • 你期望它返回什么?看到这个:stackoverflow.com/questions/3812166/…
  • @Oded 该stackoverflow 的答案已被接受,并获得了许多赞成票,但仍然是错误的。
  • 同一个HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();Request.UserHostAddress.ToString();

标签: c# .net asp.net


【解决方案1】:

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

MSDN Library

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我的猜测是中间有一个代理。先用HTTP_X_FORWARDED_FOR,如果为null,再用REMOTE_ADDR

      来自MSDN article

      虽然只检索 REMOTE_ADDR 服务器变量就足够了,但我在网上找到了建议这样的代码也应该检查 HTTP_X_FORWARDED_FOR 变量的资源;如果请求来自转换地址的代理服务器,则此变量包含正确的地址。如果您请求一个不存在的服务器变量,ServerVariables 属性将返回一个空字符串。因此,即使这个属性没有出现在我的测试中,尝试检索它的值也不会造成麻烦。

      更新:

      如果您更改了设置的负载均衡器,您应该询问他们是否可以通过原始 IP。我知道这可以通过 Microsoft 的 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"
      

      【讨论】:

      • 它错了,因为如果你有代理,那么它总是给你发送错误的 IP 地址
      • @Bhargav Mistri - 我在多个生产机器上运行了类似的代码。我过去遇到过这种情况,可以向您保证这是由于代理问题造成的。请记住,某些代理服务器可以欺骗 HTTP_X_FORWARDED_FOR 或将其全部关闭。
      • @zeroef 感谢您的帮助。我对 HTTP_X_FOWARD_FOR 进行了更改,但仍然获得相同的 IP。我与基础架构团队进行了交谈,结果发现返回的不是服务器 IP,而是负载均衡器 IP。有什么想法吗?
      • 我测试了所有这些,但是当Web服务器前面有负载平衡时它不起作用。
      • 其他服务器变量 documentation ?任何参考
      猜你喜欢
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2015-06-19
      • 1970-01-01
      • 2017-01-31
      • 2020-02-02
      相关资源
      最近更新 更多