
我在配置中使用以下 if 語句正規nginx
表示式來匹配並阻止請求 uri 內的一些錯誤請求。這些錯誤的查詢總是只請求一個參數,但每次都使用隨機名稱(和字母計數)。他們也總是會出現在主頁上。
錯誤查詢的範例:
/?some1bad0query2=nminkvywbjfdysnvhp
if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
return 403;
}
如何修改此正規表示式以排除符合某些參數名稱,例如key
or query
(即 /?query=somestring) ?
我嘗試使用圓括號,?(!query)
但沒有成功。
請幫我修正這個正規表示式語句。提前致謝。
答案1
例如:
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 /?
,您應該將其新增至正規表示式(如我的第二個範例所示)。