使用 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 信息:

经过 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 信息