ngx_http_rewrite_module
ngx_http_rewrite_module 모듈은 PCRE 정규식을 사용하여 요청 URI를 변경하고 리디렉션을 반환하고 조건부로 구성을 선택하는 데 사용됩니다.
break, if, return, rewrite 및 set 명령은 다음 순서로 처리됩니다.
- 서버 수준에서 지정되는 이 모듈의 명령은 이후에 실행됩니다.
- 반복적으로:
- location는 요청 URI에 따라 검색됩니다.
- 발견된 위치 내에 지정되는 이 모듈의 명령은 순차로 실행됩니다.
- 요청 URI가 다시 작성되지만 루프가 반복되지만 10번 이상 반복되지는 않습니다.
Directives
Syntax: break;
Default: —
Context: server, location, if
ngx_http_rewrite_module 명령의 현재 세트 처리를 중지합니다.
명령이 location 내에 지정된 경우 요청의 추가 처리는 이 위치에서 계속됩니다.
예:
if ($slow) {
limit_rate 10k;
break;
}
Syntax: if (condition) { ... }
Default: —
Context: server, location
지정된 조건이 평가됩니다. 참이면 중괄호 내에 지정된 이 모듈 명령이 실행되고 요청이 if 명령 내의 구성에 할당됩니다. if 명령 내의 구성은 이전 구성 수준에서 상속됩니다.
조건은 다음 중 하나일 수 있습니다.
- 변수 이름, 변수 값이 비어 있는 문자열이거나 “0”이면 거짓
버전 1.0.1 이전에 “0”으로 시작하는 모든 문자열은 거짓 값으로 간주되었습니다.
- “=” 및 “!=” 연산자를 사용하여 변수와 문자열 비교
- “~”(대소문자를 구분하는 일치의 경우) 및 “~*”(대소문자를 구분하지 않는 일치) 연산자를 사용하여 정규식에 대해 변수 일치. 정규식에 $1..$9 변수에서 나중에 재사용하기 위해 사용하도록 설정된 캡처가 포함될 수 있습니다. 네거티브 연산자 “!~” 및”!~*”도 사용 가능합니다. 정규식에 “}” 또는 “;” 문자가 포함된 경우 전체 식은 작은따옴표 또는 큰따옴표로 묶을 수 있습니다.
- “-f” 및 “!-f” 연산자로 파일 존재 확인
- “-d” 및 “!-d” 연산자로 디렉터리 존재 확인
- “-e” 및 “!-e” 연산자로 파일, 디렉터리 또는 심볼 링크 존재 확인
- “-x” 및 “!-x” 연산자로 실행 파일 확인.
예:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
$invalid_referer 포함 변수의 값은 valid_referers 명령에 의해 설정됩니다.
Syntax: return code [text];
return code URL;
return URL;
Default: —
Context: server, location, if
처리를 중지하고 지정된 코드를 클라이언트에 반환합니다. 표준이 아닌 코드 444는 응답 헤더를 보내지 않고 연결을 닫습니다.
버전 0.8.42부터 리디렉션 URL(코드 301, 302, 303, 307, 308의 경우) 또는 응답 본문 텍스트(다른 코드의 경우)를 지정할 수 있습니다. 응답 본문 텍스트 및 리디렉션 URL은 변수를 포함할 수 있습니다. 특별한 경우로 리디렉션 URL은 이 서버에 URI 로컬로 지정될 수 있습니다. 이 경우 전체 리디렉션 URL은 요청 체계($scheme), server_name_in_redirect 및 port_in_redirect 명령에 따라 구성됩니다.
또한 코드가 302인 임시 리디렉션을 위한 URL은 단독 매개변수로 지정할 수 있습니다. 그러한 매개변수는 “http://”, “https://” 또는 “$scheme” 문자열로 시작해야 합니다. URL은 변수를 포함할 수 있습니다.
버전 0.7.51 이전에는 다음 코드만 반환될 수 있습니다. 204, 400, 402~406, 408, 410, 411, 413, 416, 500~504.
코드 307은 버전 1.1.16 및 1.0.13까지 리디렉션으로 처리되지 않았습니다.
코드 308은 버전 1.13.0까지 리디렉션으로 처리되지 않았습니다.
error_page 디렉티브도 참조하세요.
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
지정된 정규식이 요청 URI와 일치하면 URI는 교체 문자열에 지정된 대로 변경됩니다. rewrite 명령은 구성 파일에 표시된 순서로 순차적으로 실행됩니다. 플래그를 사용하여 명령의 추가 처리를 종료할 수 있습니다. 교체 문자열이 “http://”, “https://” 또는 “$scheme”으로 시작되는 경우 처리가 중지되고 리디렉션이 클라이언트에 반환됩니다.
플래그 매개변수 옵션은 다음 중 하나일 수 있습니다.
last
ngx_http_rewrite_module 명령의 현재 세트 처리를 중지하고 변경된 URI와 일치하는 새 위치 검색을 시작합니다.
break
break 명령과 같이 ngx_http_rewrite_module 명령의 현재 세트 처리를 중지합니다.
redirect
302 코드로 임시 리디렉션을 반환하고, 교체 문자열이 “http://”, “https://” 또는 “$scheme”으로 시작하지 않는 경우 사용됩니다.
permanent
301 코드로 영구 리디렉션을 반환합니다.
전체 리디렉션 URL은 요청 체계($scheme), server_name_in_redirect 및 port_in_redirect 명령에 따라 구성됩니다.
예:
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
하지만 이러한 명령이 “/download/” 위치 안에 배치되면 last 플래그는 break로 교체되어야 하고 그렇지 않으면 nginx는 10회 주기를 만들고 500 오류를 반환합니다.
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
교체 문자열에 새로운 요청 인수가 포함되는 경우 이전 요청 인수는 그다음에 추가됩니다. 이렇게 되는 것을 원하지 않는 경우 교체 문자열 끝에 물음표를 붙이면 추가되지 않습니다. 예를 들어, 다음과 같습니다.
rewrite ^/users/(.*)$ /show?user=$1? last;
정규식에 “}” 또는 “;” 문자가 포함된 경우 전체 식은 작은따옴표 또는 큰따옴표로 묶을 수 있습니다.
Syntax: rewrite_log on | off;
Default: rewrite_log off;
Context: http, server, location, if
notice 수준에서 error_log에 ngx_http_rewrite_module 모듈 명령 처리 결과를 기록하는 것을 활성화하거나 비활성화합니다.
Syntax: set $variable value;
Default: —
Context: server, location, if
지정된 변수에 대한 값을 설정합니다. 값은 텍스트, 변수 및 그 조합을 포함할 수 있습니다.
Syntax: uninitialized_variable_warn on | off;
Default: uninitialized_variable_warn on;
Context: http, server, location, if
초기화되지 않은 변수에 대한 경고가 기록되는지를 제어합니다.
내부 구현
ngx_http_rewrite_module 모듈 명령은 구성 단계에서 요청 처리 중에 해석되는 내부 지침으로 컴파일됩니다. 해석자는 단순한 가상 스택 시스템입니다.
예를 들어, 명령은
location /download/ {
if ($forbidden) {
return 403;
}
if ($slow) {
limit_rate 10k;
}
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
}
다음 지침으로 번역됩니다.
variable $forbidden
check against zero
return 403
end of code
variable $slow
check against zero
match of regular expression
copy "/"
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code
위의 limit_rate 명령은 ngx_http_rewrite_module 모듈과 관련이 없으므로 이에 대한 지침은 없습니다. 별도의 구성은 if 블록에서 생성됩니다. 조건이 참이면 요청이 이 구성에 할당되고 여기서 limit_rate은 10k와 같습니다.
명령은
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
정규식의 첫 번째 슬래시가 괄호 안에 있는 경우 한 개 지침만큼 작아질 수 있습니다.
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
그러면 해당 지침은 다음과 같습니다.