簡體   English   中英

Apache條件記錄正則表達式(pcre)

[英]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-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM