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 字段信息即可,参看如下示例代码。
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);
}
function getRemoteIP()
{
if (!isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
return $_SERVER["REMOTE_ADDR"]; /* 兼容已有程序 */
}
return $_SERVER["HTTP_X_FORWARDED_FOR"]; /* 返回用户真实 IP */
}
void getRemoteIP()
{
string SourceIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(SourceIP)) {
SourceIP = Request.ServerVariables["REMOTE_ADDR"]; /* 兼容已有程序 */
}
Response.Write(SourceIP); /* 返回用户真实 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)
%>
通过在 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.conf 的 server 项中增加配置:set_real_ip_from,real_ip_header,real_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