Home > OS >  NGINX - different backend proxy based on query parameter
NGINX - different backend proxy based on query parameter

Time:10-14

I've got a particular scenario where I'm needing to route to a different backend based on query parameter:

https://edge1.cdn.com/file.zip?{secure_link}&{tokens}&route=aws1

Where aws1 would be say http://edge1.amazonwebservices.com

and if its aws2 then proxy backend would be http://edge2.amazonwebservices.com

and so on... but I still have not figured out how to do this.

CodePudding user response:

You can use map directive to get a proxy hostname from the $arg_route variable (which contains a value of the route query argument):

map $arg_route $aws {
    aws1    edge1.amazonwebservices.com;
    aws2    edge2.amazonwebservices.com;
    ...
    default <default_hostname>;
}

server {
    ...
    # if you want to proxy the request, you'd need a 'resolver' directive
    resolver <some_working_DNS_server_address>;

    location / {
        # if you want to proxy the request
        proxy_pass http://$aws;
        # or if you want to redirect the request
        rewrite ^ http://$aws$uri permanent;
    }
}

If you don't want to serve the request without route query argument, you can omit the last default line at the map block and add the following if block to your server configuration:

if ($aws = '') {
    return 403; # HTTP 403 denied
}

If you need to proxy the request you'd additionally need a resolver directive (you can read some technical details about it in this article).

  • Related