Nginx变量$remote_addr与$real_ip_remote_addr的区别是什么?
$remote_addr 与 $real_ip_remote_addr 的核心区别
1. $remote_addr 的本质
- 这个变量存的是直接和Nginx建立TCP连接的IP地址。
- 如果用户直接访问Nginx,它就是用户真实的IP;要是请求经过了反向代理、CDN或者负载均衡,那它就变成这些中间节点的IP,不是用户真实IP了。
- 属于Nginx默认自带的变量,不需要额外安装模块。
2. $real_ip_remote_addr 的作用
- 这个变量是
ngx_http_realip_module模块提供的(编译Nginx时要启用,或者动态加载该模块),专门用来在代理场景下保存原来的$remote_addr值。 - 当你配置了
set_real_ip_from(指定信任哪些代理服务器的IP)和real_ip_header(比如从X-Forwarded-For请求头里提取用户真实IP)后,Nginx会把$remote_addr替换成用户真实IP,而原来的代理IP就存在$real_ip_remote_addr里。
配置示例
# 配置realip模块,信任指定网段的代理 set_real_ip_from 192.168.1.0/24; # 从X-Forwarded-For头获取用户真实IP real_ip_header X-Forwarded-For; server { listen 80; server_name example.com; location / { # $remote_addr 此时是用户真实IP,$real_ip_remote_addr 是代理服务器的IP add_header X-User-Real-IP $remote_addr; add_header X-Proxy-Server-IP $real_ip_remote_addr; root /usr/share/nginx/html; } }
简单讲:如果没用到realip模块,$real_ip_remote_addr根本不存在;用了之后,$remote_addr变成用户真实IP,$real_ip_remote_addr保留原来的代理IP。
内容的提问来源于stack exchange,提问作者efreezy
相关产品推荐
相关产品推荐

