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

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

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

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

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

答案1

尝试使用反向代理支持取而代之。示例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,但我不知道目前有哪些浏览器这样做。

答案2

您也可以在 Nginx 中实现此目的,但mirror不使用插件rewrite

location "/post/uri/to/redirect/" {                                        
    mirror "/mirror";                                                       
    mirror_request_body on;                                                 
    return 200;                                                             
}                                                                           

location = "/mirror" {                                                      
    internal;                                                               
    proxy_pass "https://target_domain$request_uri";                   
    proxy_set_header Host "target_domain";                            
    proxy_set_header X-Original-URI $request_uri;                           
    proxy_set_header X-SERVER-PORT $server_port;                            
    proxy_set_header X-SERVER-ADDR $server_addr;                            
    proxy_set_header X-REAL-IP $remote_addr;                                
}                                                                           

相关内容