我在配置中使用以下 if 语句正则nginx
表达式来匹配和阻止请求 uri 中的某些不良请求。这些不良查询始终只请求一个参数,但每次都带有随机名称(和字母数字计数)。它们也总是访问主页。
错误查询的示例:
/?some1bad0query2=nminkvywbjfdysnvhp
if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
return 403;
}
我如何修改此正则表达式以排除匹配某些参数名称(如key
或)query
(即/?query = somestring)?
我尝试使用圆括号,?(!query)
但没有成功。
请帮我修正这个正则表达式。提前致谢。
答案1
例如:
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 /?
,则应将其添加到正则表达式中(如我的第二个示例所示)。