我有以下条件:
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-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=$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