nginx中的header内容转发丢失问题
背景:
最近有个项目要上线了,整个项目是部署在k8s的云上,因为云上后台的项目地址一直在变化,不是一个恒定的值,如果不代理的话前台项目中如何实现对后台地址的访问是一个很大的问题,这个后台的地址如何维护就需要用到nginx,当然也可以将后台的项目地址暴露出来,但是这样就会存在一个不安全的问题,即我可以模拟前台对后台一直访问,不符合前后端分离的项目初衷,所以在此使用了nginx对后端项目进行代理。
问题:
在部署的时候一切都很顺利,但是当测试的时候发现,所有的请求都返回了401用户未登录的信息,如果不使用nginx代理的情况下又可以拿到token信息,逻辑上来说这种问题不应该会出现的,再调试的时候发现了代理之后的请求中携带的token信息都是null,这就让热很头疼,能想到的是肯定是nginx代理的时候出现了header中内容丢失。
依据:
遇到问题不要怕,先gpt一波,发现是nginx中的一个处理逻辑,即headers中用_拼接的参数会被丢失,回头再看看我们的headers中的用户token参数确实是 "access_token"样子的,再参考nginx的官方文档中也确实写了这样的问题,www.nginx.com/resources/w….
解决办法:
所以只需要在http全局配置中开启 underscores_in_headers 设置即可
http {
# 全局配置
underscores_in_headers on;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
# 保留名为 X-MyHeader 的请求头参数
proxy_set_header X-MyHeader $http_x_my_header;
}
}
}