5

如果我的服务器在路由器后面,如何获取用户的公共 IP?

我正在努力:

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

但我得到的只是路由器网关。

显然,REMOTE_ADDR在我的情况下不起作用,也不会HTTP_X_FORWARDED_FOR

关于如何在我的情况下获取用户的公共 IP 的任何想法?

谢谢。

4

3 回答 3

2

您正在尝试在 HTTP 级别处理 IP 和路由。

应用层,数据包已经通过路由/IP层,并且该信息已被剥离。

您在 HTTP 级别看到的数据包与远程端点在其应用层级别发送的数据包完全相同,没有 IP 信息,因此查看 HTTP 标头对恕我直言无济于事。

编辑:正如@Marc Gravell 所说,一些反向代理确实将此信息添加到 HTTP 标头中。所以你应该检查你的(如果你配置了一个),如果它这样做了。

此答案列出了您可以检查的其他一些服务器变量。

于 2012-11-01T12:34:47.507 回答
0

没有办法得到它。

但是,您可以查看用户是从本地网络还是从 Web 打开页面。

如果 IP 是路由器分配给来自网络的请求的 IP,那么很明显它来自网络。

于 2012-11-10T10:49:23.650 回答
0

唯一可靠的方法是联系互联网上的一些已知服务,它会告诉你它看到你的请求来自哪个 IP。当然,该服务必须继续运行并且可以访问,否则此功能会中断。例如,http://whatismyip.com

于 2012-11-01T12:35:44.337 回答