전역 및 분산 재작성 규칙 사용
로 루슬란 야쿠셰프
이 연습에서는 URL 다시 쓰기 모듈에서 지원하는 다양한 유형의 규칙을 설명하고 전역 및 분산 재작성 규칙을 구성하는 방법을 안내합니다.
배경
전역 다시 쓰기 규칙은 서버 전체 URL 다시 쓰기 논리를 정의하는 데 사용됩니다. 이러한 규칙은 applicationHost.config 파일 내에서 정의되며 사이트 또는 가상 디렉터리와 같은 낮은 구성 수준에서 재정의되거나 사용하지 않도록 설정할 수 없습니다. 전역 규칙은 항상 절대 URL 경로(즉, 서버 이름 없이 요청된 URI)에서 작동합니다. 예를 들어 에 대한 요청이 이루어진 http://localhost/directory1/directory2/index.html
경우 URL 다시 쓰기 모듈은 "directory1/directory2/index.html"를 전역 규칙에 대한 입력으로 전달합니다.
분산 재작성 규칙은 특정 구성 scope 특정 URL 재작성 논리를 정의하는 데 사용됩니다. 분산 규칙은 web.config 파일을 사용하여 모든 구성 수준(파일 제외)에서 정의할 수 있습니다. 로컬 규칙은 정의된 Web.config 파일의 위치를 기준으로 항상 URL에서 작동합니다. 예를 들어 요청이 이루어졌 http://localhost/directory1/directory2/index.html
고 디렉터리1에 있는 Web.config 파일에 다시 쓰기 규칙이 정의된 경우 URL 다시 쓰기 모듈은 "directory2/index.html"를 해당 규칙에 대한 입력으로 전달합니다.
전역 규칙 집합은 항상 먼저 평가되며, 그 후에는 전역 규칙 집합에서 생성된 URL 문자열을 사용하여 분산 규칙 집합을 평가합니다.
사전 요구 사항
이 연습을 수행하려면 다음 필수 구성 요소가 필요합니다.
- ASP.NET 역할 서비스를 사용하도록 설정된 IIS 7.0 이상
- URL 다시 쓰기 Go Live 릴리스 설치됨
연습 시나리오 설정
전역 및 로컬 규칙을 사용하는 방법을 보여주기 위해 하위 도메인을 디렉터리에 매핑하는 일반적인 시나리오를 구현합니다. 이렇게 하면 하위 도메인을 사용하여 사이트의 다른 디렉터리에 있는 콘텐츠에 액세스할 수 있습니다. 예를 들어 사용자는 대신 으로 http://blog.mysite.com
이동하거나 대신 http://mysite.com/blog
로 검색할 http://forum.mysite.com
http://mysite.com/forum
수 있습니다.
시나리오를 설정하려면 다음 단계를 수행합니다.
폴더에 "blog" 및 "forum"이라는 두 개의 폴더를 만듭니다
%SystemDrive%\inetpub\wwwroot\
.다음 asp.net 코드를 복사하여 article.aspx라는 파일의
%SystemDrive%\inetpub\wwwroot\blog
폴더에 넣습니다.<%@ 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> <p>This page is located in blog subdomain.</p> <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>
다음 asp.net 코드를 복사하여 forum.aspx라는 파일의
%SystemDrive%\inetpub\wwwroot\forum
폴더에 배치합니다.<%@ 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> <p>This page is located in forum subdomain.</p> <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>
에 있는
%SystemDrive%\windows\system32\drivers\etc\
"hosts"라는 파일을 열고 해당 파일에 다음 두 줄을 추가합니다.127.0.0.1 forum_localhost 127.0.0.1 blog_localhost
이러한 줄을 추가한 후 웹 브라우저를 열고 브라우저로 이동하여 http://blog_localhost/blog/article.aspxhttp://forum_localhost/forum/forum.aspx 페이지가 브라우저에서 올바르게 렌더링되었는지 확인합니다.
전역 다시 쓰기 규칙 만들기
먼저 호스트 헤더를 기반으로 URL을 다시 작성하는 전역 다시 쓰기 규칙을 만듭니다. 예를 들어 에 대한 요청이 이루어진 http://blog_localhost/article.aspx 경우 규칙은 URL 경로를 "/blog/article.aspx"로 변경합니다.
IIS 관리자에서 URL 다시 쓰기 UI를 사용하여 전역 규칙을 만들려면 다음 단계를 수행합니다.
- IIS 관리자로 이동
- 탐색 트리 보기에서 서버 노드를 선택합니다.
- 기능 보기에서 "URL 다시 쓰기 모듈"을 클릭합니다.
- "작업" 창에서 "규칙 추가..."를 클릭합니다.
- "규칙 추가" 대화 상자에서 "빈 규칙"을 선택하고 "확인"을 클릭합니다.
이제 실제 다시 쓰기 규칙을 정의해야 합니다. URL에서 모듈 다시 쓰기 규칙은 네 가지 필수 정보를 지정하여 정의됩니다.
- 규칙의 이름
- URL 문자열 일치에 사용할 패턴
- 선택적 조건 집합
- 패턴이 일치하고 모든 조건 검사가 성공했는지를 수행하는 작업
규칙 이름 지정
"이름" 텍스트 상자에 규칙을 고유하게 식별하는 이름(예: "하위 도메인 매핑")을 입력합니다.
패턴 정의
"패턴" 텍스트 상자에 다음 문자열을 입력합니다.
(.*)
이 문자열은 패턴이 빈 문자열을 포함하여 모든 URL 문자열과 일치하고 백 참조에서 일치하는 문자열을 캡처할 것을 지정하는 정규식입니다.
조건 정의
"조건 추가" 단추를 클릭합니다.
"추가..."를 클릭합니다. 단추를 눌러 조건을 정의하기 위한 대화 상자를 표시합니다.
"조건 입력:"에 "{HTTP_HOST}" 문자열을 입력합니다. 이렇게 하면 http 요청 호스트 헤더 값을 조건에 대한 입력으로 사용하도록 URL 다시 쓰기 모듈이 구성됩니다.
드롭다운 콤보 상자에서 "패턴 일치"를 선택합니다.
"패턴" 텍스트 상자에 "^([^_]+)_[^_]+"를 입력합니다. 이 정규식은 만든 도메인(blog_localhost 및 forum_localhost)과 일치시키는 데 사용되며 "_" 기호 앞의 문자열 부분을 백 참조로 캡처합니다. 예를 들어 문자열 "blog_localhost"의 경우 백 참조에 "블로그"를 유지합니다.
모든 속성을 지정한 후에는 조건 대화 상자가 다음과 같이 표시됩니다.
확인을 클릭하여 조건을 저장하고 "규칙 추가" UI로 돌아갑니다.
작업 정의
만드는 규칙은 URL을 다시 작성해야 하므로 "작업" 그룹 상자 내에서 "다시 쓰기" 작업 유형을 선택합니다. "URL 다시 쓰기:" 텍스트 상자에 다음 문자열을 입력합니다.
{C:1}/{R:1}
이 문자열은 입력 URL을 다시 작성할 내용을 지정합니다. {C:1} 조건에 대한 백 참조는 폴더의 이름으로 사용되며 규칙 패턴에서 캡처된 항목은 {R:1} 규칙에 대한 백 참조를 사용하여 유지됩니다.
다른 모든 설정에 대한 기본값을 그대로 둡니다. "규칙 편집" UI는 다음 페이지로 표시됩니다.
오른쪽에서 "적용" 작업을 클릭하여 규칙을 저장합니다.
이 규칙이 적용되는 방식을 이해하려면 HTTP 클라이언트가 이 URL을 요청할 때 URL 다시 쓰기 모듈에서 수행하는 단계를 살펴보겠습니다.
http://blog_localhost/article.aspx?id=323
:
- URL 다시 쓰기 모듈은 "article.aspx?id=323"을 규칙에 대한 입력 URL로 전달하고 규칙 패턴과 성공적으로 일치시키고 규칙 백 참조 {R:1}에 캡처합니다.
- 호스트 헤더 값("blog_localhost")이 정규식 "^([^_]+)_[^_]+"과 성공적으로 일치하고 결과적으로 "블로그"가 조건 백 참조 {C:1}에 캡처됩니다.
- 대체 문자열 {C:1}/{R:1}에 따라 URL은 "blog/article.aspx?id=323"으로 다시 작성됩니다.
규칙 테스트
규칙이 URL을 올바르게 다시 작성하는지 테스트하려면 인터넷 브라우저를 열고 다음 URL을 요청합니다.
http://blog_localhost/article.aspx?id=123
URL 다시 쓰기 모듈이 URL을 변경하고 "블로그" 디렉터리에서 Article.aspx 페이지를 연 것을 볼 수 있습니다. URL 다시 쓰기 모듈에서 변경한 내용은 호스트 헤더에서 추출된 정보를 기반으로 합니다.
마찬가지로 요청 http://forum_localhost/forum.aspx?id=345
하면 URL이 /forum/forum.aspx?id=345로 다시 작성됩니다.
분산 규칙 만들기
방금 만든 전역 규칙은 호스트 헤더에서 추출된 정보를 기반으로 요청을 폴더에 매핑하는 데 사용되었습니다. 이제 쿼리 문자열 매개 변수 없이 URL을 가질 수 있는 분산 규칙을 만듭니다. 분산 규칙은 전역 규칙에 의해 이미 수정된 URL을 입력으로 사용하고 추가 수정을 수행합니다. 특히 다음 사항에 주의하십시오.
- "blog" 폴더의 다시 쓰기 규칙은 URL 경로를 "article/234/some-title"에서 "article.aspx?id=234&title=some-title"으로 다시 작성합니다.
- "forum" 폴더의 다시 쓰기 규칙은 URL 경로를 "topic/123/some-topic-title"에서 "forum.aspx?topic=some-topic-title&id=123"으로 다시 작성합니다.
로컬 규칙은 IIS 관리자를 사용하거나 web.config 파일을 편집하여 만들 수 있습니다. 데모를 위해 web.config 파일을 수동으로 편집하여 규칙을 만듭니다.
분산 다시 쓰기 규칙을 만들려면 다음을 수행합니다.
폴더에 빈 web.config 파일을 만듭니다
%SystemDrive%\inetpub\wwwroot\**blog**
. 텍스트 편집기에서 열고 다음 XML 코드를 붙여넣습니다.<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Rewrite to article.aspx"> <match url="^article/([0-9]+)/([_0-9a-z-]+)"/> <action type="Rewrite" url="article.aspx?id={R:1}&title={R:2}"/> </rule> </rules> </rewrite> </system.webServer> </configuration>
폴더에 빈 web.config 파일을 만듭니다
%SystemDrive%\inetpub\wwwroot\**forum**
. 텍스트 편집기에서 열고 다음 XML 코드를 붙여넣습니다.<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Rewrite to forum.aspx"> <match url="^topic/([0-9]+)/([_0-9a-z-]+)"/> <action type="Rewrite" url="forum.aspx?topic={R:2}&id={R:1}"/> </rule> </rules> </rewrite> </system.webServer> </configuration>
전역 및 분산 규칙 모두 테스트
모든 규칙이 올바르게 작동하는지 테스트하려면 웹 브라우저를 열고 를 요청합니다 http://blog_localhost/article/234/some-title
. 브라우저의 응답은 URL이 먼저 전역 규칙에 의해 변경된 다음 분산 규칙에 의해 추가로 수정되었음을 나타내야 합니다.
마찬가지로 를 요청하는 http://forum_localhost/topic/123/some-topic-title
경우 URL 다시 쓰기 모듈이 요청된 URL 문자열을 "/forum/forum.aspx?topic=some-topic-title&id=123"으로 변경하는 것을 볼 수 있습니다.
요약
이 자습서에서는 전역 규칙을 사용하여 하위 도메인 매핑 시나리오를 구현한 다음 분산 규칙을 사용하여 해당 폴더의 웹 페이지에 대해 사용자에게 친숙한 URL을 사용하도록 설정했습니다.