Nginx 匹配 if 语句中的任意单词,除了一个

Nginx 匹配 if 语句中的任意单词,除了一个

我在配置中使用以下 if 语句正则nginx表达式来匹配和阻止请求 uri 中的某些不良请求。这些不良查询始终只请求一个参数,但每次都带有随机名称(和字母数字计数)。它们也总是访问主页。

错误查询的示例: /?some1bad0query2=nminkvywbjfdysnvhp

if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
  return 403;
}

我如何修改此正则表达式以排除匹配某些参数名称(如key或)query(即/?query = somestring)?

我尝试使用圆括号,?(!query)但没有成功。

请帮我修正这个正则表达式。提前致谢。

答案1

有两种方法可以做到这一点。使用否定前瞻断言或使用map

例如:

if ($request_uri ~ "(?!query)\w{5,25}=\w{5,25}$") { return 403; }

其优点map在于,正则表达式会按顺序进行评估,直到找到匹配项,因此可以避免复杂的前瞻表达式。

例如:

map $request_uri $reject {
    ~*^/\?query=                0;
    "~*^/\?\w{5,25}=\w{5,25}$"  1;
}
server {
    ...
    if ($reject) { return 403; }
    ...
}

map位于server块之外。如果规则仅适用于以 开头的 URI /?,则应将其添加到正则表达式中(如我的第二个示例所示)。

相关内容