2016-06-09 38 views
1

我想配置nginx,以便解析http標題並添加新的分析字符串來訪問日誌。以下是我需要的特定場景:解析和操作http標題並將它們添加到Nginx的訪問日誌中

傳入請求中包含多個IP(客戶端IP +某些代理服務器IP)的X-Forwarded-For標頭。

X-Forwarded-For = "1.2.3.4, 5.6.7.8" 

這裏是log_format配置在我的nginx:

log_format main '{"timestamp":"$time_iso8601",' 
         '"clientIp":"$http_x_forwarded_for",' 
         '"conSerial":"$connection",' 
         '"agent":"$http_user_agent"}'; 

我想這裏是解析X - 轉發,對於頭和提取代理服務器的IP,並用sepearate標籤就像它添加日誌格式這:

log_format main '{"timestamp":"$time_iso8601",' 
          '"clientIp":"$http_x_forwarded_for",' 
          '"proxy": "5.6.7.8",' 
          '"conSerial":"$connection",' 
          '"agent":"$http_user_agent"}'; 

請注意,1.2.3.4是客戶端真正的IP和5.6.7.8是代理服務器的IP。

在此先感謝,任何幫助表示讚賞。

+0

爲什麼不只是記錄整個標題? –

回答

1

map指令可以通過使用命名捕獲來構建所需的變量。例如:

map $http_x_forwarded_for $proxy_label { 
    default    ""; 
    "~, (?<proxy_ip>.*)$" "proxy"; 
} 

log_format main '{"timestamp":"$time_iso8601",' 
    '"clientIp":"$http_x_forwarded_for",' 
    '"$proxy_label":"$proxy_ip",' 
    '"conSerial":"$connection",' 
    '"agent":"$http_user_agent"}'; 

當沒有匹配或不匹配時,您可以用$proxy_label做一些巧妙的事情。

有關詳細信息,請參見this document

編輯:爲了配合就行了最後一個IP地址,你可以只捕獲.像這樣的數字......

"~(?<proxy_ip>[0-9.]+)$" "proxy"; 

看到這個有用resource for regular expressions

+0

非常感謝@Richard。它工作得很好。 –

+0

嗨@Richard,我需要一些上面正則表達式的特殊形式;如果X-Forwarded-For頭中有多個IP地址,則上述正則表達式會返回除第一個IP地址以外的所有列表。我如何才能檢索X-Forwareded-For頭中的最後一個IP? (例如X-Forwarded-For = 1.1.1.1,2.2.2.2,3.3.3.3,我只需要返回「3.3.3.3」)預先感謝。 –

+0

我已經添加了一個替代正則表達式。 –

相關問題