IIS 7.0에서 HTTP 상세 오류를 사용하는 방법

IIS 팀별

소개

모든 Web-Site 관리자 또는 웹 개발자는 브라우저에서 "404 - 파일을 찾을 수 없음", "401 - 권한 없음" 또는 "500 - 서버 오류" 메시지를 보았습니다. 이 문서는 IIS에서 이러한 오류를 생성하는 방법과 이유 및 구성 방법을 이해하는 데 도움이 됩니다.

많은 사람들이 오류 메시지를 생성하는 것이 전체 문서를 정당화하지 않는 것 같다고 생각할 수 있습니다. 그러나 눈에 보이는 것보다 오류에 더 많은 것이 있습니다. 오류 메시지는 중요한 항목입니다. 모든 오류는 웹 사이트에 대해 표시하려는 것보다 더 많이 표시되기 때문입니다. 누군가가 귀하의 사이트에 대해 수집 할 수있는 더 많은 정보, 그것은 당신이 해킹 될 것입니다 유사. "Google 해킹" 또는 "교차 사이트 스크립팅"을 검색하면 이 항목에 대한 풍부한 정보가 표시됩니다.

그러나 오류 메시지는 문제 해결을 위한 유용한 도구이기도 합니다. 개발자 및 Web-Site 관리자는 오류가 발생할 때 가능한 한 많은 세부 정보가 필요합니다. 이상적으로 오류 메시지는 문제를 해결하는 방법에 대한 권장 사항을 제공합니다. IIS가 이러한 근본적으로 반대하는 목표를 해결하는 방법은 다음과 같습니다.

오류, 어떤 오류?

이 문서에서는 HTTP RFC (RFC 2616 - 섹션 6.1.1 )에 지정된 HTTP 오류에 대해 설명합니다. HTTP 오류는 항상 400보다 큰 상태 코드가 있는 응답을 요청 클라이언트에 다시 전송하여 표시됩니다.

클라이언트 오류

400에서 500 사이의 상태 코드는 클라이언트가 수행한 오류(예: 잘못된 구문 또는 존재하지 않는 리소스에 대한 요청)를 지정합니다. 선택한 웹 사이트에서 가짜 URL을 요청하여 이를 시도할 수 있습니다(예: http://< IIS7Server>/this_resource_does_not_exist). "404 - 파일을 찾을 수 없음" 오류가 발생합니다.

서버 오류

500부터 시작하는 상태 코드는 서버로 인한 오류입니다. IIS 시스템에서 500개 오류의 가장 일반적인 원인은 다음과 같습니다.

  • 구문 오류가 포함된 ASP 또는 ASPX 페이지
  • 웹 서버 구성 또는 애플리케이션 구성을 읽을 수 없거나 잘못되었습니다.
  • 사이트가 중지되었습니다.

IE와 같은 브라우저는 웹 서버에서 반환된 오류를 자체 오류로 바꾸는 경우가 많습니다. 이렇게 하면 문제 해결이 더 어려워집니다. IE에서 이 기능을 끌 수 있습니다. "도구" 메뉴로 이동하여 "인터넷 옵션"을 선택하고 "고급" 탭을 클릭한 다음 "친숙한 HTTP 오류 메시지 표시" 검사 상자를 찾아 선택을 취소합니다. 원시 응답을 보려면 IIS 6.0 리소스 키트에서 WFETCH와 같은 HTTP 도구를 사용합니다("관련 링크"참조).

IIS의 HTTP 오류

httpError 모듈(custerr.dll)에 오류가 발생할 때 발생할 수 있는 두 가지가 있습니다.

  • 사용자 지정 오류가 생성됨
  • 자세한 오류가 생성됩니다.

사용자 지정 오류는 웹 사이트의 일반 사용자에게 표시되는 오류 페이지입니다. 오류가 발생한 이유에 대한 간단한 오류 설명이 포함되어 있지만 다른 것은 없습니다. 존재하지 않는 리소스를 요청할 때 생성되는 사용자 지정 오류는 다음과 같습니다 http://< IIS7Server>/this_resource_does_not_exist

인터넷 Explorer H TTP 오류 404 파일 또는 디렉터리를 찾을 수 없는 웹 페이지의 스크린샷

자세한 오류는 로컬 관리자 및 개발자를 위한 것입니다. 문제를 즉시 해결하는 데 도움이 되는 정보를 제공해야 합니다. 다음은 동일한 요청의 예이지만 이제 자세한 오류를 반환하는 예제입니다.

오류에 대한 원인 및 해결 방법 섹션을 보여 주는 기본 웹 사이트 애플리케이션 웹 페이지의 서버 오류 스크린샷

자세한 오류에는 웹 사이트의 내부 작동에 대한 정보가 포함되어 있으므로 위험합니다. 신뢰할 수 있는 직원만 자세한 오류가 표시됩니다. 이를 보장하는 유일한 방법은 요청이 로컬 컴퓨터에서 오는 경우에만 자세한 오류를 생성하는 것입니다. 요청이 로컬이 아닌 즉시 사용자 지정 오류가 생성됩니다. 다음 흐름 다이어그램을 살펴보세요.

자세한 오류를 만드는 상태 하위 상태, 엔터티 본문 및 오류 설정 경로 다이어그램

데이터 흐름

첫 번째: 오류 검사

httpError 모듈은 응답을 보내려고 하는 경우 알림을 받습니다(RQ_SEND_RESPONSE 알림). httpError 모듈은 이 응답의 상태 코드를 확인하고 상태 코드가 400보다 크지 않으면 즉시 를 반환합니다.

두 번째: 사용자 지정 오류 또는 자세한 오류

다음 검사 요청 원본(로컬 또는 원격 요청 요청 요청)과 errorMode 속성 설정에 따라 결정됩니다. errorMode 속성은 DetailedLocalOnly로 설정됩니다. 즉, 모든 원격 요청에 대해 사용자 지정 오류가 생성됩니다. errorMode가 "사용자 지정"으로 설정된 경우 모든 오류 응답은 사용자 지정 오류가 됩니다. errorMode가 "Detailed"로 설정된 경우 모든 오류 응답은 자세한 오류가 됩니다. 다음 표에서는 이 동작을 명확하게 설명합니다.

errorMode 요청 원본 작업
DetailedLocalOnly(기본값) 로컬 자세한 오류
DetailedLocalOnly(기본값) 원격 사용자 지정 오류
사용자 지정 로컬 사용자 지정 오류
사용자 지정 원격 사용자 지정 오류
자세히 로컬 자세한 오류
자세히 원격 자세한 오류

httpError 모듈에서 사용자 지정 오류를 생성해야 한다고 판단하는 경우 해당 구성을 조사하여 일치하는 오류를 찾을 수 있는지 확인합니다. 일치하는 항목이 발견되면 정적 파일을 보내거나 요청을 리디렉션하거나 지정된 URL을 실행합니다. 일치하는 항목을 찾을 수 없는 경우 IIS는 상태 코드가 포함된 기본 한 줄 메시지를 보냅니다. 다음 섹션에서는 사용자 지정 오류 구성에 대해 자세히 설명합니다.

custerr.dll 자세한 오류를 생성해야 한다고 판단하는 경우 다른 검사 필요합니다. 모듈이 자체 오류 설명으로 응답의 엔터티를 오버로드한 경우 IIS는 응답을 건드리지 않습니다. 중요한 정보가 포함될 수 있습니다. ASP.NET 좋은 예입니다. ASP.NET 오류 응답의 엔터티에는 예외 스택 및 자체 오류 설명이 포함될 수 있습니다. 자세한 오류는 응답의 엔터티 본문이 비어 있는 경우에만 생성됩니다.

<httpErrors> Configuration

클린 설치에서 가져온 IIS 사용자 지정 오류 섹션은 다음과 같습니다.

<httpErrors>
    <error statusCode="401" prefixLanguageFilePath="c:\inetpub\custerr" path="401.htm" />
    <error statusCode="403" prefixLanguageFilePath="c:\inetpub\custerr" path="403.htm" />
    <error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />
    <error statusCode="405" prefixLanguageFilePath="c:\inetpub\custerr" path="405.htm" />
    <error statusCode="406" prefixLanguageFilePath="c:\inetpub\custerr" path="406.htm" />
    <error statusCode="412" prefixLanguageFilePath="c:\inetpub\custerr" path="412.htm" />
    <error statusCode="500" prefixLanguageFilePath="c:\inetpub\custerr" path="500.htm" />
    <error statusCode="501" prefixLanguageFilePath="c:\inetpub\custerr" path="501.htm" />
    <error statusCode="502" prefixLanguageFilePath="c:\inetpub\custerr" path="502.htm" />
</httpErrors>

응답의 상태 코드가 401이면 IIS는 401.htm 파일을 반환합니다.

Sub-Status 코드

많은 HTTP 오류에는 하위 상태 있습니다. IIS 기본 사용자 지정 오류 구성은 기반 하위 상태 코드를 구분하지 않습니다. 잘못된 자격 증명(401.1)을 입력하거나 파일에 액세스할 수 있는 잘못된 권한(401.3)에 따라 액세스가 거부되는 경우 동일한 사용자 지정 오류 페이지를 보냅니다. 로그 파일에서 또는 자세한 오류를 통해 다양한 하위 상태 코드를 볼 수 있습니다. IIS에서 생성하는 404개의 하위 상태 코드 목록은 다음과 같습니다.

상태 Description
404.1 사이트를 찾을 수 없습니다.
404.2 정책에 의해 거부되었습니다. 요청 ISAPI 또는 CGI 프로그램은 제한 목록에서 허용되지 않습니다.
404.3 정적 파일 처리기에 MimeMap에 파일이 없으므로 요청을 거부했습니다.
404.4 요청을 처리할 처리기를 찾을 수 없습니다.
404.5 요청 필터링 모듈에서 요청의 URL 시퀀스를 거부했습니다.
404.6 요청 필터링 모듈에서 요청의 HTTP 동사를 거부했습니다.
404.7 요청 필터링 모듈에서 요청의 파일 확장자를 거부했습니다.
404.8 요청 필터링 모듈에서 특정 URL 세그먼트(두 슬래시 사이의 문자)를 거부했습니다.
404.9 IIS는 숨겨진 파일을 제공하기 위해 거부되었습니다.
404.11 요청 필터링 모듈에서 이중 이스케이프된 요청을 거부했습니다.
404.12 요청 필터링 모듈에서 높은 비트 문자가 포함된 요청을 거부했습니다.
404.14 요청 필터링 모듈에서 URL이 너무 긴 요청을 거부했습니다.
404.15 요청 필터링 모듈에서 쿼리 문자열이 너무 긴 요청을 거부했습니다.
413.1 요청 필터링 모듈에서 너무 긴 요청(요청 + 엔터티 본문)을 거부했습니다.
431 요청 필터링 모듈에서 너무 긴 헤더를 거부했습니다.

httpErrors 섹션을 구성하여 특정 하위 상태 코드에 대한 사용자 지정 오류를 표시할 수 있습니다. httpErrors 구성 섹션에 다음 줄을 추가하면 IIS MimeMap(<staticContent> 구성 섹션)에 포함되지 않은 파일 확장자가 있는 파일이 요청되면 IIS는 404_3.htm 반환합니다.

<error statusCode="404" subStatusCode="3" prefixLanguageFilePath="c:\inetpub\custerr" path="404_3.htm" />

예제를 작동하는 방법은 다음과 같습니다.

  1. 위의 항목을 httpErrors 구성 섹션에 추가합니다.
  2. 디렉터리에 404_3.htm c:\inetpub\custerr\en-us 파일을 만듭니다.
  3. 디렉터리에 test.yyy c:\inetpub\wwwroot 라는 파일을 만듭니다.
  4. 이제 를 요청합니다 http://localhost/test.yyy.

파일 확장명 .yyy는 IIS MimeMap의 일부가 아니며 정적 파일 처리기는 이를 제공하지 않습니다.

IIS의 새로운 기능: 언어별 사용자 지정 오류

각각의 최신 브라우저에는 클라이언트의 언어가 요청 헤더로 포함됩니다. 다음은 이 헤더의 모양에 대한 예입니다.

Accept-Language: en-us

허용되는 언어의 구문 및 레지스트리는 RFC1766에 지정됩니다.

오류를 생성할 때 IIS는 반환하는 사용자 지정 오류 파일을 찾을 때 이 헤더를 고려합니다. 다음 논리를 사용하여 사용자 지정 오류에 대한 경로를 생성합니다.

prefixLanguageFilePath 구성 설정(예: c:\inetpub\custerr)+
클라이언트에서 보낸 Accept-Language 헤더(예: en-us) +
경로 구성 설정(예: 404.htm)

예제:

브라우저가 존재하지 않는 리소스에 대한 요청을 보내고 "Accept-Language" 헤더의 값이 "en-us"인 경우 반환되는 파일은 입니다 c:\inetpub\custerr\en-us\404.htm.

예를 들어 독일 출신인 경우 독일어로 오류 메시지를 표시해야 합니다. 이렇게 하려면 독일어용 Windows Vista 언어 팩을 설치해야 합니다. 그러면 사용자 지정 오류 파일이 포함된 디렉터리가 만들어집니다 c:\inetpub\custerr\de-DE . 이제 브라우저에서 값이 "de-DE"인 "Accept-Language" 헤더를 보내면 반환되는 파일은 가 됩니다 c:\inetpub\custerr\de-DE\404.htm.

디렉터리 "de-DE"가 없는 경우 IIS는 항상 시스템 언어로 대체됩니다.

참고

인터넷 Explorer 사용하면 Accept-Language 헤더를 구성할 수 있습니다. "도구" - "인터넷 옵션"으로 이동하여 "일반" 탭을 선택하고 "언어" 단추를 클릭합니다.

사용자 지정 오류 옵션

위의 예제에서 IIS는 파일의 내용을 사용자 지정 오류 응답으로 보냅니다. IIS에는 URL을 실행하거나 요청을 리디렉션하여 오류에 응답하는 두 가지 다른 방법이 있습니다.

ExecuteUrl

사용자 지정 오류(예: 전자 메일 보내기 또는 데이터베이스에 오류 로깅)에서 더 많은 작업을 수행하려는 경우 URL을 실행할 수 있습니다. 이렇게 하면 ASP.NET 페이지와 같은 동적 콘텐츠를 실행할 수 있습니다. 아래 예제에서는 404 사용자 지정 오류를 대체합니다. 이제 IIS는 404 오류가 발생할 때마다 /404.aspx를 실행합니다.

<httpErrors>
<!-- default custom error for 401 errors -->
<!-- <error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />-->

<!-- ExecuteURL replaces default file response mode -->
<error statusCode="404" path=/404.aspx" responseMode="ExecuteURL"/>        
<error statusCode="403" prefixLanguageFilePath="c:\inetpub\custerr" path="403.htm" />
<error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />
<error statusCode="405" prefixLanguageFilePath="c:\inetpub\custerr" path="405.htm" />
<error statusCode="406" prefixLanguageFilePath="c:\inetpub\custerr" path="406.htm" />
<error statusCode="412" prefixLanguageFilePath="c:\inetpub\custerr" path="412.htm" />
<error statusCode="500" prefixLanguageFilePath="c:\inetpub\custerr" path="500.htm" />
<error statusCode="501" prefixLanguageFilePath="c:\inetpub\custerr" path="501.htm" />
<error statusCode="502" prefixLanguageFilePath="c:\inetpub\custerr" path="502.htm" />

</httpErrors>

보안 고려 사항

주의 사항: 아키텍처상의 이유로 IIS는 동일한 애플리케이션 풀에 있는 경우에만 URL을 실행할 수 있습니다. 리디렉션 기능을 사용하여 다른 애플리케이션 풀에서 사용자 지정 오류를 실행합니다.

IIS는 특정 오류가 발생할 때 브라우저에 302 리디렉션을 반환할 수도 있습니다. 서버 팜이 있는 경우 리디렉션이 좋습니다. instance 경우 모든 오류를 면밀히 모니터링하는 중앙 위치로 리디렉션할 수 있습니다.

그러나 위험이 있습니다. responseMode="File"(기본값)을 사용하면 디스크의 모든 파일을 지정할 수 있습니다. 이것은 당신이 매우 보안 의식이있는 경우 작동하지 않습니다.

실행 가능한 시나리오에는 errorMode 설정의 위임만 허용하는 것이 포함될 수 있습니다. 이렇게 하면 개발자가 원격 클라이언트를 사용하는 경우에도 애플리케이션에 대한 자세한 오류를 받을 수 있습니다. errorMode="Detailed"를 설정하기만 하면 됩니다. 이 시나리오를 구성하는 방법은 다음과 같습니다.

httpErrors 섹션의 위임을 허용합니다.

<section name="httpErrors" overrideModeDefault="Allow" />

둘째, applicationHost.config 섹션으로 <httpErrors> 이동하여 errorMode만 위임되도록 변경합니다.

<httpErrors lockAllAttributesExcept="errorMode" lockElements="error">
    <error statusCode="404" prefixLanguageFilePath="E:\inetpub\custerr" path="404.htm" />
    <error statusCode="401" prefixLanguageFilePath="E:\inetpub\custerr" path="401.htm" />
    <error statusCode="403" prefixLanguageFilePath="E:\inetpub\custerr" path="403.htm" />
    <error statusCode="405" prefixLanguageFilePath="E:\inetpub\custerr" path="405.htm" />
    <error statusCode="406" prefixLanguageFilePath="E:\inetpub\custerr" path="406.htm" />
    <error statusCode="412" prefixLanguageFilePath="E:\inetpub\custerr" path="412.htm" />
    <error statusCode="500" prefixLanguageFilePath="E:\inetpub\custerr" path="500.htm" />
    <error statusCode="501" prefixLanguageFilePath="E:\inetpub\custerr" path="501.htm" />
    <error statusCode="502" prefixLanguageFilePath="E:\inetpub\custerr" path="502.htm" />
</httpErrors>

요약

사용자 지정 및 자세한 오류는 강력한 IIS 기능입니다. IIS 서버의 보안을 손상시키지 않고 문제를 해결하는 데 도움이 됩니다. 많은 구성 옵션을 사용하면 사용자 환경을 사용자 지정하는 데 도움이 됩니다. 가장 중요한 것은 실험하는 것이 재미 있다는 것입니다.

추가 정보