Nginx

Nginx 匹配 if 語句中的任何單詞,除了一個

  • April 4, 2022

我在nginx配置中使用以下 if 語句正則表達式來匹配和阻止請求 uri 中的一些錯誤請求。這些錯誤的查詢總是隻請求一個參數,但每次都使用隨機名稱(和字母計數)。他們也總是點擊首頁。

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

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

如何修改此正則表達式以排除匹配某些參數名稱,例如keyor query(ie. /?query=somestring) ?

我嘗試使用圓括號,?(!query)但沒有運氣。

請幫我糾正這個正則表達式語句。提前致謝。

有兩種方法可以做到這一點。使用否定的前瞻斷言或使用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 /?,則應將其添加到正則表達式中(如我的第二個範例所示)。

引用自:https://serverfault.com/questions/1097740