Share via


URL 다시 쓰기 모듈에서 다시 쓰기 맵 사용

작성자 : Ruslan Yakushev

이 연습에서는 URL 다시 쓰기 모듈에서 맵 다시 쓰기 개념을 소개하고 다시 쓰기 맵을 사용하는 다시 쓰기 규칙을 만드는 방법을 안내합니다. 이 연습에서는 두 개의 다시 쓰기 맵을 만듭니다. 한 개의 다시 쓰기 맵은 URL 다시 쓰기를 수행하는 규칙에 의해 사용되고, 다른 재작성 맵은 다른 도메인으로의 리디렉션을 수행하는 규칙에서 사용됩니다.

배경

재작성 맵은 재작성 규칙 내에서 다시 작성하는 동안 대체 URL을 생성하는 데 사용할 수 있는 임의의 이름 및 값 쌍 컬렉션입니다. 다시 쓰기 맵은 큰 재작성 규칙 집합이 있고 이러한 모든 규칙이 정적 문자열(즉, 패턴 일치가 사용되지 않는 경우)을 사용하는 경우에 특히 유용합니다. 이러한 경우 간단한 재작성 규칙의 큰 집합을 정의하는 대신 입력 URL과 대체 URL 사이에 키와 값으로 모든 매핑을 다시 쓰기 맵에 넣을 수 있습니다. 그런 다음 입력 URL을 기반으로 대체 URL을 조회하려면 이 다시 쓰기 맵을 참조하는 하나의 다시 쓰기 규칙이 있습니다.

사전 요구 사항

이 연습을 수행하려면 다음 필수 구성 요소가 필요합니다.

  1. ASP.NET 역할 서비스를 사용하도록 설정된 IIS 7.0 이상
  2. URL 다시 쓰기 Go Live 릴리스 설치됨

테스트 웹 페이지 설정

맵 다시 쓰기 기능을 시연하기 위해 간단한 테스트 asp.net 페이지를 사용합니다. 이 페이지는 웹 서버 변수를 읽고 브라우저에서 해당 값을 출력합니다.

다음 ASP.NET 코드를 복사하여 article.aspx라는 파일의 폴더에 넣 %SystemDrive%\inetpub\wwwroot\ 습니다.

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>URL Rewrite Module Test</title>
</head>
<body>
      <h1>URL Rewrite Module Test Page</h1>
      <table>
            <tr>
                  <th>Server Variable</th>
                  <th>Value</th>
            </tr>
            <tr>
                  <td>Original URL: </td>
                  <td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
            </tr>
            <tr>
                  <td>Final URL: </td>
                  <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
      </table>
</body>
</html>

이 파일을 복사한 후 브라우저에서 http://localhost/article.aspx 페이지가 올바르게 렌더링되었는지 찾아서 검사.

브라우저에서 렌더링된 테스트 페이지를 보여 주는 스크린샷

다시 쓰기를 위한 맵 만들기

먼저 원래 URL과 다시 작성된 URL 간의 정적 매핑 집합에 따라 URL 다시 쓰기를 수행하는 데 사용되는 다시 쓰기 맵 및 다시 쓰기 규칙을 만듭니다. 다시 쓰기 맵을 만들려면 다음 단계를 수행합니다.

  1. IIS 관리자로 이동

  2. "기본 웹 사이트"를 선택합니다.

  3. 기능 보기에서 "URL 다시 쓰기"를 클릭합니다.
    기능 보기에서 U RL 다시 쓰기를 보여 주는 스크린샷.

  4. 오른쪽의 "작업" 창에서 "다시 쓰기 맵 보기..."를 클릭합니다.
    다시 쓰기 맵 보기를 보여 주는 스크린샷...

  5. 오른쪽 사이트의 "작업" 창에서 "다시 쓰기 맵 추가..."를 클릭합니다. 그런 다음 다시 쓰기 맵의 이름을 "StaticRewrites"로 입력합니다.
    맵 이름 다시 쓰기 상자를 보여 주는 스크린샷

  6. 새로 만든 다시 쓰기 맵 페이지의 오른쪽에 있는 "작업" 창에서 "매핑 항목 추가..."를 클릭합니다. 그런 다음 각각 "Original value:" 및 "New value:" 텍스트 상자에 "/article" 및 "/article.aspx?id=1&title=some-title"을 입력합니다. 원래 값은 다시 작성하려는 URL 경로를 지정합니다. 새 값은 다시 작성할 URL 경로를 지정합니다.
    원래 값 및 새 값 상자를 보여 주는 스크린샷

  7. 6단계를 반복하여 다시 쓰기 맵에 다음 매핑을 추가합니다.

    원래 값: 새 값:
    /some-title /article.aspx?id=1&title=some-title
    /post/some-title.html /article.aspx?id=1&title=some-title

이제 웹 사이트에 대한 web.config 파일을 엽니다(기본 웹 사이트를 사용하는 경우 web.config 에서 %SystemDrive%\inetpub\wwwroot찾을 수 있음). 다음 섹션이 표시됩니다.

<rewrite>
    <rewriteMaps>
        <rewriteMap name="StaticRewrites" defaultValue="">
            <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>

"StaticRewrites"라고 하는 이 다시 쓰기 맵은 들어오는 URL(다시 쓰기 맵에서 키로 정의됨)을 내부 표현(값으로 정의됨)으로 다시 작성하는 데 사용됩니다. defaultValue 특성은 들어오는 URL이 맵에 정의되지 않은 경우 사용할 값을 지정합니다. 이 경우 빈 문자열이 반환됩니다.

키와 해당 값의 관계에는 명백한 일반적인 패턴이 없습니다. 즉, 정규식 또는 와일드카드를 사용하여 URL 변환 논리를 정의할 수 없습니다. 또한 다시 쓰기 맵을 사용하지 않았다면 3개의 다시 쓰기 규칙을 만들어야 했습니다. 다시 쓰기 맵을 사용하면 하나의 다시 쓰기 규칙만 만들 수 있습니다. 다음 섹션에서는 이 다시 쓰기 맵을 사용하는 다시 쓰기 규칙을 만드는 방법을 설명합니다.

다시 쓰기 규칙에서 다시 쓰기 맵 참조

다시 쓰기 맵을 사용하는 다시 쓰기 규칙을 만들려면 다음 XML 코드를 <rewrite> 복사하여 웹 사이트의 web.config 파일 섹션에 붙여넣습니다.

<rules>
    <rule name="Rewrite Rule">
        <match url=".*" />
        <conditions>
            <add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Rewrite" url="{C:1}" />
    </rule>
</rules>

각 규칙 요소에서 수행하는 작업을 이해해 보겠습니다.
<match url=".*" /> - 이 요소는 들어오는 URL과 일치하도록 URL 다시 쓰기 모듈에 지시합니다(정규식 특수 문자 ".").

<add input="{StaticRewrites:{REQUEST\_URI}}" pattern="(.+)"> - 이 조건 검사는 재작성 맵 StaticRewrites에서 반환된 값이 빈 문자열이 아닌지 확인합니다. 이 검사 수행하려면 서버 변수 REQUEST_URI 값이 다시 쓰기 맵에 매개 변수로 전달됩니다. 다시 쓰기 맵에 키가 있는 항목이 포함된 경우 REQUEST_URI 동일한 값이 반환됩니다. 정규식 패턴은 비어 있지 않은 문자열만 일치하므로 맵에서 빈 문자열이 반환되면 조건이 false로 평가되므로 다시 쓰기가 수행되지 않습니다. 비어 있지 않은 문자열이 반환된 경우 패턴에 사용된 괄호 때문에 해당 문자열이 백 참조에서 캡처됩니다.

<action type="Rewrite" url="{C:1}" /> - 이 요소는 URL 다시 쓰기 모듈이 다시 쓰기 맵에서 추출된 새 URL 문자열을 사용하여 현재 URL 문자열을 다시 작성하도록 지정합니다. url 특성은 조건의 패턴이 일치할 때 설정된 조건 백 참조 {C:1}을 참조합니다.

다시 쓰기를 위한 규칙 테스트

"StaticRewrites" 맵을 사용하는 다시 쓰기 규칙을 테스트하려면 웹 브라우저를 열고 다음 URL을 요청합니다.

http://localhost/article1
http://localhost/some-title
http://localhost/post/some-title.html

위의 URL 중 하나라도 다시 쓰기 맵에 정의된 매핑에 따라 URL을 다시 작성해야 합니다. 결과는 다음 페이지와 같아야 합니다.

테스트 결과를 보여 주는 스크린샷

리디렉션을 위해 다시 쓰기 맵 사용

이제 원본 URL과 리디렉션 URL 간의 정적 매핑을 정의하는 데 사용할 또 다른 다시 쓰기 맵을 만듭니다. 다시 쓰기 맵을 만들려면 "다시 쓰기를 위한 맵 만들기" 섹션에 설명된 것과 동일한 단계를 수행하지만 다시 쓰기 맵의 이름을 "StaticRedirects"로 지정하고 매핑 항목에 다음 값을 사용합니다.

원래 값: 새 값:
/old-article.aspx?id=1 /article.aspx?id=1
/posts/default.aspx?id=1 /article.aspx?id=1
/old-title.html /article.aspx?id=1

이제 웹 사이트의 web.config 파일에는 다음 두 개의 다시 쓰기 맵이 포함되어야 합니다.

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
</rewriteMaps>

StaticRedirects 다시 쓰기 맵을 사용하는 규칙을 만들려면 다음 규칙 정의를 복사하여 웹 사이트의 web.config 파일에 붙여넣습니다.

<rules>
    <rule name="Redirect Rule" stopProcessing="true">
        <match url=".*" />
        <conditions>
            <add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
    </rule>
</rules>

다시 말하지만, 각 규칙 요소를 통해 수행되는 작업을 이해해 보겠습니다.
<match url=".*" /> - 이 요소는 들어오는 URL과 일치하도록 URL 다시 쓰기 모듈에 지시합니다(정규식 특수 문자 ".").

<add input="{StaticRedirects:{REQUEST\_URI}}" pattern="(.+)"> - 이 조건 검사는 다시 쓰기 맵 StaticRedirects 에서 반환된 값이 빈 문자열이 아닌지 확인합니다. 이 검사 수행하려면 서버 변수 REQUEST_URI 값이 다시 쓰기 맵에 매개 변수로 전달됩니다. 다시 쓰기 맵에 키가 있는 항목이 포함된 경우 REQUEST_URI 동일한 값이 반환됩니다. 정규식 패턴은 비어 있지 않은 문자열만 일치하므로 맵에서 빈 문자열이 반환되면 조건이 false로 평가되므로 다시 쓰기가 수행되지 않습니다. 비어 있지 않은 문자열이 반환된 경우 패턴에 사용된 괄호 때문에 해당 문자열이 백 참조에서 캡처됩니다.

<action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" /> - 이 요소는 URL 다시 쓰기 모듈이 새 도메인 이름(이 경우 단순성을 위해 동일한 도메인임)과 StaticRedirects 맵에서 반환된 리디렉션 URL 경로를 연결하여 생성된 새 URL로 웹 클라이언트를 리디렉션하도록 지정합니다.

리디렉션에 대한 규칙 테스트

"StaticRedirects" 맵을 사용하는 다시 쓰기 규칙을 테스트하려면 웹 브라우저를 열고 다음 URL을 요청합니다.

http://localhost/old-article
http://localhost/posts/default.aspx?id=1
http://localhost/old-title.html

위의 URL 중 하나라도 브라우저를 로 리디렉션 http://localhost/article.aspx?id=1해야 합니다.

쿼리 문자열 매개 변수에 다시 쓰기 맵 사용

다시 쓰기 맵의 사용은 위에서 언급한 예제로 제한되지 않습니다. 다시 쓰기 맵은 다시 쓰기 규칙의 어디에서나 사용할 수 있는 키-값 쌍의 제네릭 컬렉션입니다. 이를 설명하기 위해 쿼리 문자열 매개 변수를 조작하는 데 사용할 수 있는 다시 쓰기 맵을 만들어 보겠습니다.

"다시 쓰기를 위한 맵 만들기" 섹션에 설명된 것과 동일한 단계에 따라 세 번째 다시 쓰기 맵을 만듭니다. 다시 쓰기 맵의 이름을 "IDtoTitleMap"으로 지정하고 매핑 항목에 다음 값을 사용합니다.

원래 값: 새 값:
1 some-title-1
2 some-title-2
3 some-title-3

이제 웹 사이트의 web.config 파일에는 다음 두 개의 다시 쓰기 맵이 포함되어야 합니다.

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
    <rewriteMap name="IDtoTitleMap">
        <add key="1" value="some-title-1" />
        <add key="2" value="some-title-2" />
        <add key="3" value="some-title-3" />
    </rewriteMap>
</rewriteMaps>

IDtoTitleMap 다시 쓰기 맵을 사용하는 규칙을 만들려면 다음 규칙 정의를 복사하여 웹 사이트의 web.config 파일에 붙여넣습니다.

<rules>
    <rule name="Query String Rule" stopProcessing="true">
        <match url="^article\.aspx$" />
        <conditions>
            <add input="{QUERY_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
            <add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" 
                                                            redirectType="Permanent" />
    </rule>
</rules>

각 규칙 요소를 살펴보고 수행하는 작업을 이해해 보겠습니다.
<match url="^article\.aspx$" /> - 이 요소는 article.aspx 파일이 요청되면 URL 다시 쓰기 모듈에 규칙을 실행하도록 지시합니다.

<add input="{QUERY\_STRING}" pattern="(?:^|&amp;)id=([0-9]+)(?:&amp;|$)" /> - 이 조건은 쿼리 문자열에 숫자 값이 있는 매개 변수 ID 가 포함되어 있는지 확인합니다. 실제 값은 조건 백 참조에서 캡처됩니다. 이 패턴은 쿼리 문자열에 다른 매개 변수가 있더라도 작동합니다.

<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" /> - 이 조건은 다시 쓰기 맵 IDtoTitleMap 에서 반환된 값이 빈 문자열이 아닌지 확인합니다. 조건은 이전 조건 패턴의 백 참조를 다시 쓰기 맵에 대한 입력으로 사용합니다.

<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" redirectType="Permanent" /> - 이 요소는 URL 다시 쓰기 모듈이 웹 클라이언트를 article.aspx 파일로 다시 리디렉션해야 하지만 다시 쓰기 맵에서 조회된 값이 있는 다른 쿼리 문자열 매개 변수 제목을 사용하도록 지정합니다.

쿼리 문자열에 대한 규칙 테스트

"IDtoTitleMap" 맵을 사용하는 다시 쓰기 규칙을 테스트하려면 웹 브라우저를 열고 다음 URL을 요청합니다.

http://localhost/article.aspx?id=1. 이 작업은 로 http://localhost/article.aspx?title=some-title-1. http://localhost/article.aspx?someparam=somevalue&id=2리디렉션됩니다. 이 작업은 로 리디렉션됩니다. http://localhost/article.aspx?title=some-title-2

요약

이 연습에서는 다시 쓰기 맵을 사용하여 다시 작성 및 리디렉션 규칙에 대한 URL 매핑을 정의하는 방법을 알아보았습니다. 또한 다시 쓰기 맵을 사용하여 쿼리 문자열 매개 변수를 조작하는 방법을 알아보았습니다.

다시 쓰기 맵을 사용하면 재작성 및 리디렉션 URL이 정적이며 패턴 일치 기술을 사용하여 다시 쓰기 논리를 표현할 수 없는 경우 다시 쓰기 규칙 수를 줄일 수 있습니다.