URL Rewrite 1.1 (URL 재작성) - (2) URL 재작성

지난 포스트 링크
https://www.iiskorea.net/entry/URL-Rewrite-11-URL-재작성-1-소개-및-설치

지난 시간에 간략히 URL Rewrite의 역할과 기능을 소개해 드렸습니다. 이번 시간에는 URL Rewrtie를 실제로 사용해 보고 어떻게 이용하는지 간략히 설명 드리려고 합니다.

먼저, URL Rewrite를 왜 써야 합니까?
그렇다면 왜 URL Rewrite를 알아야 하는가? 간단하다, 다양한 웹 어플리케이션인 블로그나 CMS, 쇼핑몰 등도 Fancy URL과 Permanent Link가 제공하는 장점들을 기본적으로 제공하고 있다.
- XpressEngine
- Textyle
- Textcube
국내에서 가장 많이 사용되는 오픈소스 웹 어플리케이션들이며 모두 Rewrite 동작에 기반한 Fancy URL을 제공하고 있다. IIS7에서 역시 이러한 어플리케이션들을 구동시킬 수 있으며, 당연히 Rewrite 동작들을 어플리케이션들에 맞게 제공 가능하다. - Rewrite는 먼나라 이야기가 아니라, IIS를 운영하기 위한 필수적인 확장 기능이며, 당연히 IIS의 URL Rewrite는 국내 오픈소스 어플리케이션에서 제공하는 Rewrite Rule을 그대로 이용 가능하다.

Rewrite Rule 따라해보기
간단히 아래와 같은 역할을 수행한다고 가정해 보자.

Fancy URL https://localhost/article/342/some-article-title
https://localhost/article.aspx?id=342&title=some-article-title 으로 변환 하는 것이 목표다. – 그냥 보기에도 어려워 보인다. 흠…

Fancy URL인 위의 구조는 사람이나 검색엔진에는 친화적인 URL이지만, 개발자가 어플리케이션에 의해 처리되는 Request들을 받아 처리하기에는 적절하지 못하다.
당연히 Rewrite를 통해 Fancy URL을 재작성(Rewrite)하는 과정이 필요하다. 어떻게 진행 할 수 있을까?

    1: <%@ Page Language="C#" %>
    2: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    3: <html xmlns="https://www.w3.org/1999/xhtml">
    4: <head>
    5: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    6: <title>URL Rewrite Module Test</title>
    7: </head>
    8: <body>
    9:       <h1>URL Rewrite Module Test Page</h1>
   10:       <table>
   11:             <tr>
   12:                   <th>Server Variable</th>
   13:                   <th>Value</th>
   14:             </tr>
   15:             <tr>
   16:                   <td>Original URL: </td>
   17:                   <td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
   18:             </tr>
   19:             <tr>
   20:                   <td>Final URL: </td>
   21:                   <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
   22:             </tr>
   23:       </table>
   24: </body>
   25: </html>

테스트를 위해 위와 같은 텍스트 파일을 생성하고, 파일 이름을 article.aspx 파일로 저장한다. 이후, IIS의 웹사이트 루트에 저장하도록 한다. 본인의 경우는 https://localhost/article.aspx 형태가 되도록 구성했다. 이어서 Rule을 작성해 보도록 하자.

그렇다면 Rule(규칙), Pattern(패턴), Action(동작)이란 무엇인가?

알아야할 세가지 키워드가 존재한다. Pattern은 URL의 패턴을 의미한다. 즉, URL이 abc.com/article/123/abcd 형태라고 한다면 서버의 DNS 주소 뒤에 article이 오고 숫자가 오고 문자가 오는 형태의 패턴이라고 말할 수 있다. 즉, 이런 패턴을 치환하는 동작이 바로 Action이라고 보면 된다. 이렇게 패턴에 따라 정의한 동작이 있는 것이 하나의 Rule이라고 보면 되며 이런 Rule들이 여러개 조건에 따라 존재할 수 있다. 이 Rule들을 관리하게 쉽게 돕는것이 바로 URL Rewrite라고 보면 된다.

URL Rewrite를 실행

웹사이트를 선택하고, 이렇게 URL Rewrite를 실행한다.

우측 상단의 Add Rule을 실행한다.

Blank Rule을 선택합니다. – 물론 필요할 경우 Template 등을 선택할 수도 있습니다.

이어서, 위와 같이 Rule을 구성합니다.

Pattern 부분을 주의해서 보시면

 ^article/([0-9]+)/([_0-9a-z-]+)

이런 내용이 보이는데요. 의미하는 바는

- 시작 문자열이 article로 시작되고

- 하나 이상의 숫자가 처음 “/” 부터 존재하고

- 하나 이상의 “_” 또는 “-” 또는 알파벳 문자열이 두번째 “/” 이후에 존재하는

패턴을 의미 합니다. 즉, 이런 패턴일 경우에만 이 Rule이 동작 하겠지요.

이어서 Action 부분을 주의해서 봐 보시면

 article.aspx?id={R:1}&title={R:2}

이런 내용이 보이는데요. {R:1}은 Rewrite된 패턴의 첫번째 리턴값, {R:2}는 두번째 리턴값이 들어간다고 보시면 됩니다.

URL Rewrite의 Rule은 어디에 저장 되는가?
IIS는 똑똑하게도 이러한 Rule을 기본적으로 웹사이트 루트디렉토리에 포함된 web.config에 저장하게 된다. 만약, 시스템 전체에 적용되는 Rewrite Rule을 이용하고 싶을 경우에는 당연히 시스템에서 구성하면 되며, 시스템에 구성한 Rule은 applicationhost.config에 저장되며 모든 웹사이트가 상속받아 실행하게 된다. 그렇다면, web.config에 저장된 rewrite rule은 어떤 모습일까?

    1:  <rewrite>
    2:    <rules>
    3:      <rule name="Rewrite to article.aspx">
    4:        <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
    5:        <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
    6:      </rule>
    7:    </rules>
    8:  </rewrite>

이런 형태로 web.config에 저장된다. 즉, URL Rewrite 툴은 이런 Rule을 쉽게 제작하도록 도와주는 툴인 것이고, 실제 동작은 IIS의 Filter로 동작하게 되는 것이다. 그렇다면, URL Rewrite를 실행해 보면?

테스트 URL : https://localhost/article/234/some-title

이렇게 Rewrite가 처리되는 것을 볼 수 있다. Fancy URL에 대한 처리가 이렇게 가능해 진다. URL Rewrite는 이렇게 URL을 재작성해 어플리케이션에서 이용 가능하도록 URL을 재작성한다. URL “Redirect”는 어떨까? Redirect는 URL을 아예 옮겨버리는 작업을 진행하는 차이점이 있다.

URL Redirect를 테스트 해 보도록 하자.

이런 URL을 https://localhost/blog/some-other-title/543

https://localhost/article/543/some-other-title 이런 URL로 Redirect 시키려 할 경우를 진행해 보면

Pattern :

 ^blog/([_0-9a-z-]+)/([0-9]+)

Action 을 “Redirect”로 설정하고 Redirect URL을 아래처럼 구성한다.

 article/{R:2}/{R:1}

테스트를 하기 위해 아래 링크를 수행한다.

https://localhost/blog/some-other-title/323

브라우져의 결과가 Redirect되어 https://localhost/article/323/some-other-title 로 이동된 것을 확인 가능하다.

Access Block Rule을 이용할 수도 있다.
이 경우는 해킹 시도와 같이 호스트명으로 처리되는 요청이 아닌 IP로 요청되는 시도를 blocking 할 수 있는 Rule이다. 즉, https://123.123.123.123 과 같은 형태의 요청을 기본적으로 block하고 https://abc.com 형태로 요청될 경우에만 통과 시키는 규칙으로 구성가능하다.(당연하겠지만, 이런 형태의 방어 처리는 IIS의 바인딩 설정이나 URL Scan 등에서도 처리 가능하다)

    1:  <rule name="Fail bad requests">
    2:        <match url=".*"/>
    3:        <conditions>
    4:          <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
    5:        </conditions>
    6:        <action type="AbortRequest" />
    7:  </rule>

- 2번 라인은 Rule이 모든 URL 스트링에 대해서 동작하라는 의미이다.

- 4번 라인은 HTTP_HOST 값이 “localhost”이 아닐 경우에 대한 조건 처리이다.

- 6번 라인은 조건일 경우 요청을 취소 시키는 처리이다.

테스트를 위해서 https://127.0.0.1/article/234/some-title 과 같은 IP로 요청을 수행할 경우 Request가 중단되는 것을 확인 가능하다.

이렇게 URL Rewrite의 핵심적인 3개 기능을 알아 보았습니다.

1. Rewrite 기능을 이용한 URL 처리

2. Redirect 동작

3. Access Block 처리

다음 내용에서는

- 요청필터링과 URL Rewrite 비교

- ASP.NET 라우팅과 URL Rewrite 비교

- Apache의 mod_rewrite Rule을 Import해서 처리 가능한 URL Rewrite의 import 기능

- Rewrite Map 이용

내용에 대해서 알아 보도록 하겠습니다. 감사합니다.

[지난포스트 링크]

https://www.iiskorea.net/entry/URL-Rewrite-11-URL-재작성-1-소개-및-설치