前言

最近朋友发现使用nginx转发到后端的请求中带有下划线(_)的header获取不到,之后我对这个事情很感兴趣,特地写了个测试项目来测试一下。

解决方案

在nginx的配置文件中加入

http {
    # 其他配置
    underscores_in_headers on; # 加入这一行
}

测试过程

  1. 新建一个SpringBoot项目,然后写一个测试controller用来接收请求
@RestController
public class TestController {
	private static final Logger logger = LoggerFactory.getLogger(TestController.class);
	@RequestMapping("/test")
	public Object test(@RequestHeader Map<String,String> headers)
	{
		logger.info("headers==>{}", headers);
		logger.info("headers数量==>{}", headers.size());
		return headers;
	}

}
  1. 运行项目,使用postman给后端直接发送请求
    结果如下

20210313001

  1. 设置nginx代理(不改underscores_in_headers的设置)
    结果如下
    20210313002
    可以看到少了一个user_name的头

  2. 在nginx的配置文件中添加underscores_in_headers,重新加载配置文件,发送请求
    结果如下
    20210313003
    可以看到在能够获取到带有下划线的header了

测试源码:https://github.com/JohnZuo006/nginx-header-test

后记

如有问题,欢迎指正