如果$ http_x_forwarded_for存在,则条件nginx日志记录?

时间:2018-03-24 11:17:16

标签: nginx logging

我有一个位于负载均衡器后面的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,并使所有其他请求完全空白。

有没有办法实现我想要的目标?

1 个答案:

答案 0 :(得分:0)

UGH终于明白了,我需要使用:

map $http_x_forwarded_for $forwardexists {
        "" $remote_addr;
        default $http_x_forwarded_for;
        }