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
相关产品推荐
相关产品推荐

