web-dev-qa-db-fra.com

Pourquoi les soulignements sont interdits dans les noms d'en-tête HTTP

Il y a quelques mois, j'ai eu un problème avec un en-tête HTTP personnalisé nommé "SESSION_ID", non transféré par le proxy nginx.

On m'a dit que les traits de soulignement sont interdits selon la RFC du protocole HTTP.

Google, j'ai trouvé que la plupart des serveurs comme Apache ou nginx les définissent comme illégaux.

RFC2616 la section 4.2 dit

suivre le même format générique que celui donné dans la section 3.1 de la RFC 822 [9]

et RFC822 dit

Le nom de champ doit être composé de caractères ASCII imprimables (c'est-à-dire des caractères dont la valeur est comprise entre 33 et 126., décimal, sauf deux-points))

le trait de soulignement est de 95 décimales dans la table ASCII (appartient à la plage 33-126). Qu'est-ce qui me manque?

56
white

Ils ne sont pas interdits. C'est l'héritage de CGI. ici

Si vous ne définissez pas explicitement underscores_in_headers on;, nginx supprimera silencieusement les en-têtes HTTP avec des traits de soulignement (qui sont parfaitement valides selon la norme HTTP). Ceci est fait afin d'éviter les ambiguïtés lors du mappage des en-têtes aux variables CGI, car les tirets et les traits de soulignement sont mappés aux traits de soulignement au cours de ce processus.

103
Alexey Ten

Les traits de soulignement dans les champs d'en-tête sont autorisés ( RFC 7230, sec. 3.2. ), mais en fait rares.

13
Julian Reschke