2016-06-09 10 views
1

Ich möchte nginx so konfigurieren, dass es die HTTP-Header analysiert und neue geparste Strings zu Zugriffsprotokollen hinzufügt. Hier ist das spezifische Szenario, das ich brauche:HTTP-Header analysieren und bearbeiten und dem Zugriffsprotokoll hinzufügen Nginx

Es gibt X-Forwarded-For Header in eingehenden Anfragen, die mehrere IP enthält (Clients IP + einige Proxy-Server-IPs). Hier

X-Forwarded-For = "1.2.3.4, 5.6.7.8" 

ist log_format Konfiguration in meinem nginx:

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

Was ich hier will, ist X-Forwarded-For-Header und extrahieren Proxy-Server die IP-und fügen Sie sie in Protokollformat mit einem sepearate Tag analysieren wie dies:

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

Beachten Sie, dass 1.2.3.4 Clients echte IP ist und 5.6.7.8 ist Proxy-Server-IP.

Vielen Dank im Voraus, jede Hilfe wird geschätzt.

+0

Warum nicht nur ganze Header protokollieren? –

Antwort

1

Die Direktive map kann mithilfe eines benannten Captures die Variablen erstellen, die Sie benötigen. Zum Beispiel:

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"}'; 

Sie könnten etwas Gescheites mit $proxy_label tun, wenn es keine Übereinstimmung gibt, oder nicht.

Weitere Informationen finden Sie unter this document.

EDIT: Um auf der Linie, die die letzte IP-Adresse übereinstimmen, können Sie erfassen nur . und die Ziffern so ...

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

diese nützlichen resource for regular expressions See.

+0

Vielen Dank @Richard. Es hat sehr gut funktioniert. –

+0

Hallo @Richard, ich brauche eine spezielle Form von oben regulärem Ausdruck; Bei mehreren IP-Adressen in X-Forwarded-For -Header gibt der obige Regex die gesamte Liste mit Ausnahme der ersten IP-Adresse zurück. Wie kann ich die letzte IP im X-Forwarded-For-Header abrufen? (z. B. X-Forwarded-For = 1.1.1.1, 2.2.2.2, 3.3.3.3 und ich brauche nur "3.3.3.3" zurückgegeben werden) Vielen Dank im Voraus. –

+0

Ich habe einen alternativen regulären Ausdruck hinzugefügt. –