Apache 条件日志记录正则表达式 (pcre)



我有以下条件:

SetEnvIf X-Forwarded-For ".*, (.+)$" log-format-combinedio-xff-multiple-ips XFF-LAST-IP=$1
SetEnvIf X-Forwarded-For "[^,]+" log-format-combinedio-xff-single-ip
SetEnvIf X-Forwarded-For "^$" log-format-combinedio
CustomLog "|/usr/bin/rotatelogs -f /var/log/apache2/access_log.%Y%m%d%H%M%S 604800" combinedio-xff-multiple-ips env=log-format-combinedio-xff-multiple-ips
CustomLog "|/usr/bin/rotatelogs -f /var/log/apache2/access_log.%Y%m%d%H%M%S 604800" combinedio-xff-single-ip env=log-format-combinedio-xff-single-ip
CustomLog "|/usr/bin/rotatelogs -f /var/log/apache2/access_log.%Y%m%d%H%M%S 604800" combinedio env=log-format-combinedio

但是,当我发送将 X-Forwarded-For 标头设置为逗号分隔的 IP 列表(多个(的请求时,它会同时设置 enivronment 变量log-format-combinedio-xff-multiple-ipslog-format-combinedio-xff-single-ip,因此我记录了两次

有什么想法可以解决这个问题吗?

在第二个条件(匹配单个 IP(中,如果添加对字符串的开头 ( ^ ( 和结尾 ( $ ( 的检查以创建以下正则表达式,它将不匹配多个逗号分隔值。

^[^,]+$

它的意思是:从字符串的开头到结尾,匹配一系列非逗号字符。

好的,

我想通了并在这里发布,以防它对其他人有帮助:

第二个SetEnvIf的正则表达式应该是:

SetEnvIf X-Forwarded-For "^[^,]+$" log-format-combinedio-xff-single-ip

这基本上只匹配没有逗号的字符串(如在单个 IP 中(。

所以完整的解决方案是这样的:

SetEnvIf X-Forwarded-For ".*, (.+)$" log-format-combinedio-xff-multiple-ips XFF-LAST-IP=$1
SetEnvIf X-Forwarded-For "^[^,]+$" log-format-combinedio-xff-single-ip
SetEnvIf X-Forwarded-For "^$" log-format-combinedio
CustomLog "|/usr/bin/rotatelogs -f /var/log/apache2/access_log.%Y%m%d%H%M%S 604800" combinedio-xff-multiple-ips env=log-format-combinedio-xff-multiple-ips
CustomLog "|/usr/bin/rotatelogs -f /var/log/apache2/access_log.%Y%m%d%H%M%S 604800" combinedio-xff-single-ip env=log-format-combinedio-xff-single-ip
CustomLog "|/usr/bin/rotatelogs -f /var/log/apache2/access_log.%Y%m%d%H%M%S 604800" combinedio env=log-format-combinedio

最新更新