我的 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;
}