nginx400错误
nginx配置反向代理或跳转出现400,Request Header Or Cookie Too Large
最近在做一套saas,都是前后端分离的方式,有web网页端,商户端,总平台端,部署完成后没有啥问题,后来同事发现,为什么登录的ip地址要么是 127.0.0.1 要么就是服务器的ip地址,让处理了一下,于是下意识的在vue项目的nginx中添加了ip转发的配置
location / {
try_files $uri $uri/ /index.html;
}
location /platform {
proxy_pass http://api.orangbus.cn;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
于是乎所有的接口就炸了,所有的接口都返回
400 Bad Request
Request Header Or Cookie Too Large
后来打开postman单独请求试了一下,没啥问题呀,于是乎找了找其它的vue项目试了一下,有些项目可以,有些项目也出现了类似的情况
上google搜索了一下,大致结果分为一下集中
1、清理浏览的缓存
2、增加nginx的配置,将nginx的以下值调大,(增加到1M好像也还是同样的问题)
http {
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
}
3、代理地址写错了的
4、nginx配置文件出错的(暂且不论)
最后又评论说了句:这是nginx的死循环导致的 感觉跟这样的问题类似,于是乎问了下gpt
nginx在使用proxy_pass做跳转时,且需要向后端提交当前访问的IP地址时,引发nginx的bug造成死循环 会出现这种情况吗
当使用Nginx的proxy_pass
进行跳转时,如果配置不当,可能会出现死循环的情况,这通常是由于不正确的Nginx配置导致的。这种情况与向后端提交当前访问的IP地址通常没有直接关联,但与代理配置有关。
死循环的情况通常出现在以下情况:
代理循环配置: 此问题可能由于Nginx配置错误引起的。例如,如果你在
proxy_pass
指令中使用代理的目标地址,而该目标地址在Nginx中的配置也将流量返回给Nginx自身,就会导致循环。示例配置可能如下(这是一个错误配置):
nginxCopy codelocation / { proxy_pass http://example.com; # 这里使用的是外部域名 }
在这种情况下,请求将被无限循环代理到
example.com
,然后再次返回到Nginx,导致死循环。缺乏适当的代理规则: 死循环也可能由于缺乏适当的代理规则引起,而这些规则可能需要排除某些URL或条件以避免无限循环。
为了避免这种死循环问题,你应该确保Nginx的代理配置正确,并且在代理目标上没有造成无限循环的配置。如果你需要向后端提交当前访问的IP地址,你可以使用proxy_set_header
指令来设置合适的请求头,但这通常与死循环问题无关。
如果你遇到了死循环问题,建议检查Nginx的配置,确保代理规则正确,且不会导致请求的无限循环。同时,确保代理的目标地址不会再次指向Nginx,以避免死循环。
从以上gpt的回答终于找到的原因,也就是说,只需要将
location /platform {
proxy_pass http://api.orangbus.cn;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
修改为: http://127.0.0.1:8086 等同于 http://api.orangbus.cn
location /platform {
proxy_pass http://127.0.0.1:8086;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
重启nginx,解决。
总结:在做前后端项目分离的时候,如果前后端的代码都部署在一台服务器上,如果需要配置反向代理的话,应该使用 ip:端口
的方式,如果是部署在不同的服务器上的话,就可以使用域名的方式。