我为 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¶m2=$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
并将其余部分放入捕获组中。第二个选项对相反的参数顺序执行相同操作。