当HTTP请求经过七层代理时,其来源IP地址会被修改为代理地址,而非真实客户端的地址。事实上,客户端的IP地址通常被写入HTTP请求头的x-forwarded-for字段中。

阿里云Web应用防火墙的工作原理如下。

假设Web应用防火墙防护的域名为“www.abc.com”。那么,从客户端发出的请求依次经过以下节点:客户端浏览器 > Web应用防火墙 > 源站服务器(pache/Nginx/IIS等)。在此结构下,Web应用防火墙扮演源站和客户端之间的反向代理。

然而,在包含多层代理的网络结构下(例如,除过Web应用防火墙还接入了CDN和DDoS高防IP),所有代理的IP地址都会被添加在x-forwarded-for字段中。这是因为每经过一次转发,代理服务器都会写入代理IP地址。

因此,x-forwarded-for字段可能显示为X-Forwarded-For: 客户端IP, 代理IP1, 代理IP2, 代理IP3, ...。其中,客户端IP仍会占据在第一个位置。

操作流程

参照以下步骤,获取客户端真实IP地址:
  1. 请求x-forwarded-for字段内容。
    以下为不同语言的示例代码:
    • ASP

      Request.ServerVariables("HTTP_X_FORWARDED_FOR")

    • ASP.NET(C#)

      Request.ServerVariables["HTTP_X_FORWARDED_FOR"]

    • PHP

      $_SERVER["HTTP_X_FORWARDED_FOR"]

    • JSP

      request.getHeader(“HTTP_X_FORWARDED_FOR”)

  2. 以逗号为分隔符分隔获得的x-forwarded-for内容,第一个IP地址就是客户端真实IP。