网站首页 > 技术教程 正文
最近遇到一个 Nginx 转发的坑,一个请求转发到 Tomcat 时发现有几个 http header 始终获取不到,导致线上出现 bug,运维说不是他的问题,这个锅我背了。
新增的几个 header 是这样的:
- accept_sign
- accept_token
- …
反复检查代码,确定这些 header 是传了的,而且本地测试单独在 tomcat 中是可以接受到这些参数的,所以 tomcat 和命名本身是没问题的,初步断定是 Nginx 的问题。
经过一翻搜索,终于找到了一个 Nginx 的配置参数:underscores_in_headers,这个参数默认值为:off,即默认忽略带下划线的 header。
解决方案:
1、在 http 或者 server 配置中把 underscores_in_headers 配置参数开关打开:
server {
...
underscores_in_headers on;
...
}
增加配置后,然后重启 Nginx。
2、使用破折号(-)代替下划线(_),或者统一规范直接不要使用下划线;
我们来看下一般的 http header 长什么样的:
一般所见的 headers 确实也都是中杠线,没有下划线。
Nginx 为什么默认忽略带下划线 header?
我找到了 Nginx 的官方说明:
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/?highlight=underscores#missing-disappearing-http-headers
If you do not explicitly set underscores_in_headers on;, NGINX will silently drop HTTP headers with underscores (which are perfectly valid according to the HTTP standard). This is done in order to prevent ambiguities when mapping headers to CGI variables as both dashes and underscores are mapped to underscores during that process.
根据官方说明,这样做是为了避免把 headers 映射为 CGI 变量时出现歧义,因为破折号和下划线都会被映射为下划线,所以两者不好区分……
好吧,终于弄清楚了,这个问题也太变态了,这应该是 Nginx 设计时的一个缺陷吧,这个坑我替你们踩了!
所以,推荐大家使用第二种方案吧,统一规范 headers 不要使用下划线,使用 Nginx 默认的配置即可,这样可以尽量避免环境上的差异,以免后续带来问题。
@阿里Java开发手册 是否考虑新增这条规范?
版权申明:本文系 “Java技术栈” 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。
猜你喜欢
- 2024-10-10 「Nginx」配置一个高性能Nginx(nginx详细配置)
- 2024-09-16 Jmeter 分布式压力测试 Nginx 性能(图文小教程)
- 2024-09-16 推荐收藏-Nginx基本属性配置详解大全
- 2024-09-16 一文理清 nginx 中的 location 配置(系列一)
- 2024-09-16 一次说清-Nginx反向代理及参数配置
- 2024-09-16 图解丨Nginx 中的四级指针(nginx支持4层转发吗)
- 2024-09-16 「每天一道面试题」Nginx gzip配置
- 2024-09-16 Linux TCP队列相关参数的总结(linux tcpdump)
- 2024-09-16 nginx作用及其配置(nginx 用处)
- 2024-09-16 Linux 下Nginx默认参数编译安装与启动配置
你 发表评论:
欢迎- 最近发表
-
- Linux新手必看:几种方法帮你查看CPU核心数量
- linux基础命令之lscpu命令(linux中ls命令的用法)
- Linux lscpu 命令使用详解(linux常用ls命令)
- 如何查询 Linux 中 CPU 的数量?这几个命令要知道!
- 在linux上怎么查看cpu信息(linux如何查看cpu信息)
- 查看 CPU 的命令和磁盘 IO 的命令
- 如何在CentOS7上改变网卡名(centos怎么改网卡名字)
- 网工必备Linux网络管理命令(网工必备linux网络管理命令是什么)
- Linux 网络命令知多少(linux 网络 命令)
- Linux通过命令行连接wifi的方式(linux命令行连接无线网)
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)