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

IT
IT
IT
405
文章
1
评论
2020年5月21日14:04:56 评论 7,721 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正向反向代理区别及原理解析

正向代理和反向代理的区别 正向代理代理客户端,反向代理代理服务器。 1.1正向代理 正向代理服务器位于客户端和服务器之间,为了从服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理...
Nginx代理jumpserver nginx

Nginx代理jumpserver

部署 Nginx 服务 配置 Repo # vi /etc/yum.repos.d/nginx.repo name=nginx stable repo baseurl=http://nginx.org...

您必须才能发表评论!