Warum werden HTTP-Headers mit Unterstrichen von Nginx verworfen?

Veröffentlicht 17. Oktober 2024

Problem: HTTP-Header mit Unterstrichen werden von Nginx verworfen

Nginx, ein Webserver und Reverse-Proxy, verwirft standardmäßig HTTP-Header mit Unterstrichen. Dies kann Probleme verursachen, wenn benutzerdefinierte Header oder Dienste von Drittanbietern verwendet werden, die Header mit Unterstrichen nutzen, was zu Datenverlust oder Problemen in Webanwendungen führen kann.

Nginx's standardmäßige Behandlung von Header mit Unterstrichen

Die stille Entfernung: Nginx's Standardverhalten

Nginx verwirft standardmäßig Header mit Unterstrichen. Dies geschieht ohne Warnung oder Fehlermeldung. Wenn Nginx eine Anfrage mit Headern erhält, die Unterstriche enthalten, entfernt es diese Header, bevor die Anfrage an den Backend-Server oder die Anwendung weitergeleitet wird. Diese Entfernung kann Probleme in Webanwendungen verursachen, die diese benutzerdefinierten Header für Funktionen oder Datenübertragungen verwenden.

Die versteckte Natur dieses Prozesses erschwert es Entwicklern und Systemadministratoren, die Ursache von Problemen im Zusammenhang mit fehlenden Header-Daten zu finden. Benutzer könnten Zeit damit verbringen, ihre Anwendungen zu debuggen, ohne zu wissen, dass Nginx ihre benutzerdefinierten Header entfernt. Dieses Standardverhalten kann problematisch sein, wenn mit Diensten oder APIs von Drittanbietern gearbeitet wird, die Header mit Unterstrichen verwenden, da es den Informationsfluss zwischen Systemen stören kann.

Tipp: Nginx-Konfiguration überprüfen

Um zu überprüfen, ob Nginx Header mit Unterstrichen verwirft, können Sie einen benutzerdefinierten Header mit einem Unterstrich in Ihrer Client-Anfrage hinzufügen und dann einen Backend-Logging-Mechanismus oder ein Debugging-Tool verwenden, um zu prüfen, ob der Header Ihre Anwendung erreicht. Wenn der Header fehlt, wird er wahrscheinlich von Nginx verworfen.

Die Ursache: CGI-Erbe und Header-Mapping

Historischer Kontext: CGI-Variablen und Header-Konvertierung

Nginx's Verhalten, Header mit Unterstrichen zu verwerfen, stammt aus dem Common Gateway Interface (CGI)-Erbe. CGI ist ein alter Standard für Webserver, um externe Programme auszuführen und deren Ausgabe an Web-Clients zurückzugeben. Es beeinflusste, wie Webserver HTTP-Header behandeln.

In CGI werden HTTP-Header in Umgebungsvariablen für Skripte umgewandelt. Bei dieser Umwandlung werden Bindestriche und Unterstriche in Header-Namen zu Unterstrichen geändert. Ein Header wie "Custom-Header" wird beispielsweise zu "HTTP_CUSTOM_HEADER" als CGI-Umgebungsvariable. Dieser Prozess kann Verwirrung stiften, wenn Header bereits Unterstriche enthalten.

Um diese Mehrdeutigkeiten zu vermeiden, verwirft Nginx standardmäßig Header mit Unterstrichen. Diese Entscheidung verhindert Probleme, bei denen verschiedene Header auf denselben CGI-Variablennamen abgebildet werden könnten. Zum Beispiel würden "Custom_Header" und "Custom-Header" beide zu "HTTP_CUSTOM_HEADER" in CGI werden, was unklar macht, welchen ursprünglichen Header die Variable repräsentiert.

Während dieser Ansatz das Mehrdeutigkeitsproblem löst, kann er zu unerwartetem Verhalten in modernen Webanwendungen führen, die kein CGI verwenden und sich auf benutzerdefinierte Header mit Unterstrichen verlassen. Das Verständnis dieses historischen Kontexts hilft zu erklären, warum Nginx Header mit Unterstrichen auf diese Weise behandelt, auch wenn es in der aktuellen Webentwicklungspraxis nicht immer das gewünschte Verhalten ist.

Tipp: Umgang mit Unterstrich-Headern in Nginx

Um Header mit Unterstrichen in Nginx zuzulassen, können Sie die Direktive underscores_in_headers on; in Ihrer Nginx-Konfiguration verwenden. Fügen Sie diese Zeile Ihrem server- oder location-Block hinzu, um die Verarbeitung von Headern mit Unterstrichen zu aktivieren.

HTTP-Standards und Header-Namenskonventionen

Klärung des HTTP RFC

Das HTTP RFC (Request for Comments) erlaubt die Verwendung von Unterstrichen in Header-Namen. Dies wird oft von Entwicklern und Systemadministratoren missverstanden. Die HTTP-Spezifikation erlaubt viele Zeichen in Header-Namen, einschließlich Unterstrichen.

Die Verwirrung entsteht oft durch Fehlinterpretation der ASCII-Zeichenregeln im RFC. Die HTTP/1.1-Spezifikation (RFC 2616) verweist auf RFC 822 für Header-Feldformate. RFC 822 besagt, dass Feldnamen druckbare ASCII-Zeichen verwenden müssen, was Zeichen mit Dezimalwerten zwischen 33 und 126 einschließt, außer dem Doppelpunkt. Der Unterstrich (Dezimalwert 95) liegt innerhalb dieses erlaubten Bereichs.

Einige Entwickler denken, Unterstriche seien nicht erlaubt, weil bestimmte Webserver wie Apache oder Nginx sie standardmäßig als ungültig behandeln. Dies ist jedoch eine serverspezifische Entscheidung, keine Anforderung des HTTP-Standards.

Obwohl Unterstriche in HTTP-Header-Namen laut RFC erlaubt sind, kann ihre Verwendung Probleme mit einigen Servern oder Proxies verursachen, die nicht für ihre Handhabung eingerichtet sind. Aus diesem Grund ist es oft besser, Bindestriche anstelle von Unterstrichen in benutzerdefinierten Header-Namen zu verwenden, um potenzielle Probleme zu vermeiden.

Tipp: Best Practices für Header-Benennung

Verwenden Sie bei der Erstellung benutzerdefinierter HTTP-Header Bindestriche anstelle von Unterstrichen, um die Kompatibilität zwischen verschiedenen Servern und Systemen zu verbessern. Verwenden Sie beispielsweise "Custom-Header" anstelle von "Custom_Header".

Beispiel: HTTP-Header-Kompatibilität

Stellen Sie sich ein Szenario vor, in dem Sie eine API entwickeln, die benutzerdefinierte Header verwendet, um zusätzliche Informationen zu übermitteln. Sie könnten versucht sein, einen Header wie "API_Version" zu verwenden, um die Version Ihrer API anzugeben. Um jedoch die Kompatibilität zu maximieren, ist es besser, stattdessen "API-Version" zu verwenden. Dies stellt sicher, dass Ihr Header von einer breiteren Palette von Servern und Zwischensystemen korrekt verarbeitet wird.

Lösung des Unterstrich-Header-Problems in Nginx

Aktivieren von Unterstrich-Headern: Die Konfigurationslösung

Um das Problem zu lösen, dass Nginx Header mit Unterstrichen verwirft, können Sie die Direktive 'underscores_in_headers on;' in Ihrer Nginx-Konfiguration verwenden. Diese Direktive weist Nginx an, Header mit Unterstrichen zu akzeptieren und weiterzuleiten.

Um diese Lösung zu implementieren, fügen Sie die folgende Zeile zu Ihrer Nginx-Konfiguration hinzu:

underscores_in_headers on;

Sie können diese Direktive an verschiedenen Stellen in Ihrer Nginx-Konfigurationsdatei platzieren, je nachdem, wie breit Sie sie anwenden möchten:

  1. Server-Block: Wenn Sie Unterstrich-Header für einen bestimmten Server aktivieren möchten, fügen Sie die Direktive innerhalb des Server-Blocks hinzu. Zum Beispiel:
server {
    listen 80;
    server_name example.com;
    underscores_in_headers on;
    # Andere Server-Konfigurationen...
}
  1. HTTP-Block: Um Unterstrich-Header für alle Server zu aktivieren, platzieren Sie die Direktive im http-Block Ihrer Nginx-Konfiguration:
http {
    underscores_in_headers on;
    # Andere http-Konfigurationen...
}
  1. Location-Block: Wenn Sie Unterstrich-Header nur für bestimmte Locations zulassen müssen, fügen Sie die Direktive zum relevanten Location-Block hinzu:
location /api {
    underscores_in_headers on;
    # Andere Location-Konfigurationen...
}

Starten Sie Nginx nach dem Hinzufügen der Direktive neu, um die Änderungen anzuwenden. Dies ermöglicht Nginx, Header mit Unterstrichen zu verarbeiten und weiterzuleiten, wodurch das Problem fehlender benutzerdefinierter Header in Ihren Anwendungen gelöst wird.

Denken Sie daran, Ihre Konfiguration nach diesen Änderungen zu testen, um sicherzustellen, dass alles wie erwartet funktioniert.

Tipp: Unterstrich-Header überprüfen

Nachdem Sie Unterstrich-Header in Nginx aktiviert haben, können Sie mit einem Tool wie cURL überprüfen, ob sie korrekt weitergeleitet werden. Hier ist ein Beispielbefehl:

curl -I -H "X_Custom_Header: TestValue" http://ihre-domain.de

Dieser Befehl sendet eine Anfrage mit einem benutzerdefinierten Header, der einen Unterstrich enthält. Überprüfen Sie die Antwort-Header, um zu bestätigen, dass Ihr benutzerdefinierter Header vorhanden ist und nicht von Nginx verworfen wurde.