Dans un article de blog, j’utilise le code PHP suivant 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 cet article en disant que le content-type
doit être en majuscule, Content-type
. Est-ce correct? Cela semble fonctionner pour moi avec toutes les minuscules, et j’ai supposé que les en-têtes HTTP étaient insensibles à la casse. Ou ça marche simplement parce que les navigateurs sont sympas?
Les noms d’en-tête ne sont pas sensibles à la casse.
De RFC 2616 – “Protocole de transfert 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 champs sont insensibles à la casse.
La mise à jour RFC 7230 ne répertorie aucune modification de la RFC 2616 à cette partie.
Les noms d’en-tête HTTP sont insensibles à la casse, conformément à la 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 de champ peuvent ou non être sensibles à la casse.)
Si vous faites confiance aux principaux navigateurs, vous êtes tous prêts.
BTW, contrairement à la plupart des HTTP, les méthodes (verbes) sont sensibles à la casse:
5.1.1 Méthode
Le jeton de méthode indique la méthode à effectuer 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 sont insensibles à la casse.
Selon RFC 7230 (HTTP / 1.1):
Chaque champ d’en-tête est composé d’un nom de champ insensible à la casse suivi de deux points (“:”), d’un espace blanc de début facultatif, de la valeur du champ et des espaces de fin facultatifs.
https://tools.ietf.org/html/rfc7230#section-3.2
Aussi, 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 qui sont comparés d’une manière insensible à la casse.
header('Content-type: image/png')
ne fonctionnait pas avec PHP 5.5 desservant IE11, car le stream d’images était affiché sous forme de texte
header('Content-Type: image/png')
fonctionnait, comme dans l’image apparaissant comme une image
La seule différence est le capital ‘T’.
La RFC pour HTTP (citée ci-dessus) stipule que les en-têtes ne sont pas sensibles à la casse, mais vous verrez que certains navigateurs (je vous regarde, IE) considèrent que la majuscule de chacun des mots est la meilleure:
Location: http://stackoverflow.com Content-Type: text/plain
contre
location: http://stackoverflow.com content-type: text/plain
Ce n’est pas un standard “HTTP”, mais juste une autre des bizarreries du navigateur, nous en tant que développeurs, devons réfléchir.