使用 proxy_pass 将完整的 URL 发送到后端服务器
Send full URL to backend server with proxy_pass
我想让 Nginx 充当后端服务的反向代理,但是与后端服务的连接本身必须通过另一个代理:
[nginx] -> [HTTP proxy] -> [backend service]
Nginx 似乎没有办法配置传出连接通过代理(例如,http_proxy
环境变量被忽略)。
但这可能足以:
将 proxy_pass
目标设置为 HTTP 代理服务器地址。
说服 Nginx 像 GET http://backend/path/etc
一样将完整的目标 URL 发送到代理,而不仅仅是 GET /path/etc
.
我试过了:
rewrite ^/prefix/(.*) http://backend/ break;
proxy_pass http://proxy;
几乎 有效,但 rewrite
is that it stops processing and issues a redirect if the replacement begins with http://
. (Code here).
的行为
通过使用两个 rewrite
指令可以绕过 rewrite
的重定向行为:
location /prefix/ {
rewrite ^/prefix/(.*) xxx://backend/ ;
rewrite ^xxx(.*) http break;
proxy_pass http://proxy;
}
因此,对 http://frontend/prefix/x
的传入 GET 请求将导致与代理服务器的连接并发送 GET http://backend/x
,后者将作为 GET /x
.[=16= 转发到后端服务器]
我想让 Nginx 充当后端服务的反向代理,但是与后端服务的连接本身必须通过另一个代理:
[nginx] -> [HTTP proxy] -> [backend service]
Nginx 似乎没有办法配置传出连接通过代理(例如,http_proxy
环境变量被忽略)。
但这可能足以:
将
proxy_pass
目标设置为 HTTP 代理服务器地址。说服 Nginx 像
GET http://backend/path/etc
一样将完整的目标 URL 发送到代理,而不仅仅是GET /path/etc
.
我试过了:
rewrite ^/prefix/(.*) http://backend/ break;
proxy_pass http://proxy;
几乎 有效,但 rewrite
is that it stops processing and issues a redirect if the replacement begins with http://
. (Code here).
通过使用两个 rewrite
指令可以绕过 rewrite
的重定向行为:
location /prefix/ {
rewrite ^/prefix/(.*) xxx://backend/ ;
rewrite ^xxx(.*) http break;
proxy_pass http://proxy;
}
因此,对 http://frontend/prefix/x
的传入 GET 请求将导致与代理服务器的连接并发送 GET http://backend/x
,后者将作为 GET /x
.[=16= 转发到后端服务器]