Nginx
Nginx 匹配 if 語句中的任何單詞,除了一個
我在
nginx
配置中使用以下 if 語句正則表達式來匹配和阻止請求 uri 中的一些錯誤請求。這些錯誤的查詢總是隻請求一個參數,但每次都使用隨機名稱(和字母計數)。他們也總是點擊首頁。錯誤查詢範例:
/?some1bad0query2=nminkvywbjfdysnvhp
if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") { return 403; }
如何修改此正則表達式以排除匹配某些參數名稱,例如
key
orquery
(ie. /?query=somestring) ?我嘗試使用圓括號,
?(!query)
但沒有運氣。請幫我糾正這個正則表達式語句。提前致謝。
例如:
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/?
,則應將其添加到正則表達式中(如我的第二個範例所示)。