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

luc*_*wxp 6 proxy nginx

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

所以我试图放置一个 nginx 来将请求转发到这个代理。我知道 nginx 可以转发这样的请求:

location / {
    proxy_pass http://$http_host$uri$is_args$args;
}
Run Code Online (Sandbox Code Playgroud)

如果我需要 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
}
Run Code Online (Sandbox Code Playgroud)

但是我得到“(104)对等方重置连接”。我猜是因为 nginx 是这样代理的:

GET /index.html HTTP/1.1
Host: www.targetdomain.com.br
Run Code Online (Sandbox Code Playgroud)

但我需要它来代理这样的:

GET http://www.targetdomain.com.br/index.html HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

Sil*_*lex 7

我发现这有效:

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";
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

resolver如果X.X.X.X是主机名而不是 IP,则需要使用。

检查https://github.com/kawanet/nginx-forward-proxy/blob/master/etc/nginx.conf了解更多技巧。

编辑:还要检查nginx server_name 通配符或 catch-allhttp://nginx.org/en/docs/http/ngx_http_core_module.html#var_server_name

  • 这仍然以仅路径的形式将请求发送到代理,而不是带有方案的完整 URL。 (3认同)