URL Rewrite 1.1 (URL 재작성) - (6) Rewrite Map 사용

지난 포스트 링크
URL Rewrite 1.1 (URL 재작성) - (1) 소개 및 설치
URL Rewrite 1.1 (URL 재작성) - (2) URL 재작성
URL Rewrite 1.1 (URL 재작성) - (3) 요청 필터링과 URL Rewrite
URL Rewrite 1.1 (URL 재작성) - (4) ASP.NET 라우팅과 URL Rewrite
URL Rewrite 1.1 (URL 재작성) - (5) Apache의 mod_rewrite 규칙 가져오기(import)

안녕하세요. IISKOREA의 김대우 입니다. 이번에 소개해 드릴 내용은 Rewrite Map에 대한 내용인데요.

간단히 말씀 드리자면, 모든 URL 변환 처리를 패턴을 이용해 프로그래밍적으로 처리 가능하다면 행복할 겁니다. 하지만, 모든 URL 처리가 이렇게 패턴에 매핑 가능한 것은 아닐겁니다. 바로 이럴 경우, URL 처리를 위한 패턴매칭 규칙(Rule)을 적용하기 어려운 여러 URL들에 대해 새로운 URL로 정의하려 할 경우에 Rewrite Map을 이용해 1:1로 매핑하는 처리를 이용하면 유용합니다. 즉, 단순 URL Rewrite Rule이 생성되는 것은 줄이면서 효율적으로 Rewrite 처리가 가능해지는 장점이 있는 것이지요. 물론 Rule의 수가 줄어들게 되니 정규표현식 처리가 줄게되고 이어서 시스템리스소도 적게 사용할 수 있을 겁니다.

Rewrite Map 제작
마찬가지로, 테스트를 위해 예전 포스트에서 작성한 심플한 article.aspx 파일을 이용해 볼께요.

 <%@ Page Language="C#" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="https://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>

테스트를 위해 https://localhost/article.aspx 링크를 접속해 보면 아래와 같은 결과를 보실 수 있을 겁니다.
(만약 안 나오신다면 ASP.NET 서비스를 설치해 주세요.)

Rewrite Map 생성
그렇다면, 본격적으로 Rewrite Map을 생성해 보겠습니다.

URL Rewrite를 선택해 주세요.


Manage rewrite map을 선택해 Rewrite Map을 생성합니다.


이렇게 이름을 “StaticRewrite”로 설정하고 “Add Mapping Entry”를 선택해 다음 Entry들을 넣습니다.


각각 값을 “/article1” 그리고 New Value를 “/article.aspx?id=1&title=some-title” 으로 지정합니다. 즉, /article1 요청이 들어오면 뒤에 나오는 URL로 rewrite 하라는 의미이지요.

Original URL New URL
/some-title /article.aspx?id=1&title=some-title
/post/some-title.html /article.aspx?id=1&title=some-title

이런 형태로 값을 넣어 줍니다. 이어서 확인할 내용! 과연 이 매핑 정보는 어디에 저장될까요? 넵! 바로 web.config에 저장되게 됩니다. 어떻게? XML 형태로요.

    1: <rewrite>
    2:     <rewriteMaps>
    3:         <rewriteMap name="StaticRewrites" defaultValue="">
    4:             <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
    5:             <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
    6:             <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    7:         </rewriteMap>
    8:     </rewriteMaps>
    9: </rewrite>

이렇게 보시는 것처럼 web.config에 차곡차곡 저장되게 됩니다. 주의해서 보실 것은 Rewrite Rule이 아니라 rewriteMap 하위에 저장된다는 것이지요.

그렇다면, 이 Rewrite Map을 어떻게 Rewrite Rule에 매핑 시킬까요? 바로 새로운 Rule을 만들고, 그 Rule에 이 Map을 걸어 주는 형태로 완성됩니다.

image
”Add Rule”을 실행하고, Rule with rewrite map을 선택합니다.

image 
이어서 Rule Action은 “Rewrite”, rewrite map은 당연히 조금 전에 위에서 생성한 “StaticRewrite”를 선택 가능합니다.

그렇다면 확인을 위해 web.config를 열어 볼까요?

    1: <rewrite>
    2:     <rewriteMaps>
    3:         <rewriteMap name="StaticRewrite">
    4:             <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
    5:             <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
    6:             <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    7:         </rewriteMap>
    8:     </rewriteMaps>
    9:     <rules>
   10:         <rule name="Rewrite rule1 for StaticRewrite">
   11:             <match url=".*" />
   12:             <conditions>
   13:                 <add input="{StaticRewrite:{REQUEST_URI}}" pattern="(.+)" />
   14:             </conditions>
   15:             <action type="Rewrite" url="{C:1}" appendQueryString="false" />
   16:         </rule>
   17:     </rules>
   18: </rewrite>

10번 라인부터 16번 라인까지 보시면 Rewrite Map을 처리하는 Rule을 확인 가능하지요.
11번 라인의 “ <match url=".*" /> ”은 모든 인입되는 URL에 대해서 동작한다는 의미 입니다.
13번 라인의 내용은 StaticRewrite Map에서 리턴되는 값이 빈 문자열이 아니라는 조건 처리 입니다.
15번 라인의 Action은 이 Rewrite Map에서 나온 결과값으로 URL을 Rewrite하는 동작을 수행하라는 의미 입니다.

그렇다면, 우리가 만든 Rewrite Map이 잘 동작하는지 확인을 위해 테스트를 해 볼까요.
https://localhost/article1
https://localhost/some-title
https://localhost/post/some-title.html

위의 테스트 작업을 수행하면 아래처럼 결과가 잘 나오는 것을 확인 가능할 것입니다.

그렇다면, “Redirect”는 어떻게 처리 가능할까요? Rewrite와 같습니다.

image 
Rewrite Map을 Rule에 매핑하던 화면 기억 나시는지요? 여기에서 Rewrite 대신 Redirect를 선택하시면 됩니다.

마침 - Rewrite Map을 왜 사용하는가?
모든 URL 처리가 패턴 규칙으로 매핑 가능하지는 않습니다. 이렇게, URL 처리를 위한 패턴매칭 규칙(Rule)을 적용하기 어려운 여러 URL들에 대해 새로운 URL로 여럿 정의하려 할 경우에 Rewrite Map을 이용해 1:1로 매핑하는 처리를 이용하면 유용합니다. 단순 URL Rewrite Rule이 생성되는 것은 줄이면서 효율적으로 Rewrite 처리가 가능해지는 장점이 있는 것이지요. 물론 단순 Rule들을 나열하는 것보다 부하를 줄일 수도 있다고 합니다.

이렇게 해서 전반적인 URL Rewrite 기능에 대해 알아 보았습니다. URL Rewrite만 해도 유용한 Fancy URL 제작 기능부터 보안 기능 등 다양한 내용이 포함되어 있는 것 같습니다. 이 외에도 IIS에 대한 수많은 유용한 기능들이 있는데요, IISKOREA 팀분들과 차근차근 좋은 내용으로 풀어 나가 보도록 하겠습니다. 감사합니다.

지난 포스트 링크
URL Rewrite 1.1 (URL 재작성) - (1) 소개 및 설치
URL Rewrite 1.1 (URL 재작성) - (2) URL 재작성
URL Rewrite 1.1 (URL 재작성) - (3) 요청 필터링과 URL Rewrite
URL Rewrite 1.1 (URL 재작성) - (4) ASP.NET 라우팅과 URL Rewrite
URL Rewrite 1.1 (URL 재작성) - (5) Apache의 mod_rewrite 규칙 가져오기(import)

참고자료
서버주무르기 - IIS 7, URL Rewrite Module (URL 재작성 모듈)
Using Rewrite Maps in URL Rewrite Module
Using URL Rewrite Module