Question Pourquoi les traits de soulignement sont interdits dans les noms d’en-tête HTTP


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

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

Googling, j'ai trouvé que la plupart des serveurs aiment apache ou nginx les définir 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 qui ont des valeurs comprises entre 33 et 126.           décimal, sauf les deux points

Le trait de soulignement est un caractère décimal de 95 dans le tableau ASCII (appartient à la plage 33-126). Qu'est-ce que je rate?


36
2018-04-04 07:19


origine


Réponses:


Ils ne sont pas interdits. C'est un héritage de CGI. Ici

Si vous ne définissez pas explicitement underscores_in_headers on;, nginx va supprimer silencieusement les en-têtes HTTP avec des traits de soulignement (qui sont parfaitement valides selon le standard 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 lors de ce processus.


66
2018-04-04 07:58



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


9
2018-04-04 08:52