URL 재작성 모듈 구성 참조
로 루슬란 야쿠셰프
이 문서에서는 URL 다시 쓰기 모듈에 대한 개요를 제공하고 모듈에서 사용하는 구성 개념을 설명합니다.
기능 개요
URL 다시 쓰기 모듈은 요청 URL을 사용자 또는 웹 애플리케이션에 표시되는 간단하고 사용자에게 친숙하며 검색 엔진에 친숙한 주소로 다시 작성합니다. URL 다시 쓰기는 정의된 규칙을 사용하여 IIS 웹 서버에서 처리하기 전에 요청 URL을 평가한 다음 규칙에 정의된 주소에 매핑합니다. 정규식 및 wild카드s를 포함하는 URL 재작성 논리를 정의할 수 있으며 요청 URL, HTTP 헤더 및 서버 변수에 따라 규칙을 적용할 수 있습니다. 모듈의 주요 목적은 요청 URL을 보다 친숙한 URL로 다시 작성하는 것이지만, 모듈을 사용하여 리디렉션을 수행하거나, 사용자 지정 응답을 보내거나, 요청을 중단하는 규칙을 정의할 수도 있습니다.
규칙 다시 쓰기 개요
다시 쓰기 규칙은 요청 URL을 비교하거나 일치시킬 항목의 논리와 비교에 성공하면 수행할 작업을 정의합니다.
다시 쓰기 규칙은 다음 부분으로 구성됩니다.
- 패턴 – 규칙 패턴은 URL 문자열을 일치시키는 데 사용되는 정규식 또는 와일드카드 패턴을 지정하는 데 사용됩니다.
- 조건 – 선택적 조건 컬렉션은 URL 문자열이 규칙 패턴과 일치하는 경우 수행할 추가 논리 작업을 지정하는 데 사용됩니다. 조건 내에서 HTTP 헤더 또는 서버 변수의 특정 값에 대해 검사 요청된 URL이 실제 파일 시스템의 파일 또는 디렉터리에 해당하는지 확인할 수 있습니다.
- 작업 – URL 문자열이 규칙 패턴과 일치하고 모든 규칙 조건이 충족되는 경우 수행할 작업을 지정하는 데 사용됩니다.
규칙 범위 다시 쓰기
다시 쓰기 규칙은 두 가지 컬렉션에서 정의할 수 있습니다.
<globalRules>
– 이 컬렉션의 규칙은 서버 수준에서만 정의할 수 있습니다. 전역 규칙은 서버 전체 URL 재작성 논리를 정의하는 데 사용됩니다. 이러한 규칙은 ApplicationHost.config 파일 내에서 정의되며 낮은 구성 수준에서 재정의하거나 사용하지 않도록 설정할 수 없습니다. 전역 규칙은 항상 절대 URL의 경로(즉, 서버 이름 없이 요청된 URI)에서 작동합니다. 이러한 규칙은 IIS 요청 처리 파이프라인(PreBeginRequest 이벤트)의 초기에 평가됩니다.<rules>
– 이 컬렉션의 규칙을 분산 규칙이라고 하며 구성 계층 구조의 모든 수준에서 정의할 수 있습니다. 분산 규칙은 특정 구성 범위와 관련된 URL 재작성 논리를 정의하는 데 사용됩니다. Web.config 파일을 사용하거나 ApplicationHost.config 또는 Web.config 파일 내에서 태그를 사용하여<location>
모든 구성 수준에서 이 유형의 규칙을 추가할 수 있습니다. 분산 규칙은 정의된 Web.config 파일의 위치를 기준으로 URL 경로에서 작동합니다. 분산 규칙이 태그 내부에<location>
정의된 경우 해당 태그에 대해 지정된<location>
경로를 기준으로 URL 경로에서 작동합니다. 이러한 규칙은 IIS 파이프라인의 BeginRequest 이벤트에서 평가됩니다.
규칙 평가
IIS의 각 구성 수준에는 0개 이상의 다시 쓰기 규칙이 정의되어 있을 수 있습니다. 규칙은 지정된 순서와 동일한 순서로 평가됩니다. URL 다시 쓰기 모듈은 다음 알고리즘을 사용하여 규칙 집합을 처리합니다.
- 먼저 URL이 규칙 패턴과 일치합니다. 일치하지 않으면 URL 다시 쓰기 모듈이 해당 규칙 처리를 즉시 중지하고 다음 규칙으로 이동합니다.
- 패턴이 일치하고 규칙에 대한 조건이 없는 경우 URL 다시 쓰기 모듈은 이 규칙에 대해 지정된 작업을 수행한 다음, 대체된 URL을 해당 규칙에 대한 입력으로 사용하는 다음 규칙으로 이동합니다.
- 패턴이 일치하고 규칙에 대한 조건이 있는 경우 URL 다시 쓰기 모듈은 조건을 평가합니다. 평가에 성공하면 지정된 규칙 작업이 수행되고 다시 작성된 URL이 후속 규칙에 대한 입력으로 사용됩니다.
규칙에 StopProcessing 플래그가 설정되어 있을 수 있습니다. 규칙 동작이 수행되고(즉, 규칙이 일치) 이 플래그가 켜지면 더 이상 후속 규칙이 처리되지 않으며 요청이 IIS 요청 파이프라인에 전달됩니다. 기본적으로 이 플래그는 꺼져 있습니다.
규칙 상속
규칙이 여러 구성 수준에서 정의된 경우 URL 다시 쓰기 모듈은 다음 순서로 규칙을 평가합니다.
- 모든 전역 규칙을 평가합니다.
- 부모 구성 수준의 분산 규칙과 현재 구성 수준의 규칙을 포함하는 규칙 집합을 평가합니다. 평가는 부모-자식 순서로 수행됩니다. 즉, 부모 규칙이 먼저 평가되고 마지막 자식 수준에서 정의된 규칙이 마지막으로 평가됩니다.
원래 URL 유지
URL 다시 쓰기 모듈은 다음 서버 변수에서 원래 요청된 URL 경로를 유지합니다.
- HTTP_X_ORIGINAL_URL – 이 서버 변수는 원래 URL을 디코딩된 형식으로 포함합니다.
- UNENCODED_URL – 이 서버 변수는 웹 클라이언트에서 요청한 대로 원래 URL을 포함하며 모든 원래 인코딩이 유지됩니다.
다시 쓰기 규칙에서 URL 파트 액세스
다시 쓰기 규칙에서 URL 문자열의 특정 부분에 액세스하는 방법을 이해하는 것이 중요합니다.
http(s)://<host>:<port>/<path> 형식의 HTTP URL은?<Querystring>
- <경로>가 규칙의 패턴과 일치합니다.
- querystring>은 <QUERY_STRING라는 서버 변수에서 사용할 수 있으며 규칙 내의 조건을 사용하여 액세스할 수 있습니다.
- 호스트>는 <HTTP_HOST 서버 변수에서 사용할 수 있으며 규칙 내의 조건을 사용하여 액세스할 수 있습니다.
- 포트>는 <SERVER_PORT 서버 변수에서 사용할 수 있으며 규칙 내의 조건을 사용하여 액세스할 수 있습니다.
- SERVER_PORT_SECURE 및 HTTPS 서버 변수를 사용하여 보안 연결이 사용되었는지 확인할 수 있습니다. 이러한 서버 변수는 규칙 내의 조건을 사용하여 액세스할 수 있습니다.
- 서버 변수 REQUEST_URI 쿼리 문자열을 포함하여 요청된 전체 URL 경로에 액세스하는 데 사용할 수 있습니다.
예를 들어 이 URL http://www.mysite.com/content/default.aspx?tabid=2&subtabid=3
에 대한 요청이 있었고 사이트 수준에서 다시 쓰기 규칙이 정의된 경우 다음을 수행합니다.
- 규칙 패턴은 URL 문자열
content/default.aspx
을 입력으로 가져옵니다. - QUERY_STRING 서버 변수에는
tabid=2&subtabid=3
. - HTTP_HOST 서버 변수에는
www.mysite.com
. - SERVER_PORT 서버 변수에는
80
. - SERVER_PORT_SECURE 서버 변수에
0
포함되고 HTTPS에 포함됩니다OFF
. - REQUEST_URI 서버 변수에는
/content/default.aspx?tabid=2&subtabid=3
. - PATH_INFO 서버 변수에는
/content/default.aspx
.
분산 규칙에 전달된 입력 URL 문자열은 규칙이 정의된 Web.config 파일의 위치를 항상 기준으로 합니다. 예를 들어 요청이 수행http://www.mysite.com/content/default.aspx?tabid=2&subtabid=3
되고 다시 쓰기 규칙이 /content 디렉터리에 정의된 경우 규칙은 이 URL 문자열 default.aspx 입력으로 가져옵니다.
규칙 구성 다시 쓰기
규칙 패턴
재작성 규칙 패턴은 현재 URL 경로가 비교되는 패턴을 지정하는 데 사용됩니다. 이 컨텍스트에서 현재는 규칙이 적용될 때 URL 경로의 값을 의미합니다. 현재 규칙 앞에 규칙이 있는 경우 원래 요청된 URL과 일치하여 수정했을 수 있습니다. 패턴에 대해 평가되는 URL 문자열에는 쿼리 문자열이 포함되지 않습니다. 규칙 평가에 쿼리 문자열을 포함하려면 규칙의 조건에 QUERY_STRING 서버 변수를 사용할 수 있습니다. 자세한 내용은 "다시 쓰기 규칙에서 서버 변수 사용"을 참조하세요.
패턴은 다시 쓰기 규칙의 일치> 요소 내에 <지정됩니다.
규칙 패턴 구문
규칙 패턴 구문은 규칙의 patternSyntax 특성을 사용하여 지정할 수 있습니다. 이 특성은 다음 옵션 중 하나로 설정할 수 있습니다.
ECMAScript – Perl compatible(ECMAScript 표준 규격) 정규식 구문입니다. 모든 규칙에 대한 기본 옵션입니다. 패턴 형식의 예입니다. "^([_0-9a-zA-Z-]+/)? (wp-.*)"
Wild카드 – IIS HTTP 리디렉션 모듈에 사용되는 wild카드 구문입니다. 다음은 "/Scripts/*_in.???" 형식의 패턴의 예입니다. 여기서 별표("*")는 "임의의 수의 문자를 일치시키고 백 참조로 캡처"를 의미하며 "?"는 정확히 하나의 문자(백 참조가 만들어지지 않음)를 의미합니다.
patternSyntax 특성의 범위는 규칙별로 적용됩니다. 즉, 현재 규칙의 패턴 및 해당 규칙의 조건 내에서 사용되는 모든 패턴에 적용됩니다.
규칙 패턴 속성
일치> 요소의 <부정 특성을 사용하여 패턴을 부정할 수 있습니다. 이 특성을 사용하면 현재 URL이 지정된 패턴과 일치하지 않는 경우에만 규칙 작업이 수행됩니다.
기본적으로 대/소문자를 구분하지 않는 패턴 일치가 사용됩니다. 대/소문자 구분을 사용하도록 설정하려면 규칙의 match> 요소에 대한 <ignoreCase 특성을 사용할 수 있습니다.
규칙 조건
규칙 조건을 사용하면 규칙 평가를 위한 추가 논리를 정의할 수 있습니다. 이 논리는 현재 URL 문자열 이외의 입력을 기반으로 할 수 있습니다. 모든 규칙에는 0개 이상의 조건이 있을 수 있습니다. 규칙 패턴 일치가 성공하면 규칙 조건이 평가됩니다.
조건은 다시 쓰기 규칙의 조건> 컬렉션 내에서 <정의됩니다. 이 컬렉션에는 조건 평가 방법을 제어하는 logicalGrouping이라는 특성이 있습니다. 규칙에 조건이 있는 경우 규칙 패턴이 일치하는 경우에만 규칙 동작이 수행됩니다.
- logicalGrouping="MatchAll"이 사용된 경우 모든 조건이 true로 평가되었습니다.
- logicalGrouping="MatchAny"가 사용된 경우 하나 이상의 조건이 true로 평가되었습니다.
조건은 다음 속성을 지정하여 정의됩니다.
- 입력 문자열
- 일치 유형
조건 입력은 조건 평가에 대한 입력으로 사용할 항목을 지정합니다. 조건 입력은 이전 조건 패턴 및/또는 규칙 패턴에 대한 서버 변수 및 백 참조를 포함할 수 있는 임의의 문자열입니다.
일치 유형은 다음 세 가지 옵션 중 하나일 수 있습니다.
IsFile – 이 일치 형식은 입력 문자열에 파일 시스템의 파일에 대한 실제 경로가 포함되어 있는지 여부를 확인하는 데 사용됩니다. 조건 입력 문자열을 지정하지 않으면 URL 다시 쓰기 모듈은 요청된 파일의 실제 경로를 조건 입력의 기본값으로 사용합니다. 이 일치 형식은 분산 규칙에만 사용할 수 있습니다.
IsDirectory – 이 일치 형식은 입력 문자열에 파일 시스템의 디렉터리에 대한 실제 경로가 포함되어 있는지 여부를 확인하는 데 사용됩니다. 조건 입력 문자열을 지정하지 않으면 URL 다시 쓰기 모듈은 요청된 파일의 실제 경로를 조건 입력의 기본값으로 사용합니다. 이 일치 형식은 분산 규칙에만 사용할 수 있습니다.
패턴 – 이 일치 형식은 임의의 입력 문자열이 정규식 패턴과 일치하는 조건을 표현하는 데 사용됩니다. 정규식 구문을 사용하거나 wild카드 구문을 사용하여 조건 패턴을 지정할 수 있습니다. 조건에서 사용할 패턴의 형식은 이 조건이 속한 규칙에 대해 정의된 patternSyntax 플래그의 값에 따라 달라집니다. 이 조건 형식에는 패턴 일치를 제어하는 두 가지 관련 특성이 있습니다.
- 패턴 – 이 특성을 사용하여 실제 패턴을 지정합니다.
- ignoreCase – 이 특성을 사용하여 조건에 대한 패턴 일치가 대/소문자를 구분해야 하는지 또는 대/소문자를 구분하지 않아야 하는지를 제어합니다.
또한 negate 특성을 사용하여 조건 평가 결과를 부정할 수 있습니다. 다음 예제와 같이 요청된 URL이 파일이 아닌 경우 검사 조건을 지정하는 데 사용할 수 있습니다.
<add input="{REQUEST_FILENAME}" matchType="isFile" negate="true">
규칙 작업
현재 URL이 규칙 패턴과 일치하고 조건 평가가 성공하면 다시 쓰기 규칙 작업이 수행됩니다(규칙 구성에 따라 일치하는 모든 조건 또는 일치하는 조건 중 하나 이상). 여러 가지 유형의 작업을 사용할 수 있으며 작업> 구성 요소의 <형식 특성을 사용하여 규칙이 수행하는 작업을 지정할 수 있습니다. 다음 섹션에서는 다양한 작업 유형 및 특정 작업 유형과 관련된 구성 옵션에 대해 설명합니다.
다시 쓰기 작업
다시 쓰기 작업은 현재 URL 문자열을 대체 문자열로 바꿉니다. 대체 문자열은 항상 URL 경로(예: contoso/test/default.aspx)를 지정해야 합니다. 파일 시스템의 물리적 경로(예 C:\inetpub\wwwroot
: )를 포함하는 대체는 IIS에서 지원되지 않습니다.
다시 쓰기 작업에는 다음과 같은 구성 옵션이 있습니다.
url – 현재 URL을 다시 쓸 때 사용할 대체 문자열입니다. 대체 URL은 다음을 포함할 수 있는 문자열 값입니다.
- 조건 및 규칙 패턴에 대한 백 참조입니다. (자세한 내용은 백 참조를 사용하는 방법에 대한 섹션을 참조하세요.)
- 서버 변수. (자세한 내용은 서버 변수를 사용하는 방법에 대한 섹션을 참조하세요.)
appendQueryString – 대체 중에 현재 URL의 쿼리 문자열이 유지되는지 여부를 지정합니다. 기본적으로 appendQueryString 플래그의 값을 지정하지 않으면 TRUE로 간주됩니다. 즉, 원래 URL의 쿼리 문자열이 대체된 URL에 추가됩니다.
리디렉션 작업
리디렉션 작업은 URL 다시 쓰기 모듈에 리디렉션 응답을 클라이언트로 다시 보내도록 지시합니다. 리디렉션 상태 코드(3xx)는 이 작업에 대한 매개 변수로 지정할 수 있습니다. 응답의 위치 필드에는 규칙에 지정된 대체 문자열이 포함됩니다.
리디렉션 규칙의 대체 URL은 다음 형식 중 하나로 지정할 수 있습니다.
- 상대 URL 경로 – contoso/test/default.aspx
- 절대 URI –
https://example.com/contoso/test/default.aspx
리디렉션 작업의 사용은 리디렉션이 수행된 후 현재 URL에 대해 평가된 후속 규칙이 없음을 의미합니다.
리디렉션 작업에는 다음과 같은 구성 옵션이 있습니다.
url – 대체 문자열을 리디렉션 URL로 사용합니다. 대체 URL은 다음을 포함할 수 있는 문자열입니다.
- 조건 및 규칙 패턴에 대한 백 참조입니다. (자세한 내용은 백 참조를 사용하는 방법에 대한 섹션을 참조하세요.)
- 서버 변수. (자세한 내용은 서버 변수를 사용하는 방법에 대한 섹션을 참조하세요.)
appendQueryString – 대체 중에 현재 URL의 쿼리 문자열을 유지할지 여부를 지정합니다. 기본적으로 AppendQueryString 플래그를 지정하지 않으면 TRUE로 간주됩니다. 즉, 원래 URL의 쿼리 문자열이 대체된 URL에 추가됩니다.
redirectType – 리디렉션 중에 사용할 상태 코드를 지정합니다.
- 301 – 영구
- 302 – 검색
- 303 – 기타 보기
- 307 – 임시
CustomResponse 작업
CustomResponse 작업을 수행하면 URL 다시 쓰기 모듈이 사용자 지정 상태 코드, 하위 코드 및 이유를 사용하여 HTTP 클라이언트에 응답합니다. CustomResponse 작업을 사용하면 이 작업이 수행된 후 현재 URL에 대한 후속 규칙이 평가되지 않습니다.
CustomResponse 작업에는 다음과 같은 구성 옵션이 있습니다.
- 상태Code – 클라이언트에 대한 응답으로 사용할 상태 코드를 지정합니다.
- subStatusCode – 클라이언트에 대한 응답으로 사용할 하위 상태 코드를 지정합니다.
- 상태Reason – 상태 코드와 함께 사용할 이유 구를 지정합니다.
- 상태 설명 – 응답 본문에 넣을 한 줄 설명을 지정합니다.
AbortRequest 작업
AbortRequest 작업을 수행하면 URL 다시 쓰기 모듈이 현재 요청에 대한 HTTP 연결을 삭제합니다. 작업에는 매개 변수가 없습니다. 이 작업을 사용하면 이 작업이 수행된 후 현재 URL에 대한 후속 규칙이 평가되지 않습니다.
없음 작업
None 동작은 아무 작업도 수행하지 않음을 지정하는 데 사용됩니다.
다시 쓰기 규칙에서 서버 변수 사용
서버 변수는 현재 HTTP 요청에 대한 추가 정보를 제공합니다. 이 정보를 사용하여 다시 쓰기를 결정하거나 다시 쓴 URL을 작성할 수 있습니다. 서버 변수는 다시 쓰기 규칙 내의 다음 위치에서 참조할 수 있습니다.
조건 입력 문자열에서
규칙 대체 문자열에서 특히 다음을 수행합니다.
- 다시 쓰기 및 리디렉션 작업의 URL 특성
- 상태 CustomResponse 작업의Line 및 responseLine
{VARIABLE_NAME} 구문을 사용하여 서버 변수를 참조할 수 있습니다. 예를 들어 다음 조건은 QUERY_STRING 서버 변수를 사용합니다.
<add input="{QUERY_STRING}" pattern="id=([0-9]+)" />
서버 변수를 사용하여 현재 요청에서 HTTP 헤더에 액세스할 수도 있습니다. 현재 요청에서 제공하는 모든 HTTP 헤더는 다음 명명 규칙에 따라 생성된 이름을 가진 서버 변수로 표시됩니다.
- HTTP 헤더 이름의 모든 대시("-") 기호는 밑줄 기호("_")로 변환됩니다.
- HTTP 헤더 이름의 모든 문자는 대문자로 변환됩니다.
- "HTTP_" 접두사는 헤더 이름에 추가됩니다.
예를 들어 다시 쓰기 규칙에서 HTTP 헤더 "user-agent"에 액세스하려면 {HTTP_USER_AGENT} 서버 변수를 사용할 수 있습니다.
다시 쓰기 규칙에서 백 참조 사용
규칙 또는 조건 입력의 일부는 백 참조에서 캡처될 수 있습니다. 그런 다음 규칙 작업 내에서 대체 URL을 생성하거나 규칙 조건에 대한 입력 문자열을 생성하는 데 사용할 수 있습니다.
백 참조는 규칙에 사용되는 패턴 구문의 종류에 따라 다른 방식으로 생성됩니다. ECMAScript 패턴 구문을 사용하는 경우 백 참조를 캡처해야 하는 패턴 부분에 괄호를 배치하여 백 참조를 만들 수 있습니다. 예를 들어 패턴([0-9]+)/([a-z]+).html 요청된 URL 07/article.html 백 참조에서 07 및 아티클을 캡처합니다. "Wild카드" 패턴 구문을 사용하면 패턴에서 별표 기호(*)를 사용할 때 항상 백 참조가 만들어집니다. 패턴에서 "?"를 사용할 때 백 참조가 만들어지지 않습니다. 예를 들어 */*.html 패턴은 contoso를 캡처하고 요청된 URL인 contoso/test.html 백 참조에서 테스트합니다.
백 참조 사용은 캡처하는 데 사용된 패턴 구문과 관계없이 동일합니다. 다시 쓰기 규칙 내의 다음 위치에서 백 참조를 사용할 수 있습니다.
In condition 입력 문자열
규칙 작업에서 특히 다음을 수행합니다.
- 다시 쓰기 및 리디렉션 작업의 URL 특성
- 상태 CustomResponse 작업의Line 및 responseLine
다시 쓰기 맵에 대한 키 매개 변수
조건 패턴에 대한 백 참조는 N이 0에서 9인 {C:N}으로 식별됩니다. 규칙 패턴에 대한 백 참조는 N이 0에서 9인 {R:N}으로 식별됩니다. {R:0} 및 {C:0}의 두 가지 백 참조 형식에는 일치하는 문자열이 포함됩니다.
예를 들어 다음 패턴에서 다음을 수행합니다.
^(www\.)(.*)$
문자열 www.foo.com
의 경우 백 참조는 다음과 같이 인덱싱됩니다.
{C:0} - www.foo.com
{C:1} - www.
{C:2} - foo.com
규칙 작업 내에서 규칙 패턴 및 해당 규칙의 마지막 일치 조건에 대한 백 참조를 사용할 수 있습니다. 조건 입력 문자열 내에서 규칙 패턴 및 이전에 일치된 조건에 대한 백 참조를 사용할 수 있습니다.
다음 규칙 예제에서는 백 참조를 만들고 참조하는 방법을 보여 줍니다.
<rule name="Rewrite subdomain">
<match url="^(.+)" /> <!-- rule back-reference is captured here -->
<conditions>
<add input="{HTTP_HOST}" type="Pattern" pattern="^([^.]+)\.mysite\.com$" /> <!-- condition back-reference is captured here -->
</conditions>
<action type="Rewrite" url="{C:1}/{R:1}" /> <!-- rewrite action uses back-references to condition and to rule when rewriting the url -->
</rule>
IIS 출력 캐싱과의 상호 작용
URL 다시 쓰기 모듈은 다음을 위해 IIS 출력 캐시 동작을 제어합니다.
- 재작성 URL에 대한 응답의 커널 모드 및 사용자 모드 출력 캐싱을 최적으로 활용하므로 URL 다시 쓰기 모듈을 사용하는 웹 애플리케이션의 성능이 향상됩니다.
- URL 재작성으로 인해 캐싱 논리를 위반할 수 있는 경우 응답의 캐싱을 방지합니다.
모듈은 특정 캐싱 속성을 변경하거나 캐싱을 완전히 사용하지 않도록 설정하여 출력 캐싱을 제어합니다. IIS 구성 또는 IIS 파이프라인의 다른 모듈에서 사용하지 않도록 설정한 경우 모듈에서 출력 캐싱을 사용하도록 설정할 수 없습니다. 출력 캐싱은 다음과 같이 제어됩니다.
모듈은 항상 사용자 모드 캐시 설정 varyByHeader="HTTP_X_ORIGINAL_URL"를 설정합니다. 이렇게 하면 사용자 모드 캐싱을 사용하도록 설정하면 모듈이 원래 URL을 고려하여 캐시 항목에 대한 키를 생성합니다.
다시 쓰기 규칙 집합이 프로세스 수명 동안 상수이거나 요청된 URL에서 파생된 값이 있는 서버 변수를 사용하는 경우 규칙 집합은 출력 캐싱에 안전한 것으로 간주됩니다. 즉, URL 다시 쓰기 모듈은 1단계에서 설명한 대로 varyByHeader를 설정하는 것 외에는 기존 캐싱 정책을 변경하지 않습니다.
다음 서버 변수는 다시 쓰기 규칙에 사용되는 경우 출력 캐싱 정책에 영향을 주지 않습니다.
- "CACHE_URL"
- "DOCUMENT_ROOT"
- "HTTP_URL"
- "HTTP_HOST"
- "PATH_INFO"
- "PATH_TRANSLATED"
- "QUERY_STRING"
- "REQUEST_FILENAME"
- "REQUEST_URI"
- "SCRIPT_FILENAME"
- "SCRIPT_NAME"
- "SCRIPT_TRANSLATED"
- "UNENCODED_URL"
- "URL"
- "URL_PATH_INFO"
- ""APP_POOL_ID"
- "APPL_MD_PATH"
- "APPL_PHYSICAL_PATH"
- "GATEWAY_INTERFACE"
- "SERVER_SOFTWARE"
- "SSI_EXEC_DISABLED"
다시 쓰기 규칙 집합이 위 목록에 멘션 않은 서버 변수를 사용하는 경우 규칙 집합은 출력 캐싱에 안전하지 않은 것으로 간주됩니다. 즉, URL 다시 쓰기 모듈은 요청 URL을 다시 작성했는지 여부에 관계없이 모든 요청에 대해 커널 모드 캐싱을 사용하지 않도록 설정합니다. 또한 모듈은 규칙 집합에 사용되는 모든 서버 변수 값의 연결된 문자열을 포함하도록 캐싱 속성 varyByValue 를 설정하여 사용자 모드 캐시에 대한 캐싱 정책을 변경합니다.
문자열 함수
다시 쓰기 규칙 작업 내에서 값을 변경하는 데 사용할 수 있는 세 가지 문자열 함수와 모든 조건이 있습니다.
- ToLower - 소문자로 변환된 입력 문자열을 반환합니다.
- UrlEncode - URL로 인코딩된 형식으로 변환된 입력 문자열을 반환합니다. 이 함수는 재작성 규칙의 대체 URL에 특수 문자(예: 비 ASCII 또는 URI 안전하지 않은 문자)가 포함된 경우 사용할 수 있습니다.
- UrlDecode - URL로 인코딩된 입력 문자열을 디코딩합니다. 이 함수는 패턴과 일치하기 전에 조건 입력을 디코딩하는 데 사용할 수 있습니다.
함수는 다음 구문을 사용하여 호출할 수 있습니다.
{function_name:any_string}
여기서 "function_name"은 "ToLower", "UrlEncode", "UrlDecode"입니다. "Any_string"은 리터럴 문자열이거나 서버 변수 또는 백 참조를 사용하여 빌드된 문자열일 수 있습니다. 예를 들어 문자열 함수의 유효한 호출은 다음과 같습니다.
{ToLower:DEFAULT.HTM}
{UrlDecode:{REQUEST_URI}}
{UrlEncode:{R:1}.aspx?p=[résumé]}
문자열 함수는 다시 쓰기 규칙 내의 다음 위치에서 사용할 수 있습니다.
In condition 입력 문자열
규칙 대체 문자열에서 특히 다음을 수행합니다.
- 다시 쓰기 및 리디렉션 작업의 URL 특성
- 상태 CustomResponse 작업의Line 및 responseLine 특성
ToLower 함수를 사용하는 규칙의 예:
<rule name="Redirect to canonical url">
<match url="^(.+)" /> <!-- rule back-reference is captured here -->
<conditions>
<!-- Check whether the requested domain is in canonical form -->
<add input="{HTTP_HOST}" type="Pattern" pattern="^www\.mysite\.com$" negate="true" />
</conditions>
<!-- Redirect to canonical url and convert URL path to lowercase -->
<action type="Redirect" url="http://www.mysite.com/{ToLower:{R:1}}" redirectType="Found" />
</rule>
UrlEncode 함수를 사용하는 규칙의 예:
<rules>
<rule name="UrlEncode example" stopProcessing="true">
<match url="resume" />
<action type="Rewrite" url="default.aspx?name={UrlEncode:résumé}"/>
</rule>
UrlDecode 함수를 사용하는 규칙의 예:
<rules>
<rule name="UrlDecode example">
<match url="default.aspx" />
<conditions>
<add input="{UrlDecode:{QUERY_STRING}}" pattern="résumé" />
</conditions>
<action type="Rewrite" url="default.aspx?type=resume" />
</rule>
</rules>
맵 다시 쓰기
다시 쓰기 맵은 다시 작성하는 동안 대체 URL을 생성하기 위해 다시 쓰기 규칙 내에서 사용할 수 있는 이름-값 쌍의 임의의 컬렉션입니다. 다시 쓰기 맵은 큰 재작성 규칙 집합이 있고 이러한 모든 규칙이 정적 문자열(즉, 패턴 일치가 사용되지 않는 경우)을 사용하는 경우에 특히 유용합니다. 이러한 경우 간단한 다시 쓰기 규칙의 큰 집합을 정의하는 대신 모든 매핑을 다시 쓰기 맵에 입력 URL과 대체 URL 사이의 키 및 값으로 넣을 수 있습니다. 그런 다음 입력 URL을 기반으로 대체 URL을 조회하려면 다시 쓰기 맵을 참조하는 하나의 다시 쓰기 규칙이 있습니다.
다시 쓰기 맵은 다음 예제와 같이 이름-값 쌍 문자열의 명명된 컬렉션을 정의합니다.
<rewriteMap name="MyRewriteMap" defaultValue="">
<add key="a.html" value="b.html" />
<add key="c.aspx" value="d.aspx" />
<add key="e.php" value="f.php" />
</rewriteMap>
다시 쓰기 맵은 해당 이름으로 고유하게 식별되며 0개 이상의 키-값 항목을 포함할 수 있습니다. 또한 다시 쓰기 맵은 키를 찾을 수 없을 때 사용할 기본값을 지정할 수 있습니다. defaultValue 특성을 사용하여 제어됩니다. 기본적으로 빈 문자열은 기본값으로 사용됩니다.
파일 수준을 제외한 모든 구성 수준에서 여러 다시 쓰기 맵이 있을 수 있습니다. 다시 쓰기 맵은 다시 쓰기지도> 컬렉션 요소 내에 <있습니다.
다시 쓰기 맵은 다음 구문을 사용하여 다시 쓰기 규칙 내에서 참조됩니다.
{RewriteMapName:Key}
여기서 키 매개 변수는 임의의 문자열일 수 있으며 규칙 또는 조건 패턴에 대한 백 참조를 포함할 수 있습니다. 예를 들어 다음은 다시 쓰기 맵의 유효한 용도입니다.
{MyRewriteMap:contoso/{R:1}/test/{C:1}}
{MyRewriteMap:a.html}
{MyRewriteMap:{R:1}?{C:1}&contoso=test}
다시 쓰기 맵에 대한 참조는 다시 쓰기 맵 참조 내에서 매개 변수로 전달된 키를 사용하여 조회된 값으로 대체됩니다. 키를 찾을 수 없는 경우 해당 다시 쓰기 맵의 기본값이 사용됩니다.
다시 쓰기 규칙 내의 다음 위치에서 다시 쓰기 맵을 참조할 수 있습니다.
In condition 입력 문자열
규칙 대체 문자열에서 특히 다음을 수행합니다.
- 다시 쓰기 및 리디렉션 작업의 URL 특성
- 상태 CustomResponse 작업의Line 및 responseLine
예제 1: 다음과 같이 다시 쓰기 맵이 정의됩니다.
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRewrites" defaultValue="">
<add key="/diagnostics" value="/default.aspx?tabid=2&subtabid=29" />
<add key="/webcasts" value="/default.aspx?tabid=2&subtabid=24" />
<add key="/php" value="/default.aspx?tabid=7116" />
</rewriteMap>
</rewriteMaps>
</rewrite>
그리고 다음과 같이 정의된 다시 쓰기 규칙입니다.
<rewrite>
<rule name="Rewrite Rule">
<match url=".*" />
<conditions>
<add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}"/>
</rule>
</rewrite>
요청된 URL /diagnostic은 /default.aspx?tabid=2&subtabid=29로 다시 작성됩니다.
요청된 URL /webcasts는 /default.aspx?tabid=2&subtabid=24로 다시 작성됩니다.
요청된 URL /php는 /default.aspx?tabid=7116으로 다시 작성됩니다.
다시 쓰기 맵에 key="/default.aspx"가 포함된 요소가 없으므로 요청된 URL /default.aspx 다시 작성되지 않습니다. 따라서 다시 쓰기 맵은 조건 패턴과 일치하지 않는 빈 문자열을 반환하므로 규칙 동작이 수행되지 않습니다.
예제 2: 다음과 같이 다시 쓰기 맵이 정의됩니다.
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRedirects" defaultValue="">
<add key="/default.aspx?tabid=2&subtabid=29" value="/diagnostics" />
<add key="/default.aspx?tabid=2&subtabid=24" value="/webcasts" />
<add key="/default.aspx?tabid=7116" value="/php" />
</rewriteMap>
</rewriteMaps>
</rewrite>
그리고 다음과 같이 정의된 다시 쓰기 규칙입니다.
<rewrite>
<rule name="Redirect rule">
<match url=".*" />
<conditions>
<add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="http://www.contoso.com{C:1}" redirectType="Found" />
</rule>
</rewrite>
요청된 URL /default.aspx?tabid=2&subtabid=29 가 리디렉션됩니다 http://www.contoso.com/diagnostics
.
요청된 URL /default.aspx?tabid=2&subtabid=24 가 리디렉션됩니다 http://www.contoso.com/webcasts
.
요청된 URL /default.aspx?tabid=7116 이 .으로 http://www.contoso.com/php
리디렉션됩니다.
다시 쓰기 맵에 key="/default.aspx"가 포함된 요소가 없기 때문에 요청된 URL /default.aspx 리디렉션되지 않습니다. 따라서 다시 쓰기 맵은 조건 패턴과 일치하지 않는 빈 문자열을 반환하므로 규칙 동작이 수행되지 않습니다.