在最近开发中遇到一个问题,记录一下。

发现问题

有一个http请求,需要携带一个请求头Header,当时定义的请求头使用的下划线模式,header_name这样。然后神奇的事情就发生了。

我自己在本机运行代码,在ApiFox上测试没问题,后端能正常接收并响应。

当部署到服务器后,使用域名或者ip访问接口路径,这时候后端就接收不到前端塞的请求头了。

排查问题

排查了好久,其中当尝试换成其他的请求头,发现只有携带下划线(_)才接收不到,换成 - 短横就可以了。

研究参考

搜了一下,发现原来是nginx的问题。ngixn默认不支持下划线的header,带下划线的header会被丢弃

所以一开始自己ApiFox测试是因为直接请求的本地运行的代码,没有经过nginx,所以能正常接收。但后面都是使用域名经过nginx转发,导致带下划线的header丢失

Nginx默认不支持带有下划线的Header字段,这是由于历史原因。在早期的互联网规范中,HTTP Header字段名中并不允许使用下划线。因此,为了遵守这些规范并防止可能的冲突,Nginx在处理Headers时默认会丢弃任何带有下划线的Header字段。

解决方式

两种解决方式:

  • 请求头命名不用下划线,改成短横(推荐)
  • 直接修改nginx配置文件 http 部分,添加 underscores_in_headers on (请注意,这可能会导致与一些遵循原始规范的系统或库产生冲突。)