POST 请求正文因 nginx 反向代理而丢失



我使用 nginx 作为 http 服务的反向代理,使用如下配置:

location /jobexecutor/ {
proxy_pass      http://jobexecutor:8080/jobexecutor/;
proxy_set_header    Host $host;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Proto $scheme;
proxy_redirect      off;
proxy_connect_timeout   75s;
}

GET请求被很好地代理到服务,但是当我使用POST时,请求被代理到服务OK,但正文为空。当直接发布到服务时,它工作正常。 任何想法出了什么问题?

您已经找到了解决方法,但我怀疑不是根本原因。

根据RFC7231,一个已知问题,即 301 和 302 服务器响应通常会导致请求方法的转换,这些方法在跟踪重定向时对 GET 请求不安全。

正常的proxy_pass应该对客户端透明,所以听起来Nginx配置的其他部分在请求被代理之前先执行一些客户端重定向。

确定发生这种情况的位置后,您可以重新配置Nginx conf以消除重定向,或者将301/302响应代码分别更改为307/308,在保持原始请求方法的同时进行重定向。

我终于找到了答案。问题出在 curl 上,因为在重定向后它想要将 POST 转换为 GET,但-Xarg 似乎迫使它将其保留为 GET,但正文丢失了。 要获得预期的行为,您需要指定--post301或类似的参数(以及-L参数(。 见 https://curl.haxx.se/docs/manpage.html#--post301

最新更新