通过 proxy_pass 将选择性参数从 Nginx 代理发送到上游

通过 proxy_pass 将选择性参数从 Nginx 代理发送到上游

我为 Minio S3 对象存储服务器配置了 Nginx 代理。

当我将请求传递给上游(Minio)时,我可以删除一些查询参数(多个 agr)并保留其余参数吗?

例如:这是 Nginx 收到的请求:

/my-private-bucket/my-image.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&w=320&X-Amz-Date=20211218T231908Z&h=200

我需要将上面的链接转换为下面的链接(即删除多余的参数:w=320 和 h=200),然后使用代理密码

/my-private-bucket/my-image.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20211218T231908Z

当然,我可以在位置块中使用多个 IF 语句:以下是一个示例或者这个. 但我认为应该有更合理的做法。比如在 bash 中使用正则表达式和 sed:

echo [mentioned uri] | sed -E 's/&?[wh]=[0-9]*//g'

...甚至使用 Nginx 中的 map 块:

map $args $polished-args
{
    default $args
    ~&?[wh]=[0-9]* ((something magical))
}

有任何想法吗?

答案1

如果您可以反过来工作,即传递已知的参数列表,则可以使用:

proxy_pass http://backend.example.com/path?param1=$arg_param1&param2=$arg_param2

如果放置的键的参数顺序始终保持不变,那么您可以使用map

map $args $cleaned_args {
    default $args;
    ^(.*)[?&]w=[0-9]+(.*)&h=[0-9]+(.*)$ $1$2$3;
    ^(.*)[?&]h=[0-9]+(.*)&w=[0-9]+(.*)$ $1$2$3;
}

正则表达式会先捕获&w或之前的所有内容?w,然后捕获 或 之前的所有内容,&h并将其余部分放入捕获组中。第二个选项对相反的参数顺序执行相同操作。

相关内容