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

Delphi环境下如何获取代理后的客户端真实IP地址

在Delphi 10.3的SOAP服务中获取代理后的真实客户端IP

要获取代理后的真实客户端IP,核心前提是你的反向代理服务器已经配置了转发真实IP的HTTP头(比如X-Forwarded-For或X-Real-IP)。在此基础上,你可以通过读取HTTP请求头来获取真实IP,修正后的Delphi代码如下:

function TSOAPservice.SOAP_test(id: Integer; user : String): String; stdcall;
var 
  ip_adr : String;
  WebDispatcher: IWebDispatcherAccess;
  ForwardedForList: TStringList;
  I: Integer;
begin
  Result := '';
  if Supports(GetSOAPWebModule, IWebDispatcherAccess, WebDispatcher) then
  begin
    // 优先读取X-Forwarded-For(多级代理时会以逗号分隔多个IP)
    ip_adr := WebDispatcher.Request.GetFieldByName('HTTP_X_FORWARDED_FOR');
    if ip_adr <> '' then
    begin
      ForwardedForList := TStringList.Create;
      try
        ForwardedForList.Delimiter := ',';
        ForwardedForList.StrictDelimiter := True;
        ForwardedForList.DelimitedText := ip_adr;
        // 提取第一个非空的有效IP(去除空格)
        for I := 0 to ForwardedForList.Count - 1 do
        begin
          ip_adr := Trim(ForwardedForList[I]);
          if ip_adr <> '' then
            Break;
        end;
      finally
        ForwardedForList.Free;
      end;
    end
    else
    begin
      // 若X-Forwarded-For为空,尝试读取X-Real-IP(部分代理/CDN使用此字段)
      ip_adr := WebDispatcher.Request.GetFieldByName('HTTP_X_REAL_IP');
      if ip_adr = '' then
      begin
        // 最终 fallback 到代理服务器IP
        ip_adr := WebDispatcher.Request.RemoteAddr;
      end;
    end;
    Result := ip_adr;
  end;
end;

关键注意事项

  • 代理配置是核心:如果代理未配置转发真实IP的HTTP头,上述代码无法获取到真实IP。以Nginx为例,需要在代理配置中添加:
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Real-IP $remote_addr;
    
  • 处理多级代理:X-Forwarded-For字段可能包含多个IP(格式为客户端IP, 一级代理IP, 二级代理IP),代码中通过拆分字符串并取第一个非空IP来获取真实客户端地址。
  • 兼容不同代理:部分CDN或代理会使用X-Real-IP直接传递真实IP,因此加入了此字段的判断作为补充。

内容的提问来源于stack exchange,提问作者Jaroslav Dibitanzl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:10:37