使用 nginx 反向代理,后端无法获取到 header 中存入的信息

解决办法

nginx 默认对 header 的 key 不支持下划线,需要在 http{ } 模块添加如下配置来支持下划线:修改后记得重启 nginx

http {
	···
    underscores_in_headers on;
	···
	service {}
}

业务场景

jwt 单点登录业务场景,在前端获取用户信息时,将 token 信息放到请求头 header 中,如下:

// 拦截器:将cookie中的token放进header中
request.interceptors.request.use(
  config => {
    if (cookie.get("token")) {
      config.headers['guli_token'] = cookie.get("token");
    }
    return config;
  },
  error => {
    return Promise.reject(error)
  }
)

可以看到请求头中的 header 信息:

image-20220610103530560

经过 nginx 反向代理请求到后端,此时后端获取到的 token 信息为 null:

    server {
        listen       8888;
        server_name  localhost;
		client_max_body_size 1024m;

	location /ucenter/ {
            proxy_pass   http://127.0.0.1:8085/;
        }
    }

后端代码:

@RestController
@CrossOrigin
@RequestMapping("/member")
public class MemberController {

    @Resource
    private MemberService memberServiceImpl;

    /**
     * 获取用户信息
     */
    @GetMapping("/getMemberInfo")
    public R getMemberInfo(HttpServletRequest request) {
        System.out.println(request.getHeader("guli_token"));	// null
    }
}

在 nginx 配置文件中添加配置:

http {
    include       mime.types;
    default_type  application/octet-stream;
    underscores_in_headers on;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
	···
}

再次请求,可以正常获取到 token 信息