跳至主要內容

nginx400错误

OrangBus大约 3 分钟

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地址通常没有直接关联,但与代理配置有关。

死循环的情况通常出现在以下情况:

  1. 代理循环配置: 此问题可能由于Nginx配置错误引起的。例如,如果你在proxy_pass指令中使用代理的目标地址,而该目标地址在Nginx中的配置也将流量返回给Nginx自身,就会导致循环。

    示例配置可能如下(这是一个错误配置):

    nginxCopy codelocation / {
        proxy_pass http://example.com; # 这里使用的是外部域名
    }
    

    在这种情况下,请求将被无限循环代理到example.com,然后再次返回到Nginx,导致死循环。

  2. 缺乏适当的代理规则: 死循环也可能由于缺乏适当的代理规则引起,而这些规则可能需要排除某些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:端口 的方式,如果是部署在不同的服务器上的话,就可以使用域名的方式。