Nginx - 解决HTTP header中带下划线的变量无法转发的问题
1,问题描述
(1)在项目开发时,我们常常需要自定义 HTTP 请求头,比如前端将 token 放在 header 中传递给后端。但如果使用 Nginx 做转发的话要注意:header 变量不要包含下划线(_),否则会被 Nginx 忽略。
(2)比如我们写一个简单的后台接口,将接收到的所有 header 都返回前端显示:
@RestController public class TestController { @GetMapping("/test") public String test(@RequestHeader Map<String, String> headers) { return headers.toString(); } }
(3)然后前端请求通过 Nginx 的 9090 端口转发到这个后台服务:
upstream hangge.com { server 192.168.43.96:8080 weight=1; } server { listen 9090; server_name localhost; location / { proxy_pass http://hangge.com; proxy_redirect default; }
(4)测试一下,这里给请求 header 添加两个自定义变量,一个带下划线(_),一个带连接号(-)。可以看到后台只接收到带连接号的变量。
2,问题原因
Nginx 默认会忽略带下划线 header。根据官方说明,这样做是为了避免把 headers 映射为 CGI 变量时出现歧义,因为破折号和下划线都会被映射为下划线,所以两者不好区分。
3,解决办法
(1)建议自定义 header 变量使用连接号(-),不要使用下划线(_)。如果非要使用下划线的话,可以修改 Nginx 配置文件,增加 underscores_in_headers on; 配置。
underscores_in_headers on; upstream hangge.com { server 192.168.43.96:8080 weight=1; } server { listen 9090; server_name localhost; location / { proxy_pass http://hangge.com; proxy_redirect default; }
(2)再次测试,可以看到带下划线的变量也转发到后台了: