代码之家  ›  专栏  ›  技术社区  ›  Arman Bimatov

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

  •  28
  • Arman Bimatov  · 技术社区  · 8 年前

    proxy_pass 始终定义为特定的上游/代理服务器。我如何配置它,使其进入请求的服务器,而不管服务器是什么,就像我使用Fiddler作为转发代理一样。

    例子:

    在我的代码中:

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

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

    2 回复  |  直到 8 年前
        1
  •  63
  •   marc_s MisterSmith    8 年前

    您的代码似乎使用的是正向代理(通常只是“代理”),而不是反向代理,它们的操作非常不同。反向代理用于服务器端,客户端并没有真正看到或想到。它是从后端服务器检索内容并交给客户端。转发代理是客户端为了连接到internet的其余部分而设置的。反过来,服务器可能对转发代理一无所知。

    fwd vs rev proxy

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

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

    http://example.com/foo?bar ,您的http标头将包括 example.com . 这将使您的proxy\u pass从中检索数据 http://example.com/foo?bar .

            proxy_pass http://localhost:80;
    
        2
  •  7
  •   David Asher    4 年前

    使用时可能会遇到url编码问题 $uri 变量,因为它是由nginx自动解码的。我建议您将代理传递线修改为

    proxy_pass http://$http_host$request_uri;

    $request_uri 保留tact编码,并包含所有查询参数。