Nginx는 if 문의 단어 중 하나만 제외하고 모든 단어와 일치합니다.

Nginx는 if 문의 단어 중 하나만 제외하고 모든 단어와 일치합니다.

nginx요청 URI 내의 일부 잘못된 요청을 일치시키고 차단하기 위해 구성 에서 다음 if 문 정규식을 사용하고 있습니다 . 이러한 잘못된 쿼리는 항상 하나의 인수만 요청하지만 매번 임의의 이름(및 영숫자 개수)을 사용합니다. 그들은 또한 항상 홈페이지를 방문했습니다.

잘못된 쿼리의 예: /?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에만 적용되는 경우 /?이를 정규식에 추가해야 합니다(두 번째 예 참조).

관련 정보