有条件地使用GET参数的nginx proxy_pass url

有条件地使用GET参数的nginx proxy_pass url,nginx,proxypass,Nginx,Proxypass,我有一个urlhttp://foo.com/banana我还有另一个urlhttp://foo.com/banana?a=1&b=2 我喜欢所有的/banana路由都由我本地的nginx处理,但是我希望所有带有GET参数的banana路由都被代理到http://bar.com 因此: http://foo.com/banana->http://foo.com/banana http://foo.com/banana?a=1->(代理)->http://bar.com/banana?a=1 我应该

我有一个url
http://foo.com/banana
我还有另一个url
http://foo.com/banana?a=1&b=2

我喜欢所有的
/banana
路由都由我本地的nginx处理,但是我希望所有带有GET参数的banana路由都被代理到
http://bar.com

因此:

http://foo.com/banana
->
http://foo.com/banana

http://foo.com/banana?a=1
->
(代理)
->
http://bar.com/banana?a=1

我应该注意到这是而不是生产的。我正在尝试重定向api调用,以便在开发期间重定向到另一台服务器

我尝试过执行“if args”块,但无法在if块中执行
代理传递。
我想重写一下:
http://foo.com/banana?a=1
->
http://foo.com/proxy?a=1

location /proxy {
   proxy_pass http://bar.com;
}
但是我没有上面的正确逻辑,因为
bar.com
正在等待
/banana
路径


有什么想法吗?

因为这不是为了生产,所以您可以坚持使用原始的“如果”解决方案。您只需跳出“if”块即可代理_pass,这可以通过传统技巧轻松完成:

location /banana {
    error_page 418 = @good_old_fallback;

    if ($args) {
        return 418;
    }
}

location @good_old_fallback {
    proxy_pass http://bar.com;
}
您使用其他位置的想法也会起作用,因此,如果您更喜欢它,您可以选择以下方式:

location /banana {
    if ($args) {
        rewrite ^/banana(.*)$ /proxy$1 last;
    }
}

location /proxy {
    internal;
    rewrite ^/proxy(.*)$ /banana$1 break;
    proxy_pass http://bar.com;
}

真棒的例子!第二个被证明对我所做的工作更有效,谢谢你花时间从两个方面解释它。