博主使用 Chevereto 搭建了一个免费公共图床(图床地址:www.imagehub.cc),为了提高国内用户访问速度,使用 Nginx 对 Chevereto 进行反代。反代后发现一个问题,Chevereto 后台看到图片上传用户的 ip 均为反代节点的 ip ,非上传用户的真实 ip 。通过研究,发现后端 php-fpm 使用 $_SERVER['REMOTE_ADDR'] 获取客户端 ip 地址,由于使用了 Nginx 做反代,此种方式下 php 程序获得的客户端 ip 自然而然就是反代节点 ip 。通过修改 REMOTE_ADDR 值可以解决这个问题,以下是具体方法。

反代节点 Nginx 配置

为了正确传递客户端的 ip 地址,反代节点的 Nginx 配置中需要增加以下内容:

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 配置

经过多层代理后 $http_x_forwared_for 会含有多个 ip 地址,其中第一个 ip 是客户端的真实 ip ,此值需要赋值给 REMOTE_ADDR ,这样 Chevereto 才能记录上传者的真实 ip 。后端 Nginx 配置中增加以下内容,使用正则表达式提取 $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;

通过以上方法,Chevereto 使用 Nginx 反代后便可获取图片上传用户的真实 ip ,本文结束。

文章目录