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 文章)。
我有一个特定的场景,我需要根据查询参数路由到不同的后端:
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 文章)。