如何使用 NGINX 作为任何请求位置的转发代理?

How to use NGINX as forward proxy for any requested location?

我正在尝试将 NGINX 配置为转发代理以替换我们用作转发代理的 Fiddler。我们使用的 Fiddler 功能允许我们将所有传入请求代理到 8888 端口。我如何使用 NGINX 做到这一点?

在 NGINX 作为反向代理的所有示例中,我看到 proxy_pass 总是定义到特定的 upstream/proxied 服务器。我如何配置它以便它转到请求的服务器,而不管服务器的方式与我使用 Fiddler 作为转发代理的方式相同。

示例:

在我的代码中:

WebProxy proxyObject = new WebProxy("http://mynginxproxyserver:8888/",true);
WebRequest req = WebRequest.Create("http://www.contoso.com");
req.Proxy = proxyObject;

在 mynginxproxyserver/nginx.conf 中,我不想将代理委托给另一台服务器(例如 proxy_pass 设置为 http://someotherproxyserver)。相反,我希望它只是一个代理服务器,并将来自我的客户端(见上文)的请求重定向到请求主机。当您将 Fiddler 启用为代理时,这就是它所做的:http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/UseFiddlerAsReverseProxy

您的代码似乎使用了正向代理(通常只是 "proxy"),而不是反向代理,它们的运行方式完全不同。反向代理适用于服务器端,而客户端并没有真正看到或考虑。它是从后端服务器检索内容并交给客户端。转发代理是客户端为了连接到 Internet 的其余部分而设置的东西。反过来,服务器可能对您的转发代理一无所知。

Nginx 最初被设计为反向代理,而不是正向代理。但它仍然可以用作前锋。这就是为什么您可能找不到太多配置的原因。

这更像是一个理论答案,因为我自己从未这样做过,但像下面这样的配置应该可以工作。

server {
    listen       8888;

    location / {
        resolver 8.8.8.8; # may or may not be necessary.
        proxy_pass http://$http_host$uri$is_args$args;
    }
}

这只是重要的部分,您需要配置其余部分。

想法是 proxy_pass 将传递给变量主机而不是预定义的主机。因此,如果您请求 http://example.com/foo?bar,您的 http header 将包含 example.com 的主机。这将使您的 proxy_pass 从 http://example.com/foo?bar.

检索数据

您链接的文档将其用作反向代理。相当于

        proxy_pass http://localhost:80;

当使用 Grumpy 建议的 $uri 变量时,您可以 运行 陷入 url 编码问题,因为它由 nginx 自动解码。我建议您将代理传递行修改为

proxy_pass http://$http_host$request_uri;

变量$request_uri保持编码不变,还包含所有查询参数。