NGINX - 基于查询参数的不同后端代理

NGINX - different backend proxy based on query parameter

我有一个特定的场景,我需要根据查询参数路由到不同的后端:

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

where aws1 会说 http://edge1.amazonwebservices.com

如果它的 aws2 那么代理后端将是 http://edge2.amazonwebservices.com

等等...但我仍然没有想出如何做到这一点。

您可以使用 map directive to get a proxy hostname from the $arg_route 变量(其中包含 route 查询参数的值):

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;
    }
}

如果您不想在没有 route 查询参数的情况下为请求提供服务,您可以省略 map 块中的最后 default 行并添加以下 if 阻止您的服务器配置:

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

如果您需要代理请求,您还需要一篇 resolver directive (you can read some technical details about it in this 文章)。