Le intestazioni HTTP sono sensibili al maiuscolo / minuscolo?


713

In un post di blog utilizzo il seguente PHP per impostare il tipo di contenuto di una risposta:

header('content-type: application/json; charset=utf-8');

Ho appena ricevuto un commento su quel post dicendo che content-typeha bisogno di essere capitalizzati, Content-type. È corretto? Sembra funzionare per me con tutte le lettere minuscole e ho supposto che le intestazioni HTTP fossero insensibili alle maiuscole. O funziona solo perché i browser sono belli?


26
Non distingue tra maiuscole e minuscole, ma se hai intenzione di risolvere il caso, dovrebbe essere "Content-Type".
MC0e,

10
FWIW, l'invio di "charset" con application / json non ha senso. Non esiste tale parametro.
Julian Reschke,

5
@JulianReschke - Questo è falso, charset è un parametro valido nell'intestazione Content-Type. Vedi w3.org/International/articles/http-charset/index e developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain,

8
@NullUserException - il rovescio della medaglia (a parte i byte sprecati) è quello di continuare a confondere le persone sul parametro charset. Basta riparare quei componenti invece.
Julian Reschke,

10
@JulianReschke è corretto. L' assegnazione dell'applicazione IANA / json afferma che charset non ha senso per questo tipo di supporto. non fa nulla. Per favore, non aggiungerlo, perché è il rumore che provoca confusione inutile.
Ripristina Monica 2331977 il

Risposte:


934

I nomi delle intestazioni non fanno distinzione tra maiuscole e minuscole.

Da RFC 2616 - "Hypertext Transfer Protocol - HTTP / 1.1" , Sezione 4.2, "Intestazioni dei messaggi" :

Ogni campo di intestazione è composto da un nome seguito da due punti (":") e dal valore del campo. I nomi dei campi fanno distinzione tra maiuscole e minuscole.

L'aggiornamento RFC 7230 non elenca alcuna modifica rispetto a RFC 2616 in questa parte.


96
La risposta è ancora vera, RFC 7230 afferma: "Ogni campo di intestazione è costituito da un nome di campo senza distinzione tra maiuscole e minuscole seguito da due punti (": "), spazio bianco iniziale opzionale, valore del campo e spazio bianco finale opzionale."
Martin Müller,

6
I campi di intestazione fanno distinzione tra maiuscole e minuscole quando si usa PHP per ottenere il valore di un campo di intestazione usando il metodo 'apache_request_headers ()'.
Danno del

7
Qualcuno può fornire esempi di browser popolari che non sono conformi alle specifiche al riguardo?
David W,

7
@Harm Questo è solo perché il confronto delle stringhe in PHP fa distinzione tra maiuscole e minuscole.
MrWhite,

7
Per chiunque cerchi, qui è dove RFC 7230 afferma esplicitamente che le intestazioni di campo devono essere trattate come maiuscole / minuscole: tools.ietf.org/html/rfc7230#section-3.2
JZ

238

I nomi delle intestazioni HTTP non fanno distinzione tra maiuscole e minuscole, secondo RFC 2616 :

4.2:

Ogni campo di intestazione è composto da un nome seguito da due punti (":") e dal valore del campo. I nomi dei campi non fanno distinzione tra maiuscole e minuscole.

(I valori dei campi possono essere o meno sensibili al maiuscolo / minuscolo.)

Se ti fidi che i principali browser lo rispettino, sei pronto.


A proposito, a differenza della maggior parte di HTTP, i metodi (verbi) fanno distinzione tra maiuscole e minuscole:

5.1.1 Metodo

Il token Metodo indica il metodo da eseguire sulla
risorsa identificata dall'URI di richiesta. Il metodo fa distinzione tra maiuscole e minuscole.

   Method         = "OPTIONS"                ; Section 9.2
                  | "GET"                    ; Section 9.3
                  | "HEAD"                   ; Section 9.4
                  | "POST"                   ; Section 9.5
                  | "PUT"                    ; Section 9.6
                  | "DELETE"                 ; Section 9.7
                  | "TRACE"                  ; Section 9.8
                  | "CONNECT"                ; Section 9.9
                  | extension-method
   extension-method = token

Un altro commento afferma che questa risposta è obsoleta. È vero? Se è così, forse puoi aggiornarlo in modo che le persone non si confondano.
speedplane il

36

TLDR; le intestazioni HTTP / 1.1 e HTTP / 2 non fanno distinzione tra maiuscole e minuscole.

Secondo RFC 7230 (HTTP / 1.1):

Ogni campo di intestazione è costituito da un nome di campo senza distinzione tra maiuscole e minuscole seguito da due punti (":"), spazio bianco iniziale opzionale, valore del campo e spazio bianco finale opzionale.

https://tools.ietf.org/html/rfc7230#section-3.2

Inoltre, RFC 7540 (HTTP / 2):

Proprio come in HTTP / 1.x, i nomi dei campi di intestazione sono stringhe di
caratteri ASCII che vengono confrontati in modo insensibile alle maiuscole.

https://tools.ietf.org/html/rfc7540#section-8.1.2


19
solo chiarendo: i nomi dei campi non fanno distinzione tra maiuscole e minuscole; i valori dei campi possono fare distinzione tra maiuscole e minuscole, a seconda del nome del campo.
Julian Reschke,

7
Continua citazione da HTTP / 2 RFC: "Tuttavia, i nomi dei campi di intestazione DEVONO essere convertiti in minuscolo prima della loro codifica in HTTP / 2. Una richiesta o una risposta contenente nomi di campi di intestazione maiuscoli DEVE essere trattata come non valida (Sezione 8.1.2.6)"
Borek Bernard,

2
Ho appena notato anche la parte "DEVE essere convertita in minuscolo ...". Perché? CamelCase sembra essere il case preferito in pratica (strumenti per sviluppatori, librerie di codici popolari), quindi perché HTTP / 2 dovrebbe tentare di andare contro quella tendenza?
jimp

7
@jimp - poiché gli standard riguardano la coerenza - l'uso del caso del cammello può essere ambiguo, specialmente con abbreviazioni, inizializzazioni e acronimi. Ad esempio - sarebbe "Front-End-Https" o "Front-End-HTTPS" - "WWW-Authenticate" o "Www-Authenticate" - la specifica di tutte le lettere minuscole rimuove l'ambiguità standardizzando il campo. Questo a sua volta semplifica la gestione delle intestazioni a tutto tondo.
Fraser,

16

header('Content-type: image/png') non ha funzionato con PHP 5.5 al servizio di IE11, poiché nel flusso di immagini era mostrato come testo

header('Content-Type: image/png') ha funzionato, come nell'immagine appariva come un'immagine

L'unica differenza è la "T" maiuscola.


18
Quindi c'è ovviamente un problema con l'implementazione perché tutti i campi di intestazione dovrebbero essere considerati senza distinzione tra maiuscole e minuscole. Anche Apache Bench è incasinata. Non gli piacciono i nomi dei campi minuscoli.
legame

8

Non fanno distinzione tra maiuscole e minuscole. In effetti il ​​web server NodeJS li converte esplicitamente in minuscolo, prima di renderli disponibili nell'oggetto richiesta.

È importante notare qui che tutte le intestazioni sono rappresentate solo in minuscolo, indipendentemente dal modo in cui il client le ha effettivamente inviate. Ciò semplifica il compito di analizzare le intestazioni per qualsiasi scopo.


Questo perché node / javascript fa distinzione tra maiuscole e minuscole, quindi per semplificare le cose normalizzano tutto in lettere minuscole, il che significa che le intestazioni HTTP in effetti non fanno distinzione tra maiuscole e minuscole.
Svish,

4

L'RFC per HTTP (come sopra citato) impone che le intestazioni non facciano distinzione tra maiuscole e minuscole, tuttavia scoprirai che con alcuni browser (ti sto guardando, IE) che la capitalizzazione di ciascuna delle parole tende ad essere la migliore:

Location: http://stackoverflow.com

Content-Type: text/plain

vs

location: http://stackoverflow.com

content-type: text/plain

Questo non è lo standard "HTTP", ma solo un'altra delle stranezze del browser, come sviluppatori, dobbiamo pensare.


3
Potresti fornire qualche prova al riguardo?
Julian Reschke,

3
Intendevo un caso di test concreto; Ho un IE con cui provare.
Julian Reschke,

11
Perché tende ad essere esattamente il migliore?
Svish,

Farò un browser che invia intestazioni con maiuscole casuali solo per
fregare

0

ufficialmente, le intestazioni non fanno distinzione tra maiuscole e minuscole, tuttavia è prassi comune utilizzare la prima lettera di ogni parola in maiuscolo.
ma, poiché è pratica comune, alcuni programmi come IE presumono che le intestazioni siano in maiuscolo.
così mentre i documenti dicono che non fanno distinzione tra maiuscole e minuscole, i programmatori errati hanno sostanzialmente cambiato i documenti.


-4

la parola Intestazioni non fa distinzione tra maiuscole e minuscole, ma a destra come il Content-Type, è buona pratica scriverla in questo modo, perché è sensibile al maiuscolo / minuscolo. come il mio esempio di seguito

headers = headers.set('Content-Type'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.