首页 > 解决方案 > Nginx 去除 URL 参数

问题描述

我想在将其发送到 proxy_pass 之前剥离 url 参数

对于访问者请求网址:=> https://example.com/?wanted1=aaa&unwanted1=bbb&unwanted2=ccc&wanted2=ddd

然后它将所有不需要的参数剥离到:=> https://example.com/?wanted1=aaa&wanted2=ddd

我现在的方式是这样的:

if ($args ~ ^(.*)&(?:unwanted1|unwanted2)=[^&]*(&.*)?$ ) {
    set $args $1$2;
}

但它只删除 1 个参数并且从不进行递归。如何解决这个问题?我想修改 $args。

标签: regexnginx

解决方案


如果你想要递归,你可以在一个块中使用rewrite...lastfrom 。locationNginx 在产生内部服务器错误之前只会容忍少量的递归(可能是十次迭代)。

例如:

location / {
    if ($args ~ ^(?<prefix>.*)&(?:unwanted1|unwanted2)=[^&]*(?<suffix>&.*)?$ ) {
        rewrite ^ $uri?$prefix$suffix? last;
    }
    ...
}

请注意,您需要使用命名捕获,因为在rewrite评估语句时会重置编号的捕获。

请注意,这rewrite需要尾随?以防止将现有参数附加到重写的 URI。有关详细信息,请参阅此文档


推荐阅读