我对Nginx很陌生,看起来好像很混乱。我的服务器设置完美,但问题是,因为我的服务器是使用HTTP代理保护的;它不是记录真实用户的IP,而是记录代理服务器IP。
我尝试做的是将$_SERVER['REMOTE_ADDR'];
设置为$_SERVER['X-Forwarded-For'];
,但我收到了未定义的索引错误,因此我猜测我必须在Nginx中定义X-Forwarded-For
?但是我不知道该怎么做,我有一个简单的设置,它只是带有PHP的Nginx。没什么,没什么。
我在网上搜索过,但实际上找不到一些易于理解的信息。
如果有所帮助,我可以访问源代码。我尝试了很多解决方案,但无济于事。
答案 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中正确填充。
答案 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;