Php Nginx用X-Forwarded-For替换远程地址
我对Nginx很陌生,它看起来很混乱。我的服务器设置非常完美,但问题是,因为我的服务器使用HTTP代理进行保护;它不是记录真实用户的IP,而是记录代理服务器的IP 我试着做的是设置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。不多不少 我已经在网上搜索过了,但实际上找不到一些
$\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是可能的。还有什么不能“按原样”工作?