Nginx 符合 if 語句中除一個以外的任何單字

Nginx 符合 if 語句中除一個以外的任何單字

我在配置中使用以下 if 語句正規nginx表示式來匹配並阻止請求 uri 內的一些錯誤請求。這些錯誤的查詢總是只請求一個參數,但每次都使用隨機名稱(和字母計數)。他們也總是會出現在主頁上。

錯誤查詢的範例: /?some1bad0query2=nminkvywbjfdysnvhp

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

如何修改此正規表示式以排除符合某些參數名稱,例如keyor 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 /?,您應該將其新增至正規表示式(如我的第二個範例所示)。

相關內容