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

Связанный контент