Search code examples
nginxproxypass

nginx proxy_pass url with GET params conditionally


I have a url http://foo.com/banana and I have another url http://foo.com/banana?a=1&b=2

I like that all /banana routes are handled by my local nginx, but I'd like any banana routes with GET params to be proxied to http://bar.com

so:

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

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

I should note this is not for production. I'm trying to redirect api calls to redirect to another server during development.

I've tried to do an 'if args' block but I can't do a proxy_pass in an if block. I thought about doing a rewrite of: http://foo.com/banana?a=1 -> http://foo.com/proxy?a=1

location /proxy {
   proxy_pass http://bar.com;
}

But I don't have the right logic for above because bar.com is expecting the /banana route.

Any ideas?


Solution

  • Since this is not for production, you could stick with your original "if" solution. You only need to escape from the "if" block to be able to proxy_pass, which can be easily done with the traditional trick:

    location /banana {
        error_page 418 = @good_old_fallback;
    
        if ($args) {
            return 418;
        }
    }
    
    location @good_old_fallback {
        proxy_pass http://bar.com;
    }
    

    Your idea of using another location will also work, so if you prefer it better, you can go with something like this:

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