$remote_addr 变量可以直接获取客户端的 IP 地址。但是,客户端经过代理服务器,那么 $remote_addr 获取到的将是代理服务器的 IP 地址,而不是真实的客户端 IP 地址。
客户端经过代理服务器,可以使用 $http_x_forwarded_for 变量来获取真实的客户端 IP 地址。但是,需要确保代理服务器已经在请求头中添加 X-Forwarded-For 头部。
Nginx 提供 ngx_http_realip_module 模块,可以通过设置 real_ip_header 和 real_ip_recursive 指令来获取真实的客户端 IP 地址。这种方式适用于客户端经过多层代理的情况。
无论使用哪种方式获取 IP 地址,都需要对获取到的 IP 地址进行校验,以防止非法 IP 地址的访问。可以使用正则表达式或其他方式对 IP 地址进行校验。
在获取和使用客户端 IP 地址时,需要注意安全性,防止 IP 地址被恶意利用。例如,可以限制 IP 地址访问的白名单或黑名单,并对 IP 地址进行一定的处理,如记录日志、限制访问等。