nginx:选择性地剥离 URL 参数

nginx:选择性地剥离 URL 参数

我管理的电子商务网站的部分客户位于 ZScaler 防火墙后面,它会将垃圾查询参数附加到所有传出请求中;因此,当我的网站发出如下 HTTP GET 请求时:

/api/cartinventoryitems?cartsummaryid=eq.1234

它传到 nginx 时的形式为:

/api/cartinventoryitems?cartsummaryid=eq.1234&_sm_byp=iVVJvVj6nqJDqQj5

我所在位置后面的端点/api/不喜欢这样,所以我试图将其剥离掉。

现在,我正尝试rewrite在我的区块顶部使用它server,如下所示:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        rewrite ^(.*)([&?]_sm_byp=\w+) $1 last;
        ...
}

但它似乎不起作用。如能得到任何帮助,我将不胜感激。

答案1

rewrite(以及location)nginx 指令与所谓的规范化请求的查询部分未包含的 URI(其他规范化步骤包括解码 URL 编码的“%XX”格式的文本、解析对相对路径组件“.”和“..”的引用,以及可能将两个或多个相邻的斜线压缩为一个斜线)。您应该更改$argsnginx 变量。使用正则表达式看起来会像这样

if ($args ~ ^(.*)(&?_sm_byp=\w+)) {
    set $args $1;
}

从 更改[&?]&?并不是错误。这是因为$args变量不包含问号,所以如果查询参数不是唯一的,则&字符可以存在,否则可以不存在。_sm_byp

我可以建议更高级的正则表达式(由我自己编写),它允许从查询字符串中剪切一些查询参数,无论它位于该字符串的开头、中间还是结尾:

if ($args ~ (.*)(^|&)_sm_byp=[^&]*(\2|$)&?(.*)) {
    set $args $1$3$4;
}

相关内容