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?
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.
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
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.
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'.
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.
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.