Share via


ASP.NET Web Forms 대한 URL 다시 쓰기

작성자 : Ruslan Yakushev

ASP.NET 애플리케이션에서 IIS URL 다시 쓰기 모듈을 사용하는 경우 다시 작성된 URL을 사용하여 웹 애플리케이션의 올바른 동작을 확인하는 것이 중요합니다. 이 문서에서는 URL 다시 쓰기가 ASP.NET 웹 애플리케이션에 영향을 줄 수 있는 시나리오와 잠재적인 문제에 대한 해결 방법을 설명합니다.

목차

Form 요소에 대한 포스트백 URL 설정

ASP.NET Web Forms 포스트백을 광범위하게 사용하므로 ASP.NET 페이지에 대한 URL 다시 쓰기를 수행하는 것이 다소 까다로울 수 있습니다. 페이지에 하나 이상의 웹 서버 컨트롤이 포함된 경우 ASP.NET 페이지를 렌더링할 때 HTML 양식 요소의 action 특성을 설정하여 양식 요소가 있는 페이지, 즉 자체를 가리킵니다. 해당 페이지에 URL 다시 쓰기를 사용하는 경우 작업 특성은 브라우저에서 요청한 URL이 아니라 다시 작성된 URL을 가리킵니다. 이렇게 하면 브라우저는 포스트백이 발생할 때마다 주소 상자에 다시 작성된 URL을 표시합니다.

작업 특성이 잘못된 URL을 가리키지 않도록 하려면 페이지의 HtmlForm instance Action 속성을 브라우저에서 요청한 포스트백 URL로 설정할 수 있습니다. HttpRequest.RawUrl 속성을 사용하여 에서 해당 URL을 가져올 수 있습니다. 다음 예제에서는 ASP.NET 페이지를 수정하여 작업 URL을 설정하는 방법을 보여 줍니다.

protected void Page_Load(object sender, EventArgs e) 
{ 
    form1.Action = Request.RawUrl; 
}

참고

HtmlForm.Action 속성은 .NET Framework 버전 3.5 SP1부터 사용할 수 있습니다.

ASP.NET master 페이지를 사용하는 경우 master 페이지의 Page_Load 메서드에 코드를 추가하여 해당 master 페이지를 사용하는 모든 페이지의 포스트백 작업 URL을 설정할 수 있습니다.

AJAX UpdatePanel 컨트롤에 대한 URL 다시 쓰기

URL 다시 쓰기 모듈을 사용하여 하나 이상의 UpdatePanel 컨트롤이 포함된 페이지의 URL을 다시 작성하는 경우 컨트롤은 해당 UpdatePanel 컨트롤에서 수행하는 모든 작업에 대해 다시 작성된 URL을 사용합니다. 이로 인해 UpdatePanel 컨트롤의 컨트롤이 제대로 작동하지 않을 수 있습니다. 특히 URL 다시 쓰기가 요청된 URL의 디렉터리 계층 구조를 변경하는 경우 더욱 그렇습니다. 예를 들어 URL 다시 쓰기 모듈을 사용하여 /Products/Hardware를 /Products.aspx로 다시 작성하는 경우 UpdatePanel 컨트롤은 UpdatePanel 컨트롤 내의 모든 작업에 대해 /Products/Hardware/Products.aspx URL을 사용합니다. 이로 인해 스크립트 오류가 발생합니다.

이러한 일이 발생하지 않도록 하려면 이전 섹션의 Form 요소에 대한 Postback URL 설정에 설명된 대로 페이지의 HtmlForm instance Action 속성을 설정합니다.

웹 서버 컨트롤에서 ~ 연산자 사용

ASP.NET 웹 서버 컨트롤에서 ~ 연산자를 사용하여 경로를 설정해야 할 때 애플리케이션 디렉터리의 루트를 참조할 수 있습니다. 그러나 URL 다시 쓰기가 요청된 URL의 디렉터리 계층 구조를 변경하는 경우 ~ 연산자를 사용하여 지정된 링크가 잘못 해결될 수 있습니다. 예를 들어 app1이라는 웹 애플리케이션의 루트에 있는 Default.aspx 페이지에 다음 이미지 컨트롤이 포함되어 있다고 상상해 보세요.

<asp:Image runat="server" ImageUrl="~/Images/MyImage.gif" />

URL 다시 쓰기가 URL을 에서 http://localhost/app1/folder/filehttp://localhost/app1/default.aspx로 변경하는 경우 ~ 연산자를 사용하여 지정된 링크는 /app1 폴더를 기준으로 하는 다시 작성된 URL 경로를 기준으로 확인됩니다. 다음 예제에서는 img 요소에 대한 결과 HTML 태그를 보여 줍니다.

<img src="Images/MyImage.gif" ... >

브라우저가 를 요청 http://localhost/app1/folder/file했기 때문에 에서 http://localhost/app1/folder/Images/MyImage.gif이미지를 가져오려고 시도합니다. 이로 인해 404(파일을 찾을 수 없음) 오류가 발생합니다.

IIS용 URL 다시 쓰기 모듈에는 이 동작을 수정하는 ASP.NET 대한 업데이트가 포함되어 있습니다. 업데이트로 인해 웹 서버 컨트롤의 ~ 연산자가 원래 요청된 URL을 기준으로 확인됩니다. 이전 예제에서 응답의 HTML 태그에는 다음 태그와 같이 img 요소에 대한 올바른 URL 경로가 포함됩니다.

<img src="../Images/MyImage.gif" ... >

ASP.NET 대한 업데이트는 .NET Framework 3.5 SP1 이상에만 적용됩니다. 업데이트를 받으려면 .NET Framework 버전 3.5 SP1로 업그레이드한 다음 IIS URL 다시 쓰기 모듈 설치 관리자를 실행하여 ASP.NET 업데이트를 설치합니다.

URL 및 사이트 탐색 컨트롤 다시 쓰기

ASP.NET 사이트 맵을 사용하여 사이트 탐색 API 및 사이트 탐색 컨트롤이 실제 사이트 구조 대신 논리적인 사이트 구조를 노출할 수 있도록 웹 사이트의 구조를 설명할 수 있습니다. 사이트 탐색을 사용하는 ASP.NET 애플리케이션에서 URL 다시 쓰기 모듈을 사용하는 경우 일반적으로 공용 또는 가상 URL을 사용하는 논리적 사이트 구조 측면에서 탐색 컨트롤이 작동하도록 합니다.

예를 들어 다음 예제와 같이 사이트맵을 정의할 수 있습니다.

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
  <siteMapNode url="~/Products/" title="Products" description="Products Home Page">   
    <siteMapNode url="~/Products/Hardware/" title="Hardware" description="Hardware Products" /> 
    <siteMapNode url="~/Products/Software/" title="Software" description="Software Products" />
  </siteMapNode>
</siteMap>

그런 다음, 다음 다시 쓰기를 수행하는 다시 쓰기 규칙을 정의할 수 있습니다.

  • /Products/ to /Products.aspx
  • /Products/Hardware에서 /Products.aspx?category=Hardware
  • /Products/Software에서 /Products.aspx?category=Software로

이러한 가상 URL을 사용하여 사이트맵을 정의하면 SystemWeb.SiteMap 클래스가 제대로 작동하지 않을 수 있습니다. ASP.NET 페이지에서 SiteMap.CurrentNode 속성에 액세스하려고 하면 속성에 null이 포함될 수 있습니다. 이로 인해 SiteMapPath 및 메뉴와 같은 사이트 탐색 컨트롤이 잘못 작동할 수 있습니다.

IIS용 URL 다시 쓰기 모듈에는 다시 작성된 가상 URL로 작업할 수 있도록 탐색 컨트롤을 수정하는 ASP.NET 대한 업데이트가 포함되어 있습니다. 이 업데이트를 사용하면 SiteMap.CurrentNode 속성이 현재 요청된 가상 URL에 해당하는 SiteMapNode를 참조합니다.

ASP.NET 대한 업데이트는 .NET Framework 3.5 SP1 이상에만 적용됩니다. 업데이트를 받으려면 .NET Framework 버전 3.5 SP1로 업그레이드한 다음 IIS URL 다시 쓰기 모듈 설치 관리자를 실행하여 ASP.NET 업데이트를 설치합니다.

ASP.NET 웹 리소스에 대한 요청 다시 작성 방지

ASP.NET 기반 웹 애플리케이션은 WebResources.axd 파일을 요청하여 어셈블리 리소스를 검색하고 웹 브라우저에 제공하는 경우가 많습니다. WebResources.axd가 요청될 때 ASP.NET 동적으로 콘텐츠를 생성하기 때문에 서버에 이러한 파일이 없습니다. 따라서 요청된 URL이 웹 서버 파일 시스템의 파일 또는 폴더에 해당하지 않는 경우에만 다시 쓰거나 리디렉션하는 URL 다시 쓰기 규칙이 있는 경우 해당 규칙은 실수로 WebResources.axd에 대한 요청을 다시 작성하여 애플리케이션을 중단할 수 있습니다.

다시 쓰기 규칙에 조건을 하나 더 추가하면 이 문제를 쉽게 방지할 수 있습니다.

<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
  <match url="^([^/]+)/?$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    <!--  The following condition prevents rule from rewriting requests to .axd files -->
    <add input="{URL}" negate="true" pattern="\.axd$" />
  </conditions>
  <action type="Rewrite" url="article.aspx?p={R:1}" />
</rule>