我有一个位于负载均衡器后面的Web服务器,我试图让日志的第一个值为$http_x_forwarded_for
(如果存在)或$remote_addr
if {{1是空的(因为有时我会直接点击机器,有时我会从负载均衡器转发)。
我尝试了以下但没有成功:
$http_x_forwarded_for
以及
set $realip $http_x_forwarded_for;
if ($http_x_forwarded_for ~ "") {
set $realip $remote_addr;
}
fastcgi_param REMOTE_ADDR $realip;
(如果我直接点击框,则两者都只记录正确的IP,所有负载均衡点击显示负载均衡器的IP而不是转发的IP)
我也试过
set $realip $remote_addr;
if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") {
set $realip $1;
}
fastcgi_param REMOTE_ADDR $realip;
然后使用map $http_x_forwarded_for $forwardexists {
~*^(?![\s\S]) $http_x_real_ip; ## also tried ~"" and just "" to match empty
default $http_x_forwarded_for;
}
log_format forwardedIP '$forwardexists $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer" '
'"$http_user_agent"' ;
作为我的日志格式,但这只会显示转发的IP,并使所有其他请求完全空白。
有没有办法实现我想要的目标?
答案 0 :(得分:0)
UGH终于明白了,我需要使用:
map $http_x_forwarded_for $forwardexists {
"" $remote_addr;
default $http_x_forwarded_for;
}