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

时间:2018-09-18 09:15:02

标签: nginx nginx-reverse-proxy

我正在使用像这样的配置将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时,请求被代理到服务正常,但是主体为空。直接发布到服务时,它可以正常工作。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

根据RFC7231,这是一个已知的问题,在重定向之后,301和302服务器响应通常会导致将不是safe的请求方法转换为GET请求。

普通的for对客户端应该是透明的,因此听起来Nginx配置的其他部分首先在进行请求重定向之前先进行了客户端重定向。

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

答案 1 :(得分:0)

我终于找到了答案。 curl的问题在于,在重定向之后,它想将POST转换为GET,但是--post301 arg似乎迫使它将其保留为GET,但是主体迷失了。 为了获得预期的行为,您需要指定-L或类似的参数(以及class Set2Inline(admin.TabularInline): # extending any admin Inline Class will work AFAIK ... classes = ['collapse',] ... 参数)。 参见https://curl.haxx.se/docs/manpage.html#--post301