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을 설정합니다.