Rewriting 동작 정의
RewriteRule은 재작성(rewriting) 동작을 정의하며, 다음과 같은 형식으로 설정합니다. 사용자 요청이 RewriteCond에 매칭되는 경우 RewriteRule 설정에 의해 사용자 요청 중 Pattern을 Substitution으로 교체합니다.
RewriteRule <Pattern> <Substitution> [flags]
Pattern 설정
Pattern은 Perl compatible reqular expression을 사용할 수 있으며, '!'을 사용하면 패턴에 매칭되지 않는 경우를 지정할 수 있습니다.
'!'을 사용할 경우 괄호로 묶은 그룹 패턴($N)을 사용할 수 없습니다. 이는 패턴이 매칭되지 않아 그룹 패턴($N)에 값이 없기 때문입니다. |
RewriteRule만 단독으로 설정할 경우 패턴 매칭은 URL-path를 사용하며, RewriteCond와 함께 사용될 경우 마지막에 매칭된 패턴을 사용합니다.
Substitution 설정
URL을 교체할 값을 설정할 수 있으며, 다음과 같은 값들을 사용할 수 있습니다.
설정값 | 설명 |
---|---|
file-system path |
/로 시작하는 file-system의 절대 경로를 설정할 경우 해당 파일을 사용자 응답에 사용합니다. 단, 설정한 경로가 file-system에 존재해야 합니다. |
URL-path |
일반적인 URL-path를 설정할 경우 해당 리소스를 사용합니다. |
Absolute URL |
Absolute URL(예: http://<호스트 이름>/file.html)을 사용할 경우 호스트 이름이 서버와 일치하면 스킴(scheme)과 호스트 이름을 제외한 나머지를 URL-path처럼 사용하고, 일치하지 않을 경우 외부 서버로 리다이렉트합니다. |
- |
교체하지 않음을 의미합니다. |
$N (N=0..9) |
RewriteRule의 패턴 중 N번째 그룹 패턴을 지칭합니다. |
%N (N=1..9) |
마지막에 매칭된 RewriteCond의 패턴 중 N번째 그룹 패턴을 지칭합니다. |
%{VARNAME} |
서버에서 제공하는 VARNAME을 참조합니다. RewriteCond의 TestString에 적용되는 항목을 사용할 수 있습니다. |
? |
기본적으로 Query string은 변경되지 않지만, 이를 교체하고 싶을 경우 '?'를 Substitution안에 추가합니다. Query string을 삭제하려면 Substitution의 마지막을 '?'로 끝냅니다. |
Apache의 mod_rewrite에서 제공하는 RewriteMap을 지원하지 않기 때문에 '${mapname:key|default}'는 사용할 수 없습니다. |
flags 설정
RewriteRule의 세부 동작을 [flags]의 설정을 통해 조절할 수 있습니다.
flags는 콤마(,)를 사용하여 여러 개를 설정할 수 있으며, 다음과 같은 값을 사용할 수 있습니다.
-
B
기본적으로 Substitution에 사용되는 backreference($N 또는 %N)는 URL의 %-encoding을 해제하여 사용하지만 [B] 옵션을 사용하면 URL의 %-encoding을 그대로 유지할 수 있습니다.
예를 들어 아래와 같이 설정된 경우 기본적으로는 "/C%2b%2b"가 "index.php?show=/C++"로 매핑되지만, [B] 옵션을 사용하면 "index.php?show=/C%2b%2b"로 매핑됩니다.
RewriteRule ^(.*)$ index.php?show=$1
-
chain|C
현재 rule이 매칭되지 않을 경우 다음 rule을 체크하지 않습니다. 만약 그 다음 rule에도 [C] 옵션이 설정되어 있으면 마찬가지로 건너뛰게 됩니다.
-
cookie|CO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly]]]]
응답에 Set-Cookie 헤더를 추가하여 사용자 브라우저에 쿠키를 추가합니다.
-
discardpathinfo|DPI
디렉터리별 컨텍스트를 구성한 환경에서 RewriteRule은 URI와 PATH_INFO를 구분하여 매번 rule을 적용할 때 URI와 PATH_INFO를 결합합니다. 이로 인해 URI가 여러 번 매칭될 경우 PATH_INFO가 여러 번 붙게 됩니다.
[DPI] 옵션은 PATH_INFO를 구분하지 않고 RewriteRule을 적용합니다.
-
env|E=VAR:VAL
환경 변수에 VAR=VAL을 추가합니다. VAL에는 정규식 백레퍼런스($N 또는 %N)를 사용할 수 있습니다. 이 환경 변수는 SSI나 CGI에서 사용할 수 있으며, RewriteCond의 패턴 중 %{ENV:VAR}으로 사용할 수 있습니다.
-
forbidden|F
"403 Forbidden" 응답을 보냅니다.
-
gone|G
"410 Gone" 응답을 보냅니다.
-
handle|H=Content-handler
Content-handler를 설정합니다.
-
last|L
재작성 과정을 이곳에서 종료합니다. C의 break 명령과 유사한 기능을 하는 옵션입니다.
-
next|N
지금까지 변경된 URL을 가지고 처음부터 다시 재작성 과정을 수행합니다. C의 continue 명령과 유사한 기능을 하는 옵션입니다.
해당 옵션 사용 시 무한루프가 발생할 수 있으니 주의해야 합니다.
-
nocase|NC
패턴에 대소문자를 구분하지 않도록 합니다. [A-Z]와 [a-z]를 똑같이 취급합니다.
-
noescape|NE
재작성 과정에서 URL을 %-encoding하지 않도록 합니다.
-
nosubreq|NS
내부 요청일 경우 재작성을 중지합니다.
-
passthrough|PT
재작성을 수행한 결과를 다른 핸들러가 사용할 수 있도록 합니다.
-
qsappend|QSA
쿼리 문자열을 재작성할 때 기존 쿼리 문자열을 덮어쓰지 않고, 그대로 유지하면서 새로운 쿼리 문자열을 추가합니다.
-
redirect|R[=code]
Substitution이 Absolute URL인 경우 호스트 이름이 서버와 일치하더라도 강제로 리다이렉트합니다.
코드가 지정되지 않으면 기본적으로 302 Moved Temporarily가 사용됩니다. 코드에는 상태 코드를 직접 입력하거나, temp(기본값), permanent, seeother를 설정할 수 있습니다.
-
skip|S=num
다음 num개의 rule를 건너뛰도록 합니다.
-
type|T=MIME-type
응답의 Content-Type을 설정합니다.