运维居然让我背锅! Nginx 转发时的一个坑

最近遇到一个 Nginx 转发的坑,一个恳求转发到 Tomcat 时发现有几个 http header 一直失掉不到,造成线上产生bug,运维说不是他的疑问,这个锅我背了。

新增的几个 header 是这样的:

重复审核代码,确定这些 header 是传了的,而且本地测试独自在 tomcat 中是可以接遭到这些参数的,所以 tomcat和命名自身是没疑问的,初步判定是 Nginx 的疑问。

经过一翻搜查,终于找到了一个 Nginx 的性能参数:underscores_in_headers,这个参数自动值为:off,即自动疏忽带下划线的header。

处置打算:

1、在 http 或许 server 性能中把 underscores_in_headers 性能参数开关关上:

参与性能后,而后重启 Nginx。

2、经常使用破折号(-)替代下划线(_),或许一致规范间接不要经常使用下划线;

咱们来看下普通的 http header 长什么样的:

普通所见的 headers 确实也都是中杠线,没有下划线。

Nginx 为什么自动疏忽带下划线 header?

我找到了 Nginx 的官网说明:

If you do not explicitly set underscores_in_headers on;, NGINX will silentlydrop HTTP headers with underscores (which are perfectly valid according to theHTTP standard). This is done in order to prevent ambiguities when mappingheaders to CGI variables as both dashes and underscores are mapped tounderscores during that process.

依据官网说明,这样做是为了防止把 headers 映射为 CGI 变量时产生歧义,由于破折号和下划线都会被映射为下划线,所以两者不好辨别……

好吧,终于弄清楚了,这个疑问也太变态了,这应该是 Nginx 设计时的一个缺点吧,这个坑我替你们踩了!

所以,介绍大家经常使用第二种打算吧,一致规范 headers 不要经常使用下划线,经常使用 Nginx自动的性能即可,这样可以尽量防止环境上的差异,免得后续带来疑问。

您可能还会对下面的文章感兴趣: