Fikker首页 -> 帮助系统 -> 如何获取用户真实 IP 地址 X-Forwarded-For

特别说明:

a、Fikker 通过 HTTP 头 X-Forwarded-For 传递用户真实 IP 地址给源站,例如:X-Forwarded-For: 21.23.44.78 。
b、如果经过 Fikker 多次代理/转发,例如:X-Forwarded-For: 21.23.44.78, 156.24.66.231,这时用户真实 IP 地址一般为第一个,即 21.23.44.78 。
c、所以如果网站要获得用户真实 IP 地址,源站程序实现读取 Fikker 转递的 HTTP 头 X-Forwarded-For 字段信息即可,参看如下示例代码。

java 获得用户真实 IP 代码举例:

public String getRemoteIP(HttpServletRequest request)
{
    if (request.getHeader("X-Forwarded-For") == null) {
        return request.getRemoteAddr(); /* 兼容已有程序 */
    }

    int first = request.getHeader("X-Forwarded-For").indexOf(",");

    if (first == -1) {
        return request.getHeader("X-Forwarded-For");
    }

    /* 返回用户真实 IP, 如为多个 IP 时, 则取第一个. */
    return request.getHeader("X-Forwarded-For").substring(0, first);
}

 

php 获得用户真实 IP 代码举例:

function getRemoteIP()
{
    if (!isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
        return $_SERVER["REMOTE_ADDR"]; /* 兼容已有程序 */
    }

    return $_SERVER["HTTP_X_FORWARDED_FOR"]; /* 返回用户真实 IP */
}

 

asp.net 获得用户真实 IP 代码举例:

void getRemoteIP()
{
    string SourceIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (string.IsNullOrEmpty(SourceIP)) {
        SourceIP = Request.ServerVariables["REMOTE_ADDR"]; /* 兼容已有程序 */
    }

    Response.Write(SourceIP); /* 返回用户真实 IP */
}

 

asp 获得用户真实 IP 代码举例:

<%
Private Function getRemoteIP()
Dim strIPAddr
If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), "unknown") > 0 Then
strIPAddr = Request.ServerVariables("REMOTE_ADDR")
ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",") > 0 Then
strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",")-1)
ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";") > 0 Then
strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";")-1)
Else
strIPAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
End If
getIP = Trim(Mid(strIPAddr, 1, 30))
End Function

ip=getRemoteIP()
response.write(ip)
%>

 

用户自定义 HTTP 字段用来传递客户端 IP 地址

通过在 SetHeader 插件增加自定义 HTTP 字段用于传递客户端 IP 地址, 举例如下:

1. 修改 ~/plugins/SetHeader.ini 插件配置, 自定义一个新字段 X-Tenant-Forward-For 用于传递客户端 IP 地址:

2. 开启此插件, 并重启 Fikker 进程生效, 详细查看 <如何开启自定义 HTTP 头插件 SetHeader>

 

源站为 nginx 时, 如不改动源站程序, 如何配置来获得真实用户 IP 地址:

1. 在 nginx 下面,需要用到 ngx_http_realip_module 插件模块,需要注意的是nginx 默认编译是不带这个插件模块的,如果重新编译 nginx 需带上 --with-http_realip_module 编译配置项。

2. 满足上面的条件,可在配置文件 nginx.confserver 项中增加配置:set_real_ip_fromreal_ip_headerreal_ip_recursive

server {
    listen 80;
    server_name 123.com;

    ...

    set_real_ip_from   211.155.23.66;    # Fikker 服务器 IP 地址
    set_real_ip_from   181.75.54.132;    # Fikker 服务器 IP 地址
    set_real_ip_from   192.168.180.0/24; # Fikker 服务器 IP 地址段
    real_ip_header     X-Forwarded-For;  # 固定配置为 X-Forwarded-For
    real_ip_recursive  on;               # 固定配置为 on
}

配置解析:
set_real_ip_from - 允许有多个列表项,每一个列表项指定一个 Fikker 服务器 IP 地址(段)。
real_ip_header - 固定为 X-Forwarded-For,用于从这个 HTTP 字段中获得原始用户 IP 地址。
real_ip_recursive - 固定指定为 on, 标识 set_real_ip_from 中指定的服务器 IP 是不能当作原始用户的 IP 地址的。

3. 对应的 nginx 官方参考说明为: http://nginx.org/en/docs/http/ngx_http_realip_module.html