所以,我有一个第三方代理(可能是在squid下),它只接受来自我的一个IP的连接,但我需要能够从各种IP访问它。
所以我试图把一个nginx转发给这个代理的请求。我知道nginx可以像这样转发请求:
location / {
proxy_pass http://$http_host$uri$is_args$args;
}
如果我需要nginx将请求直接转发到目标站点,这将有效,但我需要先将它传递给代理X.我试过这个:
upstream myproxy {
server X.X.X.X:8080;
}
location / {
proxy_pass http://myproxy$uri$is_args$args; // also tried: http://myproxy$http_host$uri$is_args$args
}
但我得到“(104)连接重置由同行”。我猜是因为nginx的代理是这样的:
GET /index.html HTTP/1.1
Host: www.targetdomain.com.br
但我需要它代理这样:
GET http://www.targetdomain.com.br/index.html HTTP/1.1
答案 0 :(得分:3)
我发现这有效:
http {
# resolver 8.8.8.8; # Needed if you use a hostname for the proxy
server_name ~(?<subdomain>.+)\.domain\.com$;
server {
listen 80;
location / {
proxy_redirect off;
proxy_set_header Host $subdomain;
proxy_set_header X-Forwarded-Host $http_host;
proxy_pass "http://X.X.X.X:8080$request_uri";
}
}
}
如果resolver
是主机名而不是IP,则需要使用X.X.X.X
。
检查https://github.com/kawanet/nginx-forward-proxy/blob/master/etc/nginx.conf以获取更多技巧。
编辑:还要检查nginx server_name wildcard or catch-all和http://nginx.org/en/docs/http/ngx_http_core_module.html#var_server_name