실패한 요청 추적을 사용해서 재작성 규칙 추적하기

등록일시: 2008-07-11 23:00,  수정일시: 2013-11-18 09:46
조회수: 7,940
이 문서는 IIS 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

IIS 7.0은 처리에 실패한 요청을 분석하고 발견된 문제점을 해결하기 위한 실패한 요청 추적이라는 강력한 기능을 제공해줍니다. 이 기능을 활용하면 URL 재작성 모듈이 어떻게 재작성 규칙을 적용해서 요청받은 URL을 재작성하는지 그 과정을 추적해 볼 수도 있습니다. 본문에서는 URL 재작성 규칙의 장애 추적과 디버깅을 위해서 실패한 요청 추적 기능을 사용하는지 방법을 살펴봅니다. 실패한 요청 추적에 관한 보다 자세한 정보는 이 문서를 참고하시기 바랍니다.

전제조건

본문은 다음과 같은 조건들을 전제로 합니다:

  1. ASP.NET과 추적 역할 서비스가 설치된 IIS 7.0
  2. URL 재작성 모듈 CTP 버전 설치 *

* URL 재작성 모듈을 다운로드 받을 수 있는 경로는 이전 번역 문서에 소개되었습니다.

테스트 웹 페이지 설정하기

먼저, URL 재작성 모듈이 어떻게 동작하는지 자세히 살펴보기 위한 용도로 사용될 간단한 테스트 ASP.NET 페이지를 작성할 것입니다. 이 페이지에서는 웹 서버 변수를 읽고 그 값을 브라우저에 출력합니다.

다음의 ASP.NET 코드를 복사해서 %SystemDrive%\inetpub\wwwroot\folder에 article.aspx라는 이름의 파일을 만들고 붙여 넣습니다: *

<%@ 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 파일에 접근해보고 결과가 정상적으로 출력되는지 페이지를 점검합니다.

* 이 코드를 살펴보면 "HTTP_X_ORIGINAL_URL"이라는 다소 생소한 이름의 서버 변수를 발견할 수 있습니다. 이 서버 변수는 사용자가 요청한 본래의 URL 값을 갖고 있으며 URL 재작성 모듈이 내부적으로 생성해 낸 것으로 보입니다.

재작성 규칙 생성하기

먼저, %SystemDrive%\inetpub\wwwroot\ 폴더에 위치한 Web.config 파일을 찾습니다. 만약, 파일이 존재하지 않으면 파일을 생성합니다. 그리고, Web.config 파일을 열고 다음 섹션을 <system.webServer> 항목에 추가합니다: *

<rewrite>
  <rules>
    <rule name="Fail bad requests">
      <match url="." />
      <conditions>
        <add input="{HTTP_HOST}" negate="true" pattern="localhost" />
      </conditions>
      <action type="AbortRequest" />
    </rule>
    <rule name="Rewrite to article.aspx">
      <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
      <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
    </rule>
  </rules>
</rewrite>
  • "Fail bad requests" 규칙은 HTTP 요청 호스트 헤더값이 "localhost"가 아니면 HTTP 연결을 취소시킵니다.
  • "Rewrite to article.aspx" 규칙은 요청받은 http://localhost/article/234/some-title 형식의 검색 엔진 친화적 URL을 http://localhost/article.aspx?id=234&title=some-title 형식으로 재작성합니다.

이 규칙들이 정상적으로 설정됐는지 확인해보려면 인터넷 익스플로러를 실행하고 주소창에 http://localhost/article/234/some-title을 입력해봅니다. 만약, 규칙이 올바르게 설정되었다면 웹 브라우저에 다음과 같은 응답이 출력될 것입니다:

* 본문에서는 본문의 주제에만 집중하기 위해서 IIS 관리자를 사용하는 방법이 아닌, Web.config 파일을 직접 수정하는 방법으로 재작성 규칙을 추가하고 있습니다. IIS 관리자를 사용해서 재작성 규칙을 추가하는 자세한 방법은 URL 재작성 모듈을 위한 재작성 규칙 작성하기를 참고하기 바란다.

실패한 요청 추적 설정하기

계속해서 이번에는 "Default Web Site" 사이트의 실패한 요청 추적 기능을 활성화시켜야 합니다. (그 구체적인 방법은 이 문서를 참고하시기 바랍니다.) 그런 다음에는 URL 재작성 모듈과 관련된 추적 이벤트에 대한 실패한 요청 추적 규칙을 생성해야 합니다.

IIS 관리자를 사용해서 실패한 요청 추적 규칙을 생성하려면 다음의 단계들을 따라합니다:

  1. "실패한 요청 추적 규칙" 기능 아이콘을 더블 클릭해서 실패한 요청 추적 규칙 목록으로 이동합니다.
  2. "추가..." 링크 버튼을 클릭해서 실패한 요청 추적 규칙 마법사를 띄웁니다.
  3. 마법사의 첫 번째 페이지에서 "모든 콘텐츠(*)" 항목을 선택합니다.
  4. "다음" 버튼을 클릭하고, 상태 코드 입력란에 "200-399"를 입력합니다.
  5. "다음" 버튼을 클릭하고 공급자 목록에서 "WWW Server" 공급자를 제외한 모든 공급자의 선택을 제거한 다음, "WWW Server" 공급자의 영역 목록에서 "Rewrite" 항목을 제외한 모든 항목의 선택을 제거합니다.
  6. "마침" 버튼을 클릭해서 실패한 요청 추적 규칙을 저장합니다.

실패한 요청 추적 로그 파일 분석

정상적으로 실패한 요청 추적 규칙을 생성했으면 웹 브라우저를 실행한 다음 http://localhost/article/234/some-title을 요청해봅니다. 그러면, %SystemDrive%\inetpub\Logs\FaileReqLogFiles\ 폴더에 실패한 요청 추적 로그가 생성될 것입니다. 이 로그는 인터넷 익스플로러로 열어 볼 수 있으며 보기 편리한 HTML 문서로 출력됩니다. 다음은 추적 로그 파일에서 찾은 URL 재작성 관련 이벤트들의 샘플입니다:

이런 이벤트들은 재작성 규칙들이 평가되는 방법이나 요청받은 URL들이 재작성 모듈에 의해 변경되는 과정 등을 보여줍니다. 규칙 평가 로직에 대한 이해를 돕기 위해서 몇 가지 이벤트들의 내용을 살펴보도록 하겠습니다: *

URL_REWRITE_START - 이 이벤트는 URL 재작성 이벤트의 시작을 나타냅니다. 이 이벤트의 속성들은 다음과 같은 정보를 제공해줍니다:

  • 입력된 URL 문자열은 "/article/234/some-title"입니다.
  • 쿼리스트링은 존재하지 않습니다.
  • Scope="Distributed"는 이 규칙이 (서버 수준에서 정의된) 전역 규칙이 아닌, (사이트의 Web.config 파일에 정의된) 지역 규칙임을 나타냅니다.

RULE_EVALUATION_START - 이 이벤트는 규칙 평가 로직이 시작됨을 의미합니다. 이 이벤트의 속성들은 다음과 같은 정보를 제공해줍니다:

  • 규칙 패턴 구문에 정규 표현식이 사용됩니다. (patternSyntax="ECMAScript")
  • 후속처리 규칙들이 평가됩니다. (StopProcessing="false")
  • 이 규칙은 사이트 루트 수준에서 정의된 규칙입니다. (RelativePath="/")

PATTERN_MATCH - 이 이벤트는 규칙 패턴과 입력 URL이 일치하는지 여부를 보여줍니다. 이 이벤트의 속성들은 다음과 같은 정보를 제공해줍니다:

  • 규칙 패턴은 "."입니다. (즉, 모든 문자와 일치됩니다.)
  • 입력된 URL이 패턴과 정상적으로 일치합니다.

CONDITIONS_EVALUATION_START - 입력 URL과 규칙 패턴이 일치하므로, 조건 평가가 시작됩니다.

CONDITION_EVALUATION - 이 이벤트는 다음과 같은 정보들을 제공합니다:

  • HTTP_HOST의 값은 "localhost"이며, 이는 패턴과 일치하는 값입니다.
  • 규칙에 조건 부정이 설정되었으므로 (Negated="true") 조건 평가는 실패했습니다.

CONDITIONS_EVALUATION_END - 이 이벤트에서는 해당 규칙의 조건 평가가 실패했음을 보여줍니다.

RULE_EVALUATION_END - 이 이벤트는 규칙이 URL을 수정하지 않았음을 보여줍니다. (Succeeded="false") 그 이유는 규칙 조건 평가가 실패했기 때문입니다.

RULE_EVALUATION_START - 이 이벤트는 입력된 URL이 다음 두 번째 규칙으로 전달되었음을 나타냅니다.

PATTERN_MATCH - 이 이벤트는 규칙 패턴과 입력 URL이 일치하는지 여부를 보여줍니다. 이 이벤트의 속성들은 다음과 같은 정보를 제공해줍니다:

  • 규칙 패턴은 "^article/([0-9]+)/([0-9a-z]+)"입니다.
  • 입력된 URL이 패턴과 정상적으로 일치합니다.

REWRITE_ACTION - 이 이벤트는 규칙 평가에 성공했으며, 입력된 URL이 쿼리스트링 "id=234&title=some-title"과 함께 "/article.aspx"로 재작성되었음을 보여줍니다.

* 본문의 앞 부분에서 규칙이 두 가지 추가되었다는 점을 기억하시기 바랍니다. 이 섹션의 샘플 로그는 이 두 가지 규칙이 순차적으로 처리되는 과정을 보여주는데, 그 처리 순서는 구성 설정 파일에 규칙이 추가된 순서와 동일합니다. 규칙이 수행되는 순서에 따라 처리된 URL이 연쇄적으로 전달되므로, 규칙의 순서가 올바르지 않다면 원하지 않는 결과가 나타날 수도 있습니다.

요약

본문에서 살펴본 것처럼 실패한 요청 추적 기능에 의해 기록된 URL 재작성 관련 이벤트들은 단지 URL 문자열에 적용되는 규칙 평가 로직을 이해하기 위한 정보뿐만 아니라, URL 재작성 규칙의 장애 추적이나 디버그에 사용될 수 있는 대단히 상세한 정보들을 제공해줍니다.