为什么HTTP服务器禁止在HTTP头名称中使用下划线

106

我遇到了一个问题,nginx代理没有传输自定义HTTP SESSION_ID头。

有人告诉我根据HTTP RFC,下划线是被禁止的。

搜索后,我发现像Apachenginx这样的大多数服务器都将它们定义为在RFC2616第4.2节中非法,其中写道:

 

遵循RFC 822 [9]第3.1节中给出的相同通用格式

RFC822说:

 

字段名称必须由可打印的ASCII字符组成(即,其值在33到126之间,十进制,除冒号)

下划线是ASCII表中33-126范围内的十进制字符95。

我错过了什么?

2个回答

188

它们并未被禁止,这是CGI遗留问题。请参见"缺失(消失)HTTP头部"。

如果您没有明确设置underscores_in_headers on;,nginx将会默默丢弃带有下划线的HTTP头部(根据HTTP标准,这些都是完全有效的)。这样做是为了防止在将头部映射到CGI变量时产生歧义,因为在该过程中,破折号和下划线都被映射为下划线。


36
刚刚花了几个小时调试,发现我的 Rails 应用在开发环境下运行良好,但在生产环境下却不行。这太让人郁闷了 :/ - Qwertie
17
刚刚花了好几个小时调试,发现我的 NodeJS 应用在开发环境下能正常运行,但在生产环境中却不行,因为这个问题:/ - jujule
9
刚刚花了好几个小时调试,发现我的Flask应用在开发环境中能够正常工作但在生产环境中不行,因为出现了这种情况:/ - SilverTear
8
刚刚花了5分钟调试我的Flask应用程序,发现它在开发环境和生产环境都不能正常工作,幸运的是我偶然发现了这个帖子。哎呀,差点出事了。 - joidegn
1
我花了整整10天的时间才找到这个解决方案,因为谷歌没有提供关于“nginx删除请求头”的好答案。 - rawcode
显示剩余7条评论

27

根据RFC 7230第3.2节,标题字段中允许使用下划线,但这种用法并不常见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接