Nginx将REMOTE_ADDR替换为X-Forwarded-For


Nginx replace REMOTE_ADDR with X-Forwarded-For

我对Nginx很陌生,这一切似乎都很令人困惑。我的服务器设置很完美,但问题是,因为我的服务器使用HTTP代理进行保护;它不是记录真实用户的IP,而是记录代理服务器的IP。

我尝试将$_SERVER['REMOTE_ADDR'];设置为$_SERVER['X-Forwarded-For'];,但我遇到了一个未定义的索引错误,所以我想我必须在Nginx中定义X-Forwarded-For?但我不知道如何做到这一点,我有一个简单的设置,它只是Nginx与PHP。没有更多,没有更少。

我在网上搜索过,但实际上找不到一些易于理解的信息。

如果有帮助的话,我可以访问源代码。我尝试了很多解决方案,但都无济于事。

正确的方法是在nginx中设置real_ip_header配置。

可信HTTP代理IP:示例

set_real_ip_from 127.0.0.1/32;
real_ip_header X-Forwarded-For;

这样,$_SERVER['REMOTE_ADDR']将正确地填充在PHP fastcgi中。

文档链接-nginx.org

$http_x_forwared_for可能包含多个ip地址,其中第一个应该是客户端ip。REMOTE_ADDR应仅为客户端ip。

因此,通过在nginx.conf中使用regex,可以将REMOTE_ADDR设置为$http_x_forwarded_for的第一个ip,如下所示:

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

@fredrik答案的补充
使用map指令设置$real_ip可能更好:

map $http_x_forwarded_for $real_ip {
        ~^('d+'.'d+'.'d+'.'d+) $1;
        default $remote_addr;
    }

然后,在fastcgi_params文件或一个位置块中设置fastcgi_param REMOTE_ADDR

fastcgi_param  REMOTE_ADDR          $real_ip;

edit:在变量名中固定的打字

我解决了自己的问题,因为PHP是通过FastCGI过滤的,我只是添加了一个快速CGI参数,将REMOTE_ADDR设置为变量http_x_forwarded_for,所以类似于以下内容:

fastcgi_param REMOTE_ADDR $http_x_forwarded_for;