web-dev-qa-db-fra.com

Les en-têtes HTTP sont-ils sensibles à la casse?

Dans un article de blog, j'utilise PHP pour définir le type de contenu d'une réponse:

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

Je viens de recevoir un commentaire sur ce message disant que content-type doit être mis en majuscule, Content-type. Est-ce correct? Cela semble fonctionner pour moi avec tous les minuscules, et j'ai supposé que les en-têtes HTTP étaient insensibles à la casse. Ou cela fonctionne-t-il simplement parce que les navigateurs sont bien?

613
Svish

Les noms d'en-tête ne sont pas sensibles à la casse.

From RFC 2616 - "Protocole de transfert d'hypertexte - HTTP/1.1" , section 4.2, "En-têtes de message" :

Chaque champ d'en-tête est composé d'un nom suivi de deux points (":") et de la valeur du champ. Les noms de champ sont des minuscules sensibles à .

La mise à jour de la RFC 7230 ne répertorie pas de modifications de la RFC 2616 dans cette partie.

820

Les noms d'en-tête HTTP ne sont pas sensibles à la casse, selon RFC 2616 :

4.2:

Chaque champ d'en-tête est composé d'un nom suivi de deux points (":") et de la valeur du champ. Les noms de champs sont insensibles à la casse.

(Les valeurs du champ peuvent ou non être sensibles à la casse.)

Si vous faites confiance aux principaux navigateurs, vous êtes prêts.


BTW, contrairement à la plupart des HTTP, les méthodes (verbes) sont sensibles à la casse :

5.1.1 Méthode

Le jeton Méthode indique la méthode à exécuter sur le
ressource identifiée par l'URI de demande. La méthode est sensible à la casse.

   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
220

tldr; Les en-têtes HTTP/1.1 et HTTP/2 ne respectent pas la casse.

Selon RFC 7230 (HTTP/1.1):

Chaque champ d'en-tête est composé d'un nom de champ ne respectant pas la casse, suivi de deux points (":"), d'un espace supplémentaire facultatif, de la valeur du champ et d'un espace de fin optionnel.

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

En outre, RFC 7540 (HTTP/2):

Comme dans HTTP/1.x, les noms de champs d’en-tête sont des chaînes de caractères ASCII.
caractères comparés sans tenir compte de la casse.

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

31
Afshin Mehrabani

header('Content-type: image/png') ne fonctionnait pas avec PHP 5.5 servant IE11, car le flux d'images était affiché sous forme de texte.

header('Content-Type: image/png') travaillé, comme dans l'image est apparue comme une image

La seule différence est la capitale 'T'.

14
Rudiger W.

La RFC pour HTTP (citée ci-dessus) indique que les en-têtes ne sont pas sensibles à la casse, mais vous constaterez que certains navigateurs (je vous regarde, IE) préfèrent capitaliser chacun des mots:

Location: http://stackoverflow.com

Content-Type: text/plain

contre

location: http://stackoverflow.com

content-type: text/plain

Ce n'est pas une norme "HTTP", mais juste une autre des bizarreries du navigateur, auxquelles nous devons penser en tant que développeurs.

4
Robert Lerner

Ils ne sont pas sensibles à la casse. En fait, le serveur Web NodeJS les convertit explicitement en minuscules, avant de les rendre disponibles dans l'objet de requête.

Il est important de noter ici que tous les en-têtes sont représentés en minuscules, quelle que soit la façon dont le client les a envoyés. Cela simplifie la tâche d'analyse des en-têtes, quel que soit le but.

3
jayarjo