URL 다시 쓰기 모듈에서 사용자 지정 다시 쓰기 공급자 사용

루슬란 야쿠셰프

이 연습에서는 URL 다시 쓰기 모듈 2.0에서 사용자 지정 다시 쓰기 공급자를 사용하는 방법을 안내합니다. 이 연습에서는 MSDN 코드 갤러리의 URL 다시 쓰기 확장성 샘플에서 다운로드할 수 있는 URL 다시 쓰기 2.0 확장성 샘플을 사용합니다.

URL 다시 쓰기 확장성 샘플 설치

이 연습을 완료하려면 URL 다시 쓰기 확장성 샘플(https://www.microsoft.com/download/details.aspx?id=43353)을 다운로드하여 설치합니다. 확장성 샘플 설치 패키지에는 .NET 어셈블리와 가장 일반적인 세 가지 사용 사례에 대한 다시 쓰기 공급자의 전체 구현이 포함된 소스 코드가 포함되어 있습니다.

  • SQL 데이터베이스에 다시 쓰기 또는 리디렉션 매핑 저장
  • 다시 쓰기 또는 리디렉션 매핑을 텍스트 파일에 저장합니다.
  • 조회 하위 문자열을 텍스트 파일에 저장합니다.

설치하는 동안 사용자 지정 설정에서 "런타임" 옵션을 선택해야 합니다. 그러면 URL 다시 쓰기 모듈에서 사용할 수 있도록 .NET 전역 어셈블리 캐시에 샘플 공급자가 등록됩니다.

I S U R L 다시 쓰기 확장성 샘플 설정 대화 상자의 스크린샷. 런타임 아이콘이 강조 표시됩니다.

공급자 등록

설치 패키지에는 3개의 다시 쓰기 공급자가 포함되어 있습니다.

  • DbProvider - 저장 프로시저를 실행하여 SQL Server 데이터베이스 테이블에서 다시 쓰기 매핑을 검색하는 데 이 공급자를 사용할 수 있습니다.
  • FileMapProvider - 이 공급자를 사용하여 텍스트 파일에 저장된 다시 쓰기 매핑을 검색할 수 있습니다.
  • FileContainsProvider - 텍스트 파일의 문자열이 공급자의 입력 문자열의 부분 문자열인 경우 이 공급자를 사용하여 검사 수 있습니다.

다시 쓰기 규칙에서 샘플 공급자를 사용하려면 공급자를 IIS에 등록해야 합니다. 공급자를 등록하려면 IIS 관리자 사용자 인터페이스를 사용할 수 있습니다.

  1. IIS 관리자에서 URL 다시 쓰기 기능을 엽니다.
  2. "공급자 보기..."를 선택합니다. 오른쪽의 "작업" 창에 있는 작업
    I S Manager U R L 다시 쓰기 홈 페이지의 스크린샷. 오른쪽의 작업 창에서 공급자 보기가 강조 표시됩니다.
  3. "공급자 추가..."를 선택합니다. "작업" 창의 작업
  4. "공급자 추가" 대화 상자에서 다시 쓰기 규칙에서 이 공급자를 참조할 때 이 공급자에 사용할 이름을 입력합니다.
  5. 그런 다음 "관리되는 형식" 드롭다운 목록에서 공급자에 대한 해당 .NET 형식을 선택합니다. 공급자 유형이 표시되려면 다소 시간이 걸릴 수 있습니다.
    I S 관리자 페이지의 스크린샷. 공급자 다시 쓰기 페이지가 표시됩니다. 오른쪽의 작업 창에서 공급자 추가가 강조 표시됩니다.
  6. 위의 단계를 반복하여 세 공급자를 모두 등록합니다.

DbProvider 사용

DbProvider를 사용하려면 Microsoft SQL Server액세스해야 합니다. 공급자는 SQL Server 데이터베이스에 연결하고 입력 URL 문자열이 포함된 NVARCHAR 입력 매개 변수를 사용하고 NVARCHAR 형식의 출력 URL 문자열을 포함하는 하나의 열 결과 집합인 하나의 행을 반환하는 저장 프로시저를 실행합니다.

샘플 데이터베이스 만들기

SQL Server Management Studio를 열고 새 쿼리 창을 열고 다음 SQL 스크립트를 실행합니다.

USE [master]

CREATE LOGIN [IIS APPPOOL\DefaultAppPool] FROM WINDOWS WITH DEFAULT_DATABASE=[master]

CREATE DATABASE [RewriteDB]
GO

USE [RewriteDB]
GO

CREATE TABLE [dbo].[RewriteTable](
[OriginalUrl] [nvarchar](256) NOT NULL,
[NewUrl] [nvarchar](256) NOT NULL
) ON [PRIMARY]
GO

CREATE PROCEDURE [dbo].[GetRewrittenUrl] 
@input nvarchar(256)
AS
SELECT rt.NewUrl 
FROM dbo.RewriteTable rt 
WHERE rt.OriginalUrl = @input
GO

CREATE USER [IIS APPPOOL\DefaultAppPool] FOR LOGIN [IIS APPPOOL\DefaultAppPool]

GRANT EXECUTE ON dbo.GetRewrittenUrl TO [IIS APPPOOL\DefaultAppPool];
GO

INSERT INTO dbo.RewriteTable VALUES ('old/catalog/product.html', 'new/category/product.html');
INSERT INTO dbo.RewriteTable VALUES ('old/contactus/index.html', 'new/contactus.html');
GO

위의 스크립트는 RewriteTable 테이블과 저장 프로시저 GetRewrittenURL이 있는 RewriteDB라는 새 데이터베이스를 만듭니다. 또한 IIS APPPOOL\DefaultAppPool 계정에 해당 저장 프로시저를 실행할 수 있는 권한을 부여합니다. 또한 두 개의 URL 매핑으로 데이터베이스 테이블을 채웁니다.

DbProvider 설정 구성

저장 프로시저를 호출하도록 DbProvider 인스턴스를 구성합니다.

  1. URL 다시 쓰기 기능 보기의 IIS 관리자에서 "공급자 보기..."를 선택합니다. 작업 창을 int합니다.
  2. "공급자 추가"를 선택하고 DbProvider를 선택합니다. 이름을 DB로 지정합니다. 이 이름은 다시 쓰기 규칙에서 공급자를 참조하는 이름입니다.
  3. DB라는 DbProvider 인스턴스를 선택하고 "공급자 설정 추가..."를 클릭합니다. 작업.
  4. "공급자 설정 편집" 대화 상자를 사용하여 공급자를 구성합니다.
    I S 관리자 페이지의 스크린샷. 공급자 다시 쓰기 페이지가 표시됩니다. 공급자 설정 편집 대화 상자가 나타나고 이름 상자에 S QL Server 연결 문자열 텍스트가 표시됩니다.

공급자 설정에 다음 값을 사용합니다.

  • SQL Server 연결 문자열: SQL Server 연결 문자열 제공합니다. 예를 들면 다음과 같습니다.
    "Data Source=servername\sqlexpress; Initial Catalog=RewriteDB; 통합 보안=True"
  • 저장 프로시저 이름: GetRewrittenUrl
  • 캐시 시간 간격: SQL 테이블의 값이 변경되지 않으면 0으로 설정하거나 공급자가 모듈의 내부 다시 쓰기 캐시를 주기적으로 새로 고치도록 양수 정수로 설정합니다. 지정하지 않으면 값 0이 가정됩니다.

다시 쓰기 규칙에서 DbProvider 호출

웹 사이트의 루트 디렉터리에서 web.config 파일을 엽니다. IIS 기본 웹 사이트를 사용하는 경우 파일이 폴더에 C:\inetpub\wwwroot\ 있어야 합니다.

다음 리디렉션 규칙을 요소 내의 web.config 파일에 붙여넣습니다 /<configuration>/<system.webServer>/<rewrite>/<rules> .

<rule name="DbProviderTest" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{DB:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Redirect" url="{C:1}" />
</rule>

web.config 파일의 전체 콘텐츠는 아래와 유사합니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="DB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="ConnectionString" value="Data Source=ruslany-server\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" />
                <add key="StoredProcedure" value="GetRewrittenUrl" />
                <add key="CacheMinutesInterval" value="0" />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="DbProviderTest" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{DB:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
        </rule>
    </rules>
</rewrite>

이 규칙은 DbProvider를 통해 SQL Server 데이터베이스에서 가져온 URL로 HTTP 리디렉션을 수행합니다. "DB"라는 DbProvider 인스턴스는 규칙의 조건에서 호출되며 공급자에서 반환된 결과가 비어 있지 않으면 HTTP 리디렉션이 수행됩니다.

규칙을 테스트하려면 웹 브라우저를 열고 요청 http://localhost/old/catalog/product.html 하거나 http://localhost/old/contactus/index.html 브라우저는 RewriteDB 데이터베이스 테이블에 정의된 리디렉션 매핑에 따라 새 URL로 리디렉션됩니다. 웹 서버는 서버에 이러한 파일 또는 디렉터리가 없기 때문에 리디렉션된 URL에 대한 HTTP 404 오류를 반환하지만 이 연습의 목적과는 관련이 없습니다. 중요한 부분은 웹 서버가 DbProvider를 사용한 규칙에 따라 리디렉션 응답을 실행했다는 것입니다.

FileMapProvider 사용

FileMapProvider는 텍스트 파일에서 URL 매핑을 읽습니다. 다시 쓰기 맵 항목의 양이 매우 크고 web.config 파일에 보관하는 것이 실용적이지 않은 경우 기본 제공 다시 쓰기 맵 기능 대신 사용할 수 있습니다.

샘플 매핑 파일 만들기

웹 사이트의 루트 디렉터리에 App_Data이라는 새 디렉터리를 만듭니다. 해당 디렉터리에서 redirectmappings.txt이라는 텍스트 파일을 만듭니다. 파일에 다음 줄을 추가합니다.

old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html

WARNING 메모가 표시되기 전에 경고 기호를 보여 주는 이미지입니다.경고: 항상 웹에서 텍스트 파일에 직접 액세스할 수 없는지 확인합니다. IIS 요청 필터링 모듈을 사용하거나 http 클라이언트가 이 파일의 콘텐츠에 직접 액세스하지 못하도록 App_Data 폴더 내에 파일을 배치합니다.

FileMapProvider 구성

DbProvider 구성에 설명된 것과 동일한 단계를 수행하여 FileMapProvider를 구성합니다. 공급자 설정에 다음 값을 사용합니다.

  • FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt(파일 경로에서 {DOCUMENT_ROOT}을(를) 사용합니다. 공급자를 초기화하는 동안 실제 경로로 대체됩니다. web.config 파일에 절대 파일 경로를 배치하지 않으려는 경우에 유용합니다.
  • IgnoreCase: 1
  • 구분 기호: ","(지정하지 않으면 TAB 기호가 구분 기호로 사용됨)

다시 쓰기 규칙에서 FileMapProvider 호출

웹 사이트의 루트 디렉터리에서 web.config 파일을 엽니다. IIS 기본 웹 사이트를 사용하는 경우 파일이 폴더에 C:\inetpub\wwwroot\ 있어야 합니다.

다음 리디렉션 규칙을 요소 내의 web.config 파일에 붙여넣습니다 /<configuration>/<system.webServer>/<rewrite>/<rules> .

<rule name="FileMapProviderTest" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{FileMap:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Redirect" url="{C:1}" />
</rule>

web.config 파일의 전체 콘텐츠는 아래와 유사합니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="FileMap" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\redirectmappings.txt" />
                <add key="IgnoreCase" value="1" />
                <add key="Separator" value="," />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="FileMapProviderTest" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{FileMap:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
        </rule>
    </rules>
</rewrite>

이 규칙은 FileMapProvider를 통해 텍스트 파일에서 가져온 URL로 HTTP 리디렉션을 수행합니다. "FileMap"이라는 FileMapProvider 인스턴스는 규칙의 조건에서 호출되며 공급자에서 반환된 결과가 비어 있지 않으면 HTTP 리디렉션이 수행됩니다.

규칙을 테스트하려면 웹 브라우저를 열고 요청 http://localhost/old/catalog/product.html 하거나 http://localhost/old/contactus/index.html 브라우저는 redirectmappings.txt 파일에 정의된 리디렉션 매핑에 따라 새 URL로 리디렉션됩니다. 웹 서버는 서버에 이러한 파일 또는 디렉터리가 없기 때문에 리디렉션된 URL에 대한 HTTP 404 오류를 반환하지만 이 연습의 목적과는 관련이 없습니다. 중요한 부분은 웹 서버가 FileMapProviders를 사용한 규칙에 따라 리디렉션 응답을 실행했다는 것입니다.

FileContainsProvider 사용

FileContainsProvider는 텍스트 파일에서 문자열 집합을 읽은 다음 공급자의 입력 문자열에 하위 문자열로 해당 문자열이 포함되어 있으면 검사. 공급자는 예를 들어 사용자 에이전트 헤더에 따라 액세스를 차단하는 다시 쓰기 규칙과 함께 사용할 수 있습니다.

허용되지 않는 샘플 사용자 에이전트 파일 만들기

웹 사이트의 루트 디렉터리에 App_Data이라는 새 디렉터리를 만듭니다. 해당 디렉터리에서 disalloweduseragents.txt이라는 텍스트 파일을 만듭니다. 파일에 다음 줄을 추가합니다.

badrobot1
badrobot2

경고 기호 이미지가 경고 메모 앞에 나타납니다. 이미지는 가운데 느낌표가 있는 삼각형입니다.경고: 항상 웹에서 텍스트 파일에 직접 액세스할 수 없는지 확인합니다. IIS 요청 필터링 모듈을 사용하거나 http 클라이언트가 이 파일의 콘텐츠에 직접 액세스하지 못하도록 App_Data 폴더 내에 파일을 배치합니다.

FileContainsProvider 구성

DbProvider 구성에 설명된 것과 동일한 단계를 수행하여 FileMapProvider를 구성합니다. 공급자 설정에 다음 값을 사용합니다.

  • FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt(파일 경로에서 {DOCUMENT_ROOT}을(를) 사용합니다. 공급자를 초기화하는 동안 실제 경로로 대체됩니다. web.config 파일에 절대 파일 경로를 배치하지 않으려는 경우에 유용합니다.
  • IgnoreCase: 1

다시 쓰기 규칙에서 FileContainsProvider 호출

웹 사이트의 루트 디렉터리에서 web.config 파일을 엽니다. IIS 기본 웹 사이트를 사용하는 경우 파일이 폴더에 C:\inetpub\wwwroot\ 있어야 합니다.

다음 리디렉션 규칙을 요소 내의 web.config 파일에 붙여넣습니다 /<configuration>/<system.webServer>/<rewrite>/<rules> .

<rule name="FileContainsProviderTest" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
    </conditions>
    <action type="AbortRequest" />
</rule>

web.config 파일의 전체 콘텐츠는 아래와 유사합니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="FileContains" type="FileContainsProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt" />
                <add key="IgnoreCase" value="1" />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="FileContainsProviderTest" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
            </conditions>
            <action type="AbortRequest" />
        </rule>
    </rules>
</rewrite>

이 규칙은 HTTP 요청의 사용자 에이전트가 disalloweduseragents.txt 파일에 나열된 문자열과 일치하는 경우 HTTP 연결을 중단합니다. "FileContains"라는 FileContainsProvider 인스턴스는 규칙의 조건에서 호출되며 공급자에서 반환된 결과가 비어 있지 않으면 HTTP 연결이 중단됩니다.

규칙을 테스트하려면 WFetch를 열고 아래와 같이 요청에 사용자 에이전트 헤더를 추가합니다.

user-agent: badrobot1\r\n

WFetch http://localhost/test/에서 . 사용자 에이전트 문자열이 disalloweduseragents.txt 파일의 문자열 중 하나와 일치하므로 연결이 중단되는 것을 볼 수 있습니다.

한 대화 상자 가져오기 페이지의 스크린샷. 사용자 에이전트 문자열이 허용되지 않는 사용자 에이전트 dot t x t 파일의 문자열 중 하나와 일치하므로 연결이 중단됩니다.