Nginx用X-Forwarded-For替换REMOTE_ADDR

时间:2014-09-19 08:32:51

标签: php nginx

我对Nginx很陌生,看起来好像很混乱。我的服务器设置完美,但问题是,因为我的服务器是使用HTTP代理保护的;它不是记录真实用户的IP,而是记录代理服务器IP。

我尝试做的是将$_SERVER['REMOTE_ADDR'];设置为$_SERVER['X-Forwarded-For'];,但我收到了未定义的索引错误,因此我猜测我必须在Nginx中定义X-Forwarded-For ?但是我不知道该怎么做,我有一个简单的设置,它只是带有PHP的Nginx。没什么,没什么。

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

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

4 个答案:

答案 0 :(得分:14)

正确的方法是在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中正确填充。

Documentation link - nginx.org

答案 1 :(得分:8)

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

因此,通过在nginx.conf中使用正则表达式,您可以将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;

答案 2 :(得分:2)

@fredrik的答案的补充。
最好使用$realip指令设置map

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

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

fastcgi_param  REMOTE_ADDR          $real_ip;

答案 3 :(得分:0)

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

fastcgi_param REMOTE_ADDR $http_x_forwarded_for;
相关问题