我想配置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。
在此先感谢,任何帮助表示赞赏。
答案 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。