【问题标题】:POST request body being lost with nginx reverse proxy使用 nginx 反向代理丢失 POST 请求正文
【发布时间】:2019-02-22 06:47:40
【问题描述】:

我使用 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,但正文是空的。直接发布到服务时,它工作正常。 有什么想法吗?

【问题讨论】:

  • @tdugeon 您使用什么技术来发送和接收 HTTP 请求?
  • @HatzavWolff 我正在使用 curl 进行测试。确切的命令是: curl -kL -X POST -H "Authorization: bearer $token" -F "ExecutionParameters=@ExecutionParametersSdf.json;type=application/json;filename=ExecutionParameters.json" -F "input=@../ ../../../data/testfiles/Kinase_inhibs.sdf;type=chemical/x-mdl-sdfile;filename=input" -H "Content-Type: multipart/mixed" nginx/jobexecutor/rest/v1/jobs/submit-async
  • @tdugeon 你如何检查 POST 正文?
  • 在接收端的代码中。将正文作为字符串抓取并记录。直接访问时正常,通过反向代理访问时body为空。
  • @tdugeon 您能否将代码添加到“记录字符串”?另外,“直接访问”是什么意思——通过浏览器?

标签: nginx nginx-reverse-proxy


【解决方案1】:

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

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

一个普通的proxy_pass 应该对客户端是透明的,所以听起来你的 Nginx 配置的其他部分在请求被代理之前首先进行一些客户端重定向。

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

【讨论】:

  • 这个。在我的情况下(在 OP 的情况下看起来也可能),我有“位置 /whatever/”,但将原始 POST 请求发送到 /whatever(没有尾部斜杠)。浏览器请求/whatever,nginx返回301,浏览器在/whatever/处自动重试,但将请求方法改为GET。
  • @Burrito 对我来说非常相似,但由于从 HTTP 重定向到 HTTPS。
  • OK: 位置^~ /api/v2/aaa/bbb/cccc { proxy_pass test_server//api/v2/aaa/bbb/cccc; proxy_set_header 主机 $host:$proxy_port; } 不好:位置 ^~ /api/v2/aaa/bbb/cccc/ { proxy_pass test_server//api/v2/aaa/bbb/cccc; proxy_set_header 主机 $host:$proxy_port; }
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多