在 Nginx 中,$http_x_forwarded_for
变量通常包含了客户端的原始 IP 地址以及可能经过的代理服务器的 IP 地址列表,这些地址由逗号分隔。如果你想从 $http_x_forwarded_for
中截取第一个参数(即最左边的 IP 地址),你可以使用 Nginx 的内置变量处理功能。
下面是一个示例配置,展示了如何截取 $http_x_forwarded_for
的第一个参数:
http {
...
map $http_x_forwarded_for $client_ip {
"" $remote_addr;
~^(?P<first_addr>[^,]+),?.*$ $first_addr;
}
server {
...
location / {
...
set $real_ip $client_ip;
...
}
}
}
在这个配置中:
- 我们使用
map
指令创建了一个名为$client_ip
的新变量,用于存储截取后的 IP 地址。 map
中的正则表达式~^(?P<first_addr>[^,]+),?.*$
用于匹配$http_x_forwarded_for
。这个正则表达式捕获第一个逗号之前的所有内容(即第一个 IP 地址),并将其存储在命名捕获组first_addr
中。- 如果
$http_x_forwarded_for
为空(即没有代理信息),则$client_ip
被设置为$remote_addr
,即客户端直接连接到 Nginx 的 IP 地址。 - 在
server
块中的location
里,我们使用了set
指令将$client_ip
的值赋给了一个新的变量$real_ip
。你可以根据需要修改这个变量名。
现在,你可以在你的 Nginx 配置中使用 $real_ip
变量来引用截取后的第一个 IP 地址。例如,你可以在 log_format
中使用它来记录这个 IP 地址,或者在 access_log
中使用它来记录访问日志。
真实环境示例如下: