CDN用户IP获取真实IP方法代码示例:基于Nginx实现
在使用CDN(内容分发网络)的场景中,由于CDN节点会作为用户与源站之间的中间层,源站接收到的请求IP通常是CDN节点的IP,而非用户的真实IP。这对于一些需要根据用户真实IP进行业务处理的场景,如访问控制、统计分析等带来了困扰。Nginx作为一款高性能的Web服务器和反向代理服务器,提供了一些方法来获取CDN用户的真实IP。

我们需要了解CDN在转发请求时,通常会在HTTP头中添加一些额外的信息来标识用户的真实IP。常见的HTTP头字段有X - Forwarded - For和X - Real - IP。X - Forwarded - For是一个标准的HTTP头字段,用于记录请求经过的代理服务器的IP地址,格式为多个IP地址用逗号分隔,第一个IP地址通常就是用户的真实IP。X - Real - IP则是一些CDN服务商自定义的字段,直接记录用户的真实IP。
在Nginx中,我们可以通过配置来获取这些HTTP头字段中的真实IP信息。以下是一个简单的Nginx配置示例:
```nginx
server {
listen 80;
server_name example.com;
# 获取X - Forwarded - For中的真实IP
set $client_real_ip $http_x_forwarded_for;
if ($client_real_ip ~ "^([0-9.]+),") {
set $client_real_ip $1;
}
# 或者获取X - Real - IP
if ($http_x_real_ip) {
set $client_real_ip $http_x_real_ip;
}
access_log /var/log/nginx/access.log main;
location / {
# 将真实IP记录到日志中
add_header X - Real - Client - IP $client_real_ip;
# 其他配置...
}
}
```
在上述配置中,我们首先尝试从X - Forwarded - For头字段中获取真实IP。由于X - Forwarded - For可能包含多个IP地址,我们使用正则表达式提取第一个IP地址作为用户的真实IP。如果X - Forwarded - For头字段不存在,我们再尝试从X - Real - IP头字段中获取真实IP。
我们还可以通过Nginx的`real_ip_header`和`set_real_ip_from`指令来配置Nginx自动处理真实IP。以下是一个示例:
```nginx
http {
# 配置CDN节点的IP段
set_real_ip_from 192.0.2.0/24;
set_real_ip_from 203.0.113.0/24;
real_ip_header X - Forwarded - For;
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/access.log main;
location / {
# Nginx会自动将真实IP设置到$remote_addr变量中
add_header X - Real - Client - IP $remote_addr;
# 其他配置...
}
}
}
```
在这个配置中,我们使用`set_real_ip_from`指令指定CDN节点的IP段,使用`real_ip_header`指令指定包含真实IP的HTTP头字段。Nginx会自动检查请求的来源IP是否在指定的IP段内,如果是,则从指定的HTTP头字段中提取真实IP,并将其设置到`$remote_addr`变量中。
除了上述配置方法,我们还可以在Nginx中使用Lua脚本来处理真实IP。以下是一个简单的Lua脚本示例:
```lua
local real_ip = ngx.var.http_x_forwarded_for
if real_ip then
local first_ip = string.match(real_ip, "^([0-9.]+),")
if first_ip then
real_ip = first_ip
end
else
real_ip = ngx.var.http_x_real_ip
end
ngx.header["X - Real - Client - IP"] = real_ip
```
在这个Lua脚本中,我们首先尝试从X - Forwarded - For头字段中获取真实IP,如果存在多个IP地址,我们提取第一个IP地址。如果X - Forwarded - For头字段不存在,我们再尝试从X - Real - IP头字段中获取真实IP。我们将真实IP设置到响应头中。
通过以上这些方法,我们可以在Nginx中有效地获取CDN用户的真实IP,从而满足不同业务场景的需求。无论是使用Nginx的配置指令还是Lua脚本,都可以根据实际情况选择合适的方法来处理真实IP。在使用这些方法时,需要注意确保CDN节点的IP段配置正确,以避免安全风险。






