如何让Nginx通过重写转发HTTP POST请求?


19

我的iOS应用当前正在通过http POST访问域A,但我想将所有请求转发到域B。

如果我使用通常rewrite ^/(.*)$ http://mydomain/$1 permanent;的方法,POST数据似乎会丢失。

如何使用NginX将HTTP POST数据传递到其他域?

Answers:


32

请尝试使用反向代理支持。一个示例location部分将是:

location / {
  proxy_pass      http://localhost:8080;
  proxy_redirect  http://localhost:8080/ /;
  proxy_read_timeout 60s;

  # May not need or want to set Host. Should default to the above hostname.
  proxy_set_header          Host            $host;
  proxy_set_header          X-Real-IP       $remote_addr;
  proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
}

本示例将所有对此server块的请求传递给运行在上的第二台服务器localhost:8080。这会保留POST的,并且在遇到问题时也应保留其他请求类型。

问题是外部重定向将永远不会重新发送POST数据。这已写入HTTP规范(请检查3xx部分)。任何这样做的客户端都违反规范。

如果响应GET或HEAD以外的请求而接收到301/302状态码,除非用户确认,否则用户代理不得自动重定向请求,因为这可能会更改发出请求的条件。

我很确定大多数浏览器都通过简单地将重定向的请求强制为请求来实现此目的GET。从理论上讲,该规范确实允许浏览器询问用户是否重定向POST数据,但我不知道当前正在执行的操作。


太棒了!像魅力一样工作
Jiho Kang

评论有些混乱。我通常要设置proxy_set_header值吗?否则,我猜想远程地址将成为代理服务器的远程地址,但是我通常想要的是客户端的远程地址,对吗?
Georgios Pligoropoulos'3

感谢您为我节省的答案!有没有一种方法可以设置nginx,以便它通过套接字而不是在http模式下运行uwsgi,从而将post请求正确地传递回uwsgi?
格雷格·詹宁斯

@GregJennings来得有点晚了,但是可以使用'uwsgi_pass'指令而不是'proxy_pass'。万一有人
流连忘返

1
@Will proxy_redirect有两个参数。请参阅该文档:nginx.org/en/docs/http/...
马修Scharley
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.