Nginx用X-Forwarded-For替换REMOTE_ADDR

Rev*_*erb 17 php nginx

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

我尝试做的是设置$_SERVER['REMOTE_ADDR'];,$_SERVER['X-Forwarded-For'];但我得到一个未定义的索引错误,所以我猜我必须X-Forwarded-For在Nginx中定义?但我不知道怎么做,我有一个简单的设置,它只是Nginx与PHP.没有更多,没有更少.

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

我有权访问源代码,如果这有点帮助.我尝试了很多解决方案,但无济于事.

Raz*_*ore 15

这样做的正确方法是real_ip_header在nginx中设置配置.

可信HTTP代理IP的示例:

set_real_ip_from 127.0.0.1/32;
real_ip_header X-Forwarded-For;
Run Code Online (Sandbox Code Playgroud)

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

文档链接 - nginx.org


fre*_*rik 8

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

所以通过在你的regex中使用nginx.conf,你可以像这样设置REMOTE_ADDR第一个ip $http_x_forwarded_for:

  set $realip $remote_addr;
  if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") {
    set $realip $1;
  }
  fastcgi_param REMOTE_ADDR $realip;
Run Code Online (Sandbox Code Playgroud)


ant*_*tov 6

对@fredrik 的回答的补充。
设置$real_ipusingmap指令可能更好:

map $http_x_forwarded_for $real_ip {
        ~^(\d+\.\d+\.\d+\.\d+) $1;
        default $remote_addr;
    }
Run Code Online (Sandbox Code Playgroud)

然后,fastcgi_param REMOTE_ADDRfastcgi_params文件或位置块中设置:

fastcgi_param  REMOTE_ADDR          $real_ip;
Run Code Online (Sandbox Code Playgroud)

编辑:在变量名称中修复了错别字


Rev*_*erb -1

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

fastcgi_param REMOTE_ADDR $http_x_forwarded_for;
Run Code Online (Sandbox Code Playgroud)

  • 不要这样做。如果原始客户端发送 X-Forwarded-For 标头(代理执行此操作),则此操作将会失败,因为这样您的 REMOTE_ADDR 将具有 2 个逗号分隔的 IP。 (5认同)
  • 这是一种方法,但是如何处理请求不通过代理传入的情况,例如来自“localhost”的测试请求? (2认同)