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

解析和操作http头并将其添加到Nginx中的访问日志,nginx,http-headers,Nginx,Http Headers,我想配置nginx,以便它解析http头并向访问日志添加新的解析字符串。以下是我需要的具体场景: 传入请求中有X-Forwarded-For标头,其中包含多个IP(客户端IP+一些代理服务器IP) 以下是my nginx中的log_格式配置: log_format main '{"timestamp":"$time_iso8601",' '"clientIp":"$http_x_forwarded_for",'

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

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

以下是my nginx中的log_格式配置:

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


提前感谢,感谢您的帮助

指令
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"}';

看到这有用了。

为什么不直接记录整个标题?嗨@Richard,我需要上面正则表达式的一些特殊形式;如果X-Forwarded-For标头中有多个ip地址,则上述正则表达式将返回除第一个ip地址之外的所有列表。如何才能检索X-Forwareded-For标头中的最后一个ip?(例如X-Forwarded-For=1.1.1.1、2.2.2、3.3.3.3,我只需要返回“3.3.3.3”)提前感谢。我添加了一个替代正则表达式。
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_ip>[0-9.]+)$" "proxy";