You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

站点部署后查询公网IP返回服务器IP而非客户端IP如何解决

根本原因

你当前的代码逻辑是由运行代码的设备主动发起对公网IP查询接口的请求,接口会返回发起请求的设备的公网IP:

  • 本地运行时,代码跑在你的个人电脑上,请求从你本机发出,返回的是你电脑的公网IP,刚好符合预期
  • 部署到服务器后,代码跑在服务端,请求从服务器发出,自然只会返回服务器的公网IP,和访问站点的客户端没有任何关联,所以你更换再多公网IP查询接口也无法解决问题,和接口本身无关。
正确实现方案

可以根据你的业务场景选择以下两种方案:

方案1:服务端从客户端请求中提取IP(准确率更高,推荐)

客户端访问你的站点时,发起的HTTP请求本身就携带了自身的IP信息,不需要额外调用第三方公网查询接口:

  • 无代理部署的场景下,直接读取HTTP请求的远程地址属性即可拿到客户端IP
  • 内部托管的服务器通常会前置反向代理、负载均衡等网关设备,需要先配置网关开启IP透传,将真实客户端IP存入X-Forwarded-For请求头,服务端再从该请求头中读取IP即可。

ASP.NET 服务端获取客户端IP参考代码:

public string GetClientIp(HttpRequest request)
{
    // 优先读取代理透传的真实客户端IP
    var forwardedHeader = request.Headers["X-Forwarded-For"].FirstOrDefault();
    if (!string.IsNullOrWhiteSpace(forwardedHeader))
    {
        // X-Forwarded-For多IP场景下第一个为真实客户端IP
        return forwardedHeader.Split(',')[0].Trim();
    }
    // 无代理场景直接读取远程IP
    return request.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "未知IP";
}

方案2:前端侧执行IP查询逻辑

如果不想调整服务端架构配置,可以把IP查询逻辑转移到前端实现:

  • 前端代码运行在用户的浏览器中,由前端直接请求公网IP查询接口,拿到的就是当前访问用户的公网IP
  • 前端拿到IP后再按需传给后端服务使用即可,该方案实现简单,但如果用户使用代理工具,拿到的会是代理节点IP,准确率低于方案1。

内容的提问来源于stack exchange,提问作者Ng Zheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:54:04