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

Jih*_*ang 25 ubuntu nginx redirect

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

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

如何使用 NginX 将 HTTP POST 数据传递到不同的域?

Mat*_*ley 37

尝试改用反向代理支持。一个示例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;
}
Run Code Online (Sandbox Code Playgroud)

此示例会将对此server块的所有请求传递到在 上运行的第二个服务器localhost:8080。这会保留POST's 并且如果它成为问题,也应该保留其他请求类型。

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

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

我相当确定大多数浏览器通过简单地将重定向的请求强制为请求来实现这一点GET。从理论上讲,该规范确实允许浏览器询问用户是否重定向POST数据,但我不知道目前有什么。