[英]Apache conditional logging regex (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列表(多個)的請求時,它將同時設置環境變量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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.