pajeroquan

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

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;

 

发表于 2017-05-24 09:21  逃亡的山猫  阅读(229)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章: