当前位置: > > > Nginx - 解决HTTP header中带下划线的变量无法转发的问题

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)然后前端请求通过 Nginx9090 端口转发到这个后台服务:
    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)再次测试,可以看到带下划线的变量也转发到后台了:

评论0