解析并操作http标头并将其添加到Nginx中的访问日志中

时间:2016-06-09 08:50:50

标签: nginx http-headers

我想配置nginx,以便解析http标头并添加新的解析字符串来访问日志。以下是我需要的具体方案:

传入请求中有X-Forwarded-For标头,其中包含多个IP(客户端的IP +某些代理服务器IP)。

X-Forwarded-For = "1.2.3.4, 5.6.7.8"

这是我的nginx中的log_format配置:

log_format  main  '{"timestamp":"$time_iso8601",'
                        '"clientIp":"$http_x_forwarded_for",'
                        '"conSerial":"$connection",'
                        '"agent":"$http_user_agent"}';

我想要的是解析X-Forwarded-For标头和提取代理服务器的IP,并以日志格式添加它,并使用如下的单独标签:

log_format  main  '{"timestamp":"$time_iso8601",'
                            '"clientIp":"$http_x_forwarded_for",'
                            '"proxy": "5.6.7.8",'
                            '"conSerial":"$connection",'
                            '"agent":"$http_user_agent"}';

注意1.2.3.4是客户端真正的ip,5.6.7.8是代理服务器的ip。

在此先感谢,任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

map指令可以使用命名捕获构造所需的变量。例如:

map $http_x_forwarded_for $proxy_label {
    default               "";
    "~, (?<proxy_ip>.*)$" "proxy";
}

log_format  main  '{"timestamp":"$time_iso8601",'
    '"clientIp":"$http_x_forwarded_for",'
    '"$proxy_label":"$proxy_ip",'
    '"conSerial":"$connection",'
    '"agent":"$http_user_agent"}';

如果没有匹配,你可以使用$proxy_label做一些聪明的事。

有关详细信息,请参阅this document

编辑:要匹配该行的最后一个IP地址,您只能捕获.和这样的数字......

"~(?<proxy_ip>[0-9.]+)$" "proxy";

请参阅此有用的resource for regular expressions