Wie liest man einen Custom Header von einem Upstream-Server in Nginx?

Veröffentlicht 17. Oktober 2024

Problem: Lesen von benutzerdefinierten Headers von Upstream-Servern in Nginx

Nginx, ein Webserver und Reverse-Proxy, muss manchmal auf benutzerdefinierte Headers von Upstream-Servern zugreifen. Diese Headers können wichtige Informationen für die Anfrageverarbeitung oder das Logging enthalten. Standardmäßig gibt Nginx nicht automatisch alle Upstream-Headers weiter oder macht sie zugänglich, was für Administratoren, die diese Daten benötigen, problematisch sein kann.

Nginx-Lösung zum Lesen benutzerdefinierter Headers

Verwendung von Nginx-Variablen für den Header-Zugriff

Nginx bietet eine Möglichkeit, auf benutzerdefinierte Headers von Upstream-Servern zuzugreifen. Diese Methode verwendet Nginx-Variablen, die in verschiedenen Teilen der Nginx-Konfiguration verwendet werden können.

Um auf benutzerdefinierte Headers zuzugreifen, verwendet Nginx ein Präfix: $senthttp. Dieses Präfix ermöglicht es, Variablen zu erstellen, die bestimmten vom Upstream-Server gesendeten Headers entsprechen. Dem Präfix folgt der Name des Headers, auf den Sie zugreifen möchten, wobei Bindestriche durch Unterstriche ersetzt werden.

Um beispielsweise auf einen benutzerdefinierten Header namens "My-Custom-Header" zuzugreifen, würden Sie die Nginx-Variable $sent_http_My_Custom_Header verwenden. Diese Variable enthält den Wert des vom Upstream-Server gesendeten "My-Custom-Header".

Diese Methode funktioniert für jeden benutzerdefinierten Header und ist damit ein nützliches Werkzeug für Nginx-Administratoren, die mit verschiedenen Arten von Upstream-Server-Antworten arbeiten müssen.

Beispiel: Logging benutzerdefinierter Headers

Um den Wert eines benutzerdefinierten Headers im Nginx-Zugriffslog zu protokollieren, können Sie ihn zur log_format-Anweisung in Ihrer Nginx-Konfiguration hinzufügen:

log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$sent_http_My_Custom_Header"';

access_log /var/log/nginx/access.log custom;

Diese Konfiguration wird den Wert des "My-Custom-Header" in jedem Log-Eintrag einschließen.

Schritt-für-Schritt-Anleitung zum Lesen benutzerdefinierter Headers

Identifizieren des benutzerdefinierten Headers

Um benutzerdefinierte Headers in Nginx zu lesen, müssen Sie den Header in der Antwort des Upstream-Servers finden. Benutzerdefinierte Headers werden oft vom Upstream-Server (wie Apache oder einem Anwendungsserver) hinzugefügt, um zusätzliche Informationen bereitzustellen.

In diesem Beispiel lautet der benutzerdefinierte Header:

My-custom-header: 1

Dieser Header ist Teil der HTTP-Antwort vom Upstream-Server. Beachten Sie den Namen und das Format des benutzerdefinierten Headers, da Sie diese Informationen benötigen, um in Nginx darauf zuzugreifen.

Tipp: Namenskonventionen für Header

Verwenden Sie bei der Erstellung benutzerdefinierter Header eine einheitliche Namenskonvention. Eine gängige Praxis ist es, Ihre benutzerdefinierten Header mit 'X-' zu präfixieren (z.B. X-My-Custom-Header). Dies hilft, sie von Standard-HTTP-Headern zu unterscheiden und vermeidet potenzielle Konflikte.

Erstellen der Nginx-Variable

Nachdem Sie den benutzerdefinierten Header gefunden haben, müssen Sie die korrekte Nginx-Variable erstellen, um auf seinen Wert zuzugreifen. Nginx verwendet ein spezifisches Format für Variablen, die Antwort-Header darstellen:

  1. Beginnen Sie mit dem Präfix $sent_http_
  2. Fügen Sie den Header-Namen hinzu und ersetzen Sie Bindestriche durch Unterstriche
  3. Der Variablenname ist nicht case-sensitive

Für den benutzerdefinierten Header "My-custom-header" wäre die korrekte Nginx-Variable:

$sent_http_My_custom_header

Diese Variable enthält den Wert des vom Upstream-Server gesendeten "My-custom-header". In diesem Fall würde sie den Wert "1" enthalten.

Implementierung des benutzerdefinierten Headers in der Nginx-Konfiguration

Hinzufügen des Headers zum Nginx-Location-Block

Um die benutzerdefinierte Header-Variable in einem Location-Block zu verwenden, fügen Sie sie zu Ihrer Nginx-Konfigurationsdatei hinzu. Dies ermöglicht den Zugriff auf den Header-Wert innerhalb dieses Standorts.

Hier sehen Sie, wie Sie die benutzerdefinierte Header-Variable in einem Location-Block verwenden können:

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;

    # Zugriff auf den Wert des benutzerdefinierten Headers
    add_header X-Custom-Header-Value $sent_http_My_custom_header;
}

In dieser Konfiguration wird der Wert des benutzerdefinierten Headers "My-custom-header" vom Upstream-Server der an den Client gesendeten Antwort mittels der add_header-Direktive hinzugefügt.

Tipp: Benutzerdefinierte Header protokollieren

Um benutzerdefinierte Header zu debuggen oder zu überwachen, können Sie sie in Nginx's Zugriffslog protokollieren:

log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$sent_http_My_custom_header"';

access_log /var/log/nginx/access.log custom;

Dies fügt den Wert des benutzerdefinierten Headers in jeden Log-Eintrag ein, was das Nachverfolgen und Debuggen erleichtert.

Verwendung benutzerdefinierter Headers in bedingten Anweisungen

Sie können Werte benutzerdefinierter Header in bedingten Anweisungen in Ihrer Nginx-Konfiguration verwenden. Dies ermöglicht es Ihnen, Entscheidungen basierend auf dem Header-Wert zu treffen.

Hier sind Beispiele für die Verwendung benutzerdefinierter Header in bedingter Logik:

  1. Weiterleitung basierend auf dem Header-Wert:
location / {
    if ($sent_http_My_custom_header = "1") {
        return 301 /special-page;
    }
    # Reguläre Verarbeitung wird hier fortgesetzt
}
  1. Modifizieren der Antwort basierend auf dem Header-Wert:
location / {
    proxy_pass http://backend;

    if ($sent_http_My_custom_header = "premium") {
        add_header X-User-Type "Premium";
    }
}
  1. Zugriffssteuerung basierend auf dem Header-Wert:
location /restricted {
    if ($sent_http_My_custom_header != "authorized") {
        return 403;
    }
    # Autorisierter Zugriff wird hier fortgesetzt
}

Diese Beispiele zeigen, wie Sie den Wert des benutzerdefinierten Headers verwenden können, um das Verhalten Ihres Nginx-Servers zu steuern und komplexere und dynamischere Konfigurationen basierend auf Upstream-Server-Antworten zu ermöglichen.