
Я использую следующее регулярное выражение 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, начинающимся с /?
, следует добавить это в регулярное выражение (как показано во втором примере).