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

Arm*_*tov 11 proxy reverse-proxy nginx fiddler

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

在作为反向代理的NGINX的所有示例中,我看到proxy_pass始终定义到特定的上游/代理服务器.我如何配置它以便它进入所请求的服务器,无论服务器与我使用Fiddler作为转发代理的方式相同.

例:

在我的代码中:

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

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

Gru*_*mpy 27

您的代码似乎使用转发代理(通常只是"代理"),而不是反向代理,它们的运行方式完全不同.反向代理服务器端是客户端没有真正看到或想到的东西.它是从后端服务器检索内容并传递给客户端.转发代理是客户设置的,以便连接到互联网的其余部分.反过来,服务器可能对您的转发代理一无所知.

fwd vs rev proxy

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

这只是重要的一点,你需要配置其余部分.

想法是proxy_pass将传递给变量主机而不是预定义的主机.因此,如果您要求http://example.com/foo?bar,您的http标头将包含主机example.com.这将使您的proxy_pass从中检索数据http://example.com/foo?bar.

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

        proxy_pass http://localhost:80;
Run Code Online (Sandbox Code Playgroud)

  • 不适用于HTTPS目标.关于失败的`CONNECT`返回400错误到443. (5认同)
  • 这确实有效!我确实需要:`resolver 8.8.8.8;` (2认同)

Dav*_*her 11

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

proxy_pass http://$http_host$request_uri;

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