nginx-将请求转发到另一个代理

nginx-将请求转发到另一个代理,nginx,proxy,Nginx,Proxy,因此,我有一个第三方代理(可能在squid下),它只接受来自我的一个IP的连接,但我需要能够从各种IP访问它 所以我尝试使用nginx将请求转发给这个代理。我知道nginx可以转发这样的请求: location / { proxy_pass http://$http_host$uri$is_args$args; } GET /index.html HTTP/1.1 Host: www.targetdomain.com.br GET http://www.targetdomain.co

因此,我有一个第三方代理(可能在squid下),它只接受来自我的一个IP的连接,但我需要能够从各种IP访问它

所以我尝试使用nginx将请求转发给这个代理。我知道nginx可以转发这样的请求:

location / {
    proxy_pass http://$http_host$uri$is_args$args;
}
GET /index.html HTTP/1.1
Host: www.targetdomain.com.br
GET http://www.targetdomain.com.br/index.html HTTP/1.1
如果我需要nginx将请求直接转发到目标站点,那么这将是可行的,但我需要它首先将请求传递给proxy 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是这样代理的:

location / {
    proxy_pass http://$http_host$uri$is_args$args;
}
GET /index.html HTTP/1.1
Host: www.targetdomain.com.br
GET http://www.targetdomain.com.br/index.html HTTP/1.1
但我需要这样的代理:

location / {
    proxy_pass http://$http_host$uri$is_args$args;
}
GET /index.html HTTP/1.1
Host: www.targetdomain.com.br
GET http://www.targetdomain.com.br/index.html HTTP/1.1

我发现这是可行的:

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";
    }
  }
}
http{
#解析程序8.8.8.8;#如果代理使用主机名,则需要
服务器名称(?。+)\.domain\.com$;
服务器{
听80;
地点/{
代理_重定向关闭;
代理集头主机$子域;
代理设置头X转发主机$http\U主机;
代理"通行证"http://X.X.X.X:8080$request_uri”;
}
}
}
如果
X.X.X.X
是主机名而不是IP,则需要使用
resolver

检查更多的技巧


编辑:同时检查并

我理解,但在这种情况下,您需要手动设置“www.targetdomain.com.br”,我希望它能够自动解决。我现在正在使用squid来实现这一点。我编辑了我的答案,以展示我如何处理这个问题(使用捕获到子域变量的
server\u name
)。如果需要根据查询参数设置主机,可以使用
If
set
等进行匹配(请参阅我答案底部的链接)。是的,请参阅。在您的情况下,我相信您可以删除
server\u name
指令,在
listen
指令中添加
default\u server
,并使用
$server\u name
而不是
$subdomain
。查看我的编辑。这仍然以仅路径的形式向代理发送请求,而不是使用scheme的完整URL。