我对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;