Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Nginx用X-Forwarded-For替换远程地址_Php_Nginx - Fatal编程技术网

Php Nginx用X-Forwarded-For替换远程地址

Php Nginx用X-Forwarded-For替换远程地址,php,nginx,Php,Nginx,我对Nginx很陌生,它看起来很混乱。我的服务器设置非常完美,但问题是,因为我的服务器使用HTTP代理进行保护;它不是记录真实用户的IP,而是记录代理服务器的IP 我试着做的是设置$\u服务器['REMOTE\u ADDR']到$\u服务器['X-Forwarded-For']但是我得到了一个未定义的索引错误,所以我猜我必须在Nginx中定义X-Forwarded-For?但我不知道如何做到这一点,我有一个简单的设置,它只是与PHP的Nginx。不多不少 我已经在网上搜索过了,但实际上找不到一些

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

我试着做的是设置
$\u服务器['REMOTE\u ADDR']
$\u服务器['X-Forwarded-For']
但是我得到了一个未定义的索引错误,所以我猜我必须在Nginx中定义
X-Forwarded-For
?但我不知道如何做到这一点,我有一个简单的设置,它只是与PHP的Nginx。不多不少

我已经在网上搜索过了,但实际上找不到一些容易理解的信息


如果有帮助的话,我可以访问源代码。我试过很多解决办法,但都没有用

我解决了自己的问题,因为PHP是通过FastCGI过滤的,所以我简单地添加了一个fast CGI参数,该参数将
REMOTE\u ADDR
设置到变量
http\u x\u forwarded\u for
,因此类似于此:

fastcgi_param REMOTE_ADDR $http_x_forwarded_for;

正确的方法是在nginx中设置
real\u ip\u头
配置

使用可信HTTP代理IP的示例:

set_real_ip_from 127.0.0.1/32;
real_ip_header X-Forwarded-For;
通过这种方式,$\u服务器['REMOTE\u ADDR']将在PHP fastcgi中正确填充


可能包含多个ip地址,其中第一个应该是客户端ip<代码>远程地址应仅为客户端ip

因此,通过在
nginx.conf
中使用regex,您可以将
REMOTE\u ADDR
设置为
$http\u x\u forwarded\u的第一个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\u ip

map $http_x_forwarded_for $real_ip {
        ~^(\d+\.\d+\.\d+\.\d+) $1;
        default $remote_addr;
    }
然后,在
fastcgi\u params
文件或位置块中设置
fastcgi\u param REMOTE\u ADDR

fastcgi_param  REMOTE_ADDR          $real_ip;

编辑:变量名中的输入错误是固定的,这是一种方法,但如何处理请求不是通过代理传入的情况,例如来自
localhost
的测试请求?不要这样做。如果原始客户端发送X-Forwarded-For标头(代理执行此操作),则此操作将失败,因为这样您的远程地址将有两个分开的IP。我一直在到处寻找一个实际可行的解决方案。非常感谢你!!!!令人惊叹的!把它放在你的。。服务器{location~\.php${block section.这一切都很有效!!!!干得好!使用
0.0.0/0
::/0
匹配所有ip地址既然不能在
http
块中使用
set
指令,最好改用
map
来匹配。这不按原样工作,也不支持IPv6地址!@LassePoulsen yes,这是一个问题gex只适用于ipv4,但我相信将其修改为ipv6是可能的。还有什么不能“按原样”工作?