nginx反向代理获取用户真实ip

IT
IT
IT
335
文章
1
评论
2020年5月21日14:04:56 评论 1,451 957字阅读3分11秒

提要

nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,那么如何转发用户的真实IP到后端程序呢?
当前端使用nginx代理,后端使用php-fpm时,如果还是使用$_SERVER['REMOTE_ADDR'],那么php程序获取到的是nginx的ip地址,而不是用户的真实ip。

 

配置

upstream www.264.cn {
 ip_hash;
 server serving-server1.com:80;
 server serving-server2.com:80;
}
server {
 listen www.264.cn:80;
 server_name www.264.cn;
 
 location / {
 proxy_pass http://www.264.cn;
 }
 
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
}

在nginx的配置文件中加入下面三个指令,这样后端php就可以使用$_SERVER['HTTP_X_REAL_IP']获取到访客的ip。

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

如果你想使用$_SERVER['REMOTE_ADDR'],不想修改代码,那么可以通过修改REMOTE_ADDR的值来实现。

经过多层代理后 $http_x_forwared_for 会含有多个ip,其中第一个ip是客户端的ip,REMOTE_ADDR只能是客户端的ip,所以可以用正则提取 $http_x_forwarded_for的第一个ip给REMOTE_ADDR:

 set $realip $remote_addr;
 if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") {
 set $realip $1;
 }
 fastcgi_param REMOTE_ADDR $realip;

 

2018100916231233

 

继续阅读
  • 我的QQ
  • QQ扫一扫
  • weinxin
  • 我的头条
  • 头条扫一扫
  • weinxin
IT
  • 本文由 发表于 2020年5月21日14:04:56
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
部署Nginx负载均衡器【待续】 nginx

部署Nginx负载均衡器【待续】

kube-apiserver高可用架构图 涉及软件 Keepalived是一个主流高可用软件,基于VIP绑定实现服务器双机热备,在上述拓扑中, Keepalived主要根据Nginx运行状态判断是否需...
Nginx正向代理配置 nginx

Nginx正向代理配置

通过把Nginx设置为正向代理,我们就可以在局域网中用运行着Nginx的主机作为正向代理服务器了。那什么是正向代理和反向代理呢?正向代理和反向代理-百度百科 正向代理:如果把局域网外的Internet...