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