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

Apache conditional logging regex (pcre)

我有以下条件:

SetEnvIf X-Forwarded-For ".*, (.+)$" log-format-combinedio-xff-multiple-ips XFF-LAST-IP=
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 header 设置为 comma-separated IP 列表(多个)的请求时,它会设置两个环境变量 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=
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