Waarom Worden HTTP Headers Met Underscores Verwijderd Door Nginx?

Gepubliceerd 8 september 2024

Probleem: HTTP Headers met Underscores Verwijderd door Nginx

Nginx, een webserver en reverse proxy, verwijdert standaard HTTP headers met underscores. Dit kan problemen veroorzaken bij het gebruik van aangepaste headers of diensten van derden die headers met underscores gebruiken, wat leidt tot gegevensverlies of problemen in webapplicaties.

Nginx's Standaard Behandeling van Underscore Headers

De Stille Verwijdering: Nginx's Standaard Gedrag

Nginx verwijdert standaard headers met underscores. Dit gebeurt zonder enige waarschuwing of foutmelding. Wanneer Nginx een verzoek ontvangt met headers die underscores bevatten, verwijdert het deze headers voordat het verzoek wordt doorgestuurd naar de backend server of applicatie. Deze verwijdering kan problemen veroorzaken in webapplicaties die deze aangepaste headers gebruiken voor functionaliteit of gegevensoverdracht.

De verborgen aard van dit proces maakt het moeilijk voor ontwikkelaars en systeembeheerders om de oorzaak te vinden van problemen met betrekking tot ontbrekende headergegevens. Gebruikers kunnen tijd besteden aan het debuggen van hun applicaties, zonder te weten dat Nginx hun aangepaste headers verwijdert. Dit standaard gedrag kan een probleem zijn bij het werken met diensten van derden of API's die headers met underscores gebruiken, omdat het de informatiestroom tussen systemen kan verstoren.

Tip: Controleer Nginx Configuratie

Om te verifiëren of Nginx headers met underscores verwijdert, kunt u een aangepaste header met een underscore toevoegen aan uw clientverzoek en vervolgens een backend logging mechanisme of debugging tool gebruiken om te controleren of de header uw applicatie bereikt. Als de header ontbreekt, wordt deze waarschijnlijk verwijderd door Nginx.

De Oorzaak: CGI Legacy en Header Mapping

Historische Context: CGI Variabelen en Header Conversie

Nginx's gedrag van het verwijderen van headers met underscores komt voort uit de Common Gateway Interface (CGI) legacy. CGI is een oude standaard voor webservers om externe programma's uit te voeren en hun output terug te geven aan webclients. Het heeft beïnvloed hoe webservers HTTP headers behandelen.

In CGI worden HTTP headers geconverteerd naar omgevingsvariabelen die scripts kunnen gebruiken. Tijdens deze conversie worden streepjes en underscores in headernamen veranderd in underscores. Bijvoorbeeld, een header zoals "Custom-Header" wordt "HTTP_CUSTOM_HEADER" als een CGI omgevingsvariabele. Dit proces kan verwarring creëren wanneer headers al underscores hebben.

Om deze dubbelzinnigheden te voorkomen, verwijdert Nginx standaard headers met underscores. Deze beslissing voorkomt problemen waarbij verschillende headers naar dezelfde CGI variabelenaam zouden kunnen mappen. Bijvoorbeeld, "Custom_Header" en "Custom-Header" zouden beide "HTTP_CUSTOM_HEADER" worden in CGI, waardoor het onduidelijk is welke originele header de variabele vertegenwoordigt.

Hoewel deze benadering het dubbelzinnigheidsprobleem oplost, kan het onverwacht gedrag veroorzaken in moderne webapplicaties die geen CGI gebruiken en afhankelijk zijn van aangepaste headers met underscores. Het begrijpen van deze historische context helpt te verklaren waarom Nginx headers met underscores op deze manier behandelt, ook al is het misschien niet altijd het gewenste gedrag in huidige webontwikkelingspraktijken.

Tip: Behandeling van Underscore Headers in Nginx

Om headers met underscores toe te staan in Nginx, kunt u de underscores_in_headers on; directive gebruiken in uw Nginx configuratie. Voeg deze regel toe aan uw server of location blok om de verwerking van headers met underscores in te schakelen.

HTTP Standaarden en Header Naamgevingsconventies

Verduidelijking van de HTTP RFC

De HTTP RFC (Request for Comments) staat het gebruik van underscores in headernamen toe. Dit wordt vaak verkeerd begrepen door ontwikkelaars en systeembeheerders. De HTTP specificatie staat veel karakters toe in headernamen, inclusief underscores.

De verwarring komt vaak voort uit het verkeerd interpreteren van de ASCII karakter regels in de RFC. De HTTP/1.1 specificatie (RFC 2616) verwijst naar RFC 822 voor header veld formaten. RFC 822 stelt dat veldnamen afdrukkbare ASCII karakters moeten gebruiken, die karakters omvatten met decimale waarden tussen 33 en 126, behalve de dubbele punt. Het underscore karakter (decimale waarde 95) valt binnen dit toegestane bereik.

Sommige ontwikkelaars denken dat underscores niet zijn toegestaan omdat bepaalde webservers, zoals Apache of Nginx, ze standaard als ongeldig behandelen. Dit is echter een serverspecifieke keuze, geen vereiste van de HTTP standaard.

Hoewel underscores zijn toegestaan in HTTP headernamen volgens de RFC, kan het gebruik ervan problemen veroorzaken met sommige servers of proxies die niet zijn ingesteld om ze te behandelen. Om deze reden is het vaak beter om streepjes te gebruiken in plaats van underscores in aangepaste headernamen om potentiële problemen te voorkomen.

Tip: Best Practices voor Header Naamgeving

Gebruik bij het creëren van aangepaste HTTP headers streepjes in plaats van underscores om de compatibiliteit over verschillende servers en systemen te verbeteren. Gebruik bijvoorbeeld "Custom-Header" in plaats van "Custom_Header".

Example: HTTP Header Compatibiliteit

Overweeg een scenario waarin u een API ontwikkelt die aangepaste headers gebruikt om aanvullende informatie over te dragen. U zou in de verleiding kunnen komen om een header zoals "API_Version" te gebruiken om de versie van uw API aan te geven. Echter, om de compatibiliteit te maximaliseren, is het beter om "API-Version" te gebruiken. Dit zorgt ervoor dat uw header correct wordt verwerkt door een breder scala aan servers en tussenpersonen.

Het Underscore Header Probleem Oplossen in Nginx

Underscore Headers Inschakelen: De Configuratie Oplossing

Om het probleem van Nginx dat headers met underscores verwijdert op te lossen, kunt u de 'underscores_in_headers on;' directive gebruiken in uw Nginx configuratie. Deze directive instrueert Nginx om headers die underscores bevatten te accepteren en door te geven.

Om deze oplossing te implementeren, voeg de volgende regel toe aan uw Nginx configuratie:

underscores_in_headers on;

U kunt deze directive op verschillende locaties binnen uw Nginx configuratiebestand plaatsen, afhankelijk van hoe breed u het wilt toepassen:

  1. Server blok: Als u underscore headers wilt inschakelen voor een specifieke server, voeg de directive toe binnen het server blok. Bijvoorbeeld:
server {
    listen 80;
    server_name example.com;
    underscores_in_headers on;
    # Andere server configuraties...
}
  1. HTTP blok: Om underscore headers voor alle servers in te schakelen, plaats de directive in het http blok van uw Nginx configuratie:
http {
    underscores_in_headers on;
    # Andere http configuraties...
}
  1. Location blok: Als u alleen underscore headers voor specifieke locaties wilt toestaan, voeg de directive toe aan het relevante location blok:
location /api {
    underscores_in_headers on;
    # Andere location configuraties...
}

Herstart Nginx na het toevoegen van de directive om de wijzigingen toe te passen. Dit zal Nginx in staat stellen om headers met underscores te verwerken en door te geven, waarmee het probleem van ontbrekende aangepaste headers in uw applicaties wordt opgelost.

Vergeet niet om uw configuratie te testen na het maken van deze wijzigingen om er zeker van te zijn dat alles werkt zoals verwacht.

Tip: Verifieer Underscore Headers

Na het inschakelen van underscore headers in Nginx, kunt u verifiëren of ze correct worden doorgegeven door een tool zoals cURL te gebruiken. Hier is een voorbeeldcommando:

curl -I -H "X_Custom_Header: TestValue" http://your-domain.com

Dit commando stuurt een verzoek met een aangepaste header die een underscore bevat. Controleer de response headers om te bevestigen dat uw aangepaste header aanwezig is en niet is verwijderd door Nginx.