블로그 | NGINX

NGINX 및 NGINX Plus를 위한 정규 표현식 테스터

NGINX-F5-수평-검정-유형-RGB의 일부
릭 넬슨 썸네일
릭 넬슨
2019년 6월 11일 게시

NGINX에서 사용할 정규 표현식(regex)을 작업하던 중, 실제 NGINX 구성에서 정규 표현식을 쉽게 테스트하는 방법에 대한 아이디어가 떠올랐습니다. (정규식 테스터는 NGINX 오픈 소스NGINX Plus 에서도 마찬가지로 작동하며, 읽기 편하도록 이 글에서는 단순히 NGINX 라고 지칭하겠습니다.)

정규 표현식 지원은 NGINX의 강력한 기능 중 하나이지만 정규 표현식은 복잡하고 제대로 사용하기 어려울 수 있습니다. 특히 정규 표현식을 정기적으로 사용하지 않는 경우 더욱 그렇습니다. NGINX에서는 위치, 맵, 다시 쓰기, 서버 이름 등 구성의 여러 부분에 대한 정규식을 허용합니다. 여기에 설명된 테스터는 위치 및 지도의 정규 표현식을 위한 것입니다.

대부분 정규 표현식에 유용한 무료 온라인 정규 표현식 테스터가 있지만 NGINX는 웹 애플리케이션에 최적화된 일부 비표준 단축키를 사용합니다. 예를 들어, 표준 정규 표현식에서처럼 URI에서 슬래시(/)를 이스케이프할 필요가 없습니다. 또한, 맵에서 정규식을 사용하는 경우 일치 여부에 따라 어떤 값을 설정할지 지정합니다. 다른 정규식 테스터를 사용하면 정규식을 수정해야 할 수도 있고, 맵의 경우 어떤 값이 설정될지 추론해야 할 수도 있습니다. 또한 실제 환경에서 실제 정규식 엔진으로 정규식을 테스트할 수 있는 것이 항상 좋습니다.

참고사항:

  • NGINX는 PCRE( Perl 호환 정규 표현식 )를 사용하며, 이 게시물에서는 NGINX와 정규 표현식에 대한 기본적인 이해가 있다고 가정합니다. 정규식을 구성하는 방법을 설명하는 것은 이 글의 범위를 벗어나며, 정규식을 구성하는 방법에 대한 추가 질문은 댓글 섹션에서 답변할 수 없습니다.

    정규식을 만드는 데 필요한 도구나 문서를 제공하는 웹사이트는 많습니다. 우리가 유용하다고 생각하는 두 가지는 다음과 같습니다.

  • 테스터는 두 가지 맥락, 즉 map{} 블록과 HTTP location{} 블록에서 정규 표현식을 처리합니다. 아래에서는 각각의 경우에서 정규 표현식이 어떻게 작동하는지 간략하게 설명합니다. NGINX가 모든 컨텍스트에서 정규 표현식을 처리하는 방식을 설명하는 것은 이 게시물의 범위를 벗어납니다. 다음 문서를 참조하세요.

  • 테스터는 의도적으로 가능한 한 단순하게 설계되었으며, 하나의 목적을 달성하도록 만들어졌습니다. 즉, 지도와 HTTP 위치에 대한 실제 NGINX 정규식 엔진을 사용하여 사용자가 작성한 정규식을 테스트하는 것입니다. 결과적으로, 작동하는 NGINX 구성을 만들기 위해 최소한의 정보만 제공하면 됩니다. 단순성의 지침 원칙을 위반하기 때문에 기능(예: 테스트 전 정규 표현식 검증)을 추가할 계획은 없습니다. 물론, 버그를 수정하는 데는 기꺼워요. 버그는 GitHub 저장소Issues 탭에서 제출해 주세요.

개요

정규 표현식 테스터의 세부 사항을 살펴보기 전에 먼저 NGINX 위치와 맵에서 정규 표현식을 어떻게 사용할 수 있는지 알아보겠습니다.

위치

NGINX location{} 블록의 정규 표현식은 다음과 같은 형식입니다.

위치 정규식 { #... }

예를 들어, 다음 정규 표현식을 사용하는 location{} 블록은 /test/myapp/hello.php/myapp/hello.php 와 같이 myapp/ filename .php 로 끝나는 URI를 사용하는 모든 PHP 요청을 처리합니다. 틸드 뒤에 있는 별표( ~* )는 대소문자를 구분하지 않고 일치시킵니다.

위치 ~* /myapp/.+\.php$ {
#...
}

NGINX와 정규식 테스터는 location{} 블록에서 위치 캡처 그룹을 지원합니다. 다음 예에서 첫 번째 그룹은 PHP 파일 이름 앞에 있는 모든 내용을 캡처하고 두 번째 그룹은 PHP 파일 이름을 캡처합니다.

위치 ~* (.*/myapp)/(.+\.php)$ {
#...
}

URI /myapp/hello.php 의 경우 변수 $1은 /myapp 으로 설정되고 $2는 hello.php 로 설정됩니다.

NGINX는 또한 명명된 캡처 그룹을 지원합니다.

위치 ~* (?<시작>.*myapp)/(?<끝>.+\.php)$ {
#...
}

이 경우 변수 $begin은 /myapp 으로 설정되고 $end는 hello.php 로 설정됩니다.

정규식 테스터는 명명된 캡처 그룹을 지원하지만 출력에서는 이를 위치 캡처 그룹처럼 처리하여 이름이 아닌 서수 번호를 표시합니다.

지도

정규 표현식을 사용하는 NGINX map{} 블록은 다음과 같은 형식입니다.

변수-테스트-변수-설정 - 정규식1 일치 시 설정할 값 ; 정규식2 일치 시 설정할 값 ; #... 정규식N 일치 시 설정할 값 ; 기본값 불일치 시 설정할 값 ; }

예를 들어, 이 map{} 블록은 변수 $isphp를 다음과 같이 설정합니다.1 URI( $uri 변수에 기록된 대로)가 .php 로 끝나는 경우0 그렇지 않은 경우(대소문자 구분):

맵 $uri $isphp {
~\.php$ 1;
기본값 0;
}

지도의 경우 NGINX와 정규식 테스터는 위치 캡처 그룹과 명명된 캡처 그룹을 모두 지원합니다.

예를 들어, 다음 맵은 모두 변수 $fileext를 파일 확장자 값으로 설정합니다. 이 예에서는 이 값이 $1 로 캡처됩니다.

지도 $uri $fileext {
    ~*.+\.(.+)$ $1;
    기본      '';
}

이 예에서 $ext는 다음과 같습니다.

맵 $uri $fileext {
~*.+\.(?<ext>.+)$ $ext;
기본 '';
}

http{}stream{} 컨텍스트 모두에서 map{} 블록에 대한 정규식 테스터를 사용할 수 있습니다. 왜냐하면 map의 구문과 동작이 두 컨텍스트에서 모두 동일하기 때문입니다. 하지만 맵이 stream{} 컨텍스트에 있는 경우 테스터의 출력에서 map{} 블록만 사용할 수 있습니다. 자세한 내용은 아래 참고사항을 참조하세요.

정규 표현식 테스터

정규식 테스터는 NGINX와 NGINX Unit이 설치된 Docker 컨테이너에서 구현됩니다. NGINX Unit은 두 가지 PHP 페이지 변형을 제공합니다. 하나는 location{} 블록의 정규식을 위한 것이고, 다른 하나는 map{} 블록의 정규식을 위한 것입니다. 두 페이지는 사용자에게 서로 다른 입력을 요구합니다.

  • 위치 페이지:

    • 정규식
    • 대소문자 구분
    • URI
  • 지도 페이지:

    • 정규식
    • 대소문자 구분
    • 테스트할 값( map 지시문의 첫 번째 매개변수인 변수의 값)
    • map 지시문의 두 번째 매개변수로 지정된 변수에 설정할 값

정보를 제공한 후 테스트 버튼을 클릭하세요. 테스터는 필요한 NGINX 구성 파일을 생성하고, 구성을 다시 로드한 후, 정규식을 테스트하기 위한 요청을 보냅니다. 그런 다음 결과가 표시되어 일치 항목이 있는지 여부를 나타냅니다. 그렇다면 위치 테스터 페이지에서 캡처 그룹의 값이 표시되고 맵 테스터 페이지에서 맵에 의해 설정된 값이 보고됩니다.

위치 페이지 예

이 예제는 URI /myapp/hello.php 에 대한 정규 표현식 (.*myapp)/(.+\.php)$ 의 대소문자를 구분하지 않는 테스트 결과를 보여줍니다.

 

지도 페이지 예

이 예제에서는 정규 표현식의 대소문자 구분 테스트 결과를 보여줍니다. .+\.(?<확장>.*)$ 가치에 반하여 /myapp/hello.php, 명명된 캡처 그룹이 있는 $확장 설정할 값으로:

 

메모: 맵이 stream{} 컨텍스트에 있는 경우, 구성의 출력에서 map{} 블록만 사용할 수 있습니다. server{} 블록은 stream{} 컨텍스트에서 지원되지 않는 location{} 블록을 포함하고 있기 때문에 유효하지 않습니다.

결론

NGINX 구성이 매우 짧고 간단하다는 것을 알 수 있습니다. 어려운 작업은 사용자가 입력한 값을 기반으로 필요한 NGINX 구성 파일을 생성하고, NGINX를 다시 로드하고, NGINX에 요청을 보내고, 결과를 표시하는 PHP 페이지가 수행합니다.

여러분은 정규식 테스터를 직접 사용해볼 수 있습니다. 모든 코드는 GitHub 저장소 ( https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-regex-tester )에서 다운로드할 수 있습니다.

정규식 테스터를 쉽게 구동할 수 있도록 모든 필수 파일이 포함되어 있습니다. Docker 이미지를 빌드하고 컨테이너를 빌드하려면 다음을 실행하세요.

$ docker-compose를 실행합니다.

그런 다음 브라우저에서 http:// Docker-host /regextester.php 를 입력하세요.

정규 표현식을 사용할 때 테스터가 도움이 되기를 바라며, NGINX의 강력함, 유연성, 단순성을 엿볼 수 있기를 바랍니다.

NGINX Plus로 정규식 테스터를 사용해보려면 오늘 무료 30일 체험판을 시작하거나, 사용 사례에 대해 논의하기 위해 저희에게 문의하세요 .


"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."