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-ips
和 log-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
我有以下条件:
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-ips
和 log-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