Perché gli header HTTP con underscore vengono eliminati da Nginx?

Pubblicato 17 ottobre 2024

Problema: Header HTTP con Trattini Bassi Eliminati da Nginx

Nginx, un server web e proxy inverso, elimina di default gli header HTTP con trattini bassi. Questo può causare problemi quando si utilizzano header personalizzati o servizi di terze parti che usano header con trattini bassi, portando a perdita di dati o problemi nelle applicazioni web.

Gestione Predefinita degli Header con Trattini Bassi in Nginx

L'Eliminazione Silenziosa: Comportamento Predefinito di Nginx

Nginx elimina di default gli header con trattini bassi. Questo avviene senza alcun avviso o messaggio di errore. Quando Nginx riceve una richiesta con header contenenti trattini bassi, rimuove questi header prima di inviare la richiesta al server o all'applicazione backend. Questa rimozione può causare problemi nelle applicazioni web che utilizzano questi header personalizzati per funzionalità o trasferimento dati.

La natura nascosta di questo processo rende difficile per gli sviluppatori e gli amministratori di sistema trovare la causa dei problemi legati ai dati mancanti negli header. Gli utenti potrebbero perdere tempo a debuggare le loro applicazioni, non sapendo che Nginx sta rimuovendo i loro header personalizzati. Questo comportamento predefinito può essere un problema quando si lavora con servizi o API di terze parti che utilizzano header con trattini bassi, poiché può interrompere il flusso di informazioni tra i sistemi.

Suggerimento: Verifica della Configurazione Nginx

Per verificare se Nginx sta eliminando gli header con trattini bassi, puoi aggiungere un header personalizzato con un trattino basso nella tua richiesta client e quindi utilizzare un meccanismo di logging backend o uno strumento di debug per controllare se l'header raggiunge la tua applicazione. Se l'header manca, è probabile che sia stato eliminato da Nginx.

La Causa Principale: Eredità CGI e Mappatura degli Header

Contesto Storico: Variabili CGI e Conversione degli Header

Il comportamento di Nginx di eliminare gli header con trattini bassi deriva dall'eredità del Common Gateway Interface (CGI). CGI è un vecchio standard per i server web per eseguire programmi esterni e restituire il loro output ai client web. Ha influenzato il modo in cui i server web gestiscono gli header HTTP.

In CGI, gli header HTTP vengono convertiti in variabili d'ambiente per l'uso negli script. Durante questa conversione, i trattini e i trattini bassi nei nomi degli header vengono modificati in trattini bassi. Ad esempio, un header come "Custom-Header" diventa "HTTP_CUSTOM_HEADER" come variabile d'ambiente CGI. Questo processo può creare confusione quando gli header hanno già trattini bassi.

Per evitare queste ambiguità, Nginx elimina di default gli header con trattini bassi. Questa decisione previene problemi in cui header diversi potrebbero mappare allo stesso nome di variabile CGI. Ad esempio, "Custom_Header" e "Custom-Header" diventerebbero entrambi "HTTP_CUSTOM_HEADER" in CGI, rendendo poco chiaro quale header originale rappresenti la variabile.

Mentre questo approccio risolve il problema dell'ambiguità, può causare comportamenti inaspettati nelle applicazioni web moderne che non utilizzano CGI e si basano su header personalizzati con trattini bassi. Comprendere questo contesto storico aiuta a spiegare perché Nginx gestisce gli header contenenti trattini bassi in questo modo, anche se potrebbe non essere sempre il comportamento desiderato nelle pratiche di sviluppo web attuali.

Suggerimento: Gestione degli Header con Trattini Bassi in Nginx

Per consentire gli header con trattini bassi in Nginx, puoi utilizzare la direttiva underscores_in_headers on; nella tua configurazione Nginx. Aggiungi questa riga al tuo blocco server o location per abilitare l'elaborazione degli header contenenti trattini bassi.

Standard HTTP e Convenzioni di Denominazione degli Header

Chiarire l'RFC HTTP

L'RFC HTTP (Request for Comments) consente l'uso di trattini bassi nei nomi degli header. Questo è spesso frainteso da sviluppatori e amministratori di sistema. La specifica HTTP permette molti caratteri nei nomi degli header, inclusi i trattini bassi.

La confusione spesso deriva da un'errata interpretazione delle regole sui caratteri ASCII nell'RFC. La specifica HTTP/1.1 (RFC 2616) fa riferimento all'RFC 822 per i formati dei campi degli header. L'RFC 822 stabilisce che i nomi dei campi devono utilizzare caratteri ASCII stampabili, che includono caratteri con valori decimali tra 33 e 126, eccetto i due punti. Il carattere trattino basso (valore decimale 95) rientra in questo intervallo consentito.

Alcuni sviluppatori pensano che i trattini bassi non siano consentiti perché certi server web, come Apache o Nginx, li trattano come non validi di default. Tuttavia, questa è una scelta specifica del server, non un requisito dello standard HTTP.

Sebbene i trattini bassi siano consentiti nei nomi degli header HTTP secondo l'RFC, il loro utilizzo può causare problemi con alcuni server o proxy che non sono configurati per gestirli. Per questo motivo, è spesso meglio utilizzare trattini invece di trattini bassi nei nomi degli header personalizzati per evitare potenziali problemi.

Suggerimento: Migliori Pratiche per la Denominazione degli Header

Quando crei header HTTP personalizzati, usa trattini invece di trattini bassi per migliorare la compatibilità tra diversi server e sistemi. Ad esempio, usa "Custom-Header" invece di "Custom_Header".

Esempio: Compatibilità degli Header HTTP

Considera uno scenario in cui stai sviluppando un'API che utilizza header personalizzati per trasmettere informazioni aggiuntive. Potresti essere tentato di utilizzare un header come "API_Version" per indicare la versione della tua API. Tuttavia, per massimizzare la compatibilità, è meglio utilizzare "API-Version" invece. Questo assicura che il tuo header sarà elaborato correttamente da una gamma più ampia di server e intermediari.

Risolvere il Problema degli Header con Trattini Bassi in Nginx

Abilitare gli Header con Trattini Bassi: La Soluzione di Configurazione

Per risolvere il problema di Nginx che elimina gli header con trattini bassi, puoi utilizzare la direttiva 'underscores_in_headers on;' nella tua configurazione Nginx. Questa direttiva indica a Nginx di accettare e trasmettere gli header che contengono trattini bassi.

Per implementare questa soluzione, aggiungi la seguente riga alla tua configurazione Nginx:

underscores_in_headers on;

Puoi posizionare questa direttiva in diverse posizioni all'interno del tuo file di configurazione Nginx, a seconda di quanto ampiamente vuoi applicarla:

  1. Blocco server: Se vuoi abilitare gli header con trattini bassi per un server specifico, aggiungi la direttiva all'interno del blocco server. Per esempio:
server {
    listen 80;
    server_name example.com;
    underscores_in_headers on;
    # Altre configurazioni del server...
}
  1. Blocco http: Per abilitare gli header con trattini bassi per tutti i server, posiziona la direttiva nel blocco http della tua configurazione Nginx:
http {
    underscores_in_headers on;
    # Altre configurazioni http...
}
  1. Blocco location: Se hai bisogno di consentire gli header con trattini bassi solo per posizioni specifiche, aggiungi la direttiva al blocco location pertinente:
location /api {
    underscores_in_headers on;
    # Altre configurazioni della location...
}

Dopo aver aggiunto la direttiva, riavvia Nginx per applicare le modifiche. Questo permetterà a Nginx di elaborare e trasmettere gli header contenenti trattini bassi, risolvendo il problema degli header personalizzati mancanti nelle tue applicazioni.

Ricorda di testare la tua configurazione dopo aver apportato queste modifiche per assicurarti che tutto funzioni come previsto.

Suggerimento: Verifica degli Header con Trattini Bassi

Dopo aver abilitato gli header con trattini bassi in Nginx, puoi verificare se vengono trasmessi correttamente utilizzando uno strumento come cURL. Ecco un esempio di comando:

curl -I -H "X_Custom_Header: TestValue" http://tuo-dominio.com

Questo comando invia una richiesta con un header personalizzato contenente un trattino basso. Controlla gli header di risposta per confermare che il tuo header personalizzato sia presente e non sia stato eliminato da Nginx.