因为服务端A需要发送http请求去服务端C,获取数据,但公司原则不允许直接开通A和C的网络策略,只能通过公网访问C,所以从nginx所在的B与服务端C开通网络互访,然后用nginx进行转发,场景是这样。
然后我在B机器上直接用curl命令去发送http请求可以正常返回,但是用代码去请求就报错302 found。
经过查询,因为端口为非默认的80,故把设置修改proxy_set_header Host 为
location ^~ /apiname/ {
proxy_pass http://123.123.1.1:8082/apiname/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass_header Set-Cookie;
client_max_body_size 5120m;
}
修改完之后依旧报错302.再经过查询,需要在302报错的时候,让nginx主动跟随302的地址,把内容取给我们,这需要进行如下设置:
server {
...
location ^~ /apiname/ {
proxy_pass http://123.123.1.1:8082/apiname/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass_header Set-Cookie;
proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirects;
client_max_body_size 5120m;
}
location @handle_redirects {
set $saved_redirect_location '$upstream_http_location';
proxy_pass $saved_redirect_location;
}
}
测试有效