我管理的电子商务网站的部分客户位于 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”格式的文本、解析对相对路径组件“.”和“..”的引用,以及可能将两个或多个相邻的斜线压缩为一个斜线)。您应该更改$args
nginx 变量。使用正则表达式看起来会像这样
if ($args ~ ^(.*)(&?_sm_byp=\w+)) {
set $args $1;
}
从 更改[&?]
为&?
并不是错误。这是因为$args
变量不包含问号,所以如果查询参数不是唯一的,则&
字符可以存在,否则可以不存在。_sm_byp
我可以建议更高级的正则表达式(由我自己编写),它允许从查询字符串中剪切一些查询参数,无论它位于该字符串的开头、中间还是结尾:
if ($args ~ (.*)(^|&)_sm_byp=[^&]*(\2|$)&?(.*)) {
set $args $1$3$4;
}