학습 노트 42 (asp. net 의 주소 재 작성 URL Rewriter 실현 원리 및 코드 예제)

195498 단어 urlrewrite
(주: 본 고 는 인터넷 에서 정리)
개술
방문 자 입력:http://wu-jian.cnbolgs.com/default.aspx실제 요청 과 응답 주 소 는:http://www.cnblogs.com/wu-jian/default.aspx이것 이 바로 UrlRewrite 로 2 급 도 메 인 네 임 기능 을 실현 하 는 것 을 제외 하고 사용자 의 입력 주소, SEO, 사이트 버 전 교체 업데이트 등 여러 가지 측면 에서 중요 한 역할 을 발휘 한다.
마이크로소프트 는. net framework 1.1 에서 개발 자 들 이 UrlRewriter 를 쉽게 실현 할 수 있 도록 URL Rewriter 라 는 작은 도 구 를 제공 한 적 이 있 습 니 다. 다운로드 주 소 는 다음 과 같 습 니 다.http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi
본 고 는 URL Rewriter 를 예 로 들 어. net framework 2.0 의 환경 에서 작은 부분 을 최적화 조정 하여 여러분 들 이 학습 하고 참고 할 수 있 도록 하 였 으 며 능력 이 유한 하 므 로 부족 한 점 은 제때에 지적 해 주 십시오.본 고 는 독자 가 URLRewriter, ASP. net 의 Http 라인 에 대해 어느 정도 알 고 있다 고 가정 합 니 다. 그렇지 않 으 면 관련 자 료 를 찾 아 보 세 요.
배치
URL Rewriter 는 웹. config 에서 사용자 정의 설정 과 정규 표현 식 을 결합 하여 URL 재 작성 을 실현 합 니 다.
사용자 정의 노드 설명:

  
  
< configSections >
< section name ="RewriterConfig"
type
="PaoTiao.PTRewriter.Config.RewriterConfigSerializerSectionHandler, PaoTiao.PTRewriter" />
</ configSections >


사용자 정의 노드 설정 항목:

  
  
< RewriterConfig >
< Rules >
< RewriterRule >
< LookFor > ^http://([a-zA-Z0-9]{4,16}).cnblogs.com/default.aspx$ </ LookFor >
< SendTo > /$1/default.aspx </ SendTo >
</ RewriterRule >

< RewriterRule >
< LookFor > ^http://www.cnblogs.com/([a-zA-Z0-9]{4,16})/$ </ LookFor >
< SendTo > /test/url.aspx?p=$1 </ SendTo >
</ RewriterRule >
</ Rules >
</ RewriterConfig >


위 에서 제 가 두 가지 규칙 을 설정 한 것 처럼 실례 를 들 어 첫 번 째 는 다음 과 같 습 니 다.http://wu-jian.cnblogs.com 다시 쓰기: / wu - jian / default. aspx
두 번 째 장군:http://www.cnblogs.com/wu-jian 다시 쓰기: / test / url. aspx? p = wu - jian
그러나 마이크로소프트 URL Rewriter Lookfor 는 도 메 인 이름 위 치 를 지원 하지 않 습 니 다. 루트 디 렉 터 리 다음 에 만 글 을 쓸 수 있 습 니 다. 원본 DEMO 의 한 단락 을 캡 처 했 습 니 다.

  
  
< RewriterRule >
< LookFor > ~/(\d{4})/(\d{2})/(\d{2})\.aspx </ LookFor >
< SendTo > ~/ShowBlogContent.aspx?year=$1 &amp; month=$2 &amp; day=$3 </ SendTo >
</ RewriterRule >


2 급 도 메 인 이나 사용자 정의 수준 이 높 은 rewrite 를 사용 해 야 할 때 URL Rewriter 는 지원 되 지 않 기 때문에 원본 코드 를 일부 최적화 시 켰 습 니 다. 일치 와 재 작성 은 Lookfor 와 SendTo 의 원본 표현 식 을 사용 하고 스마트 한 교체 와 수정 을 하지 않 습 니 다.사실 마이크로소프트 제품 에서 이런 '사족' 의 그림 자 를 발견 할 수 있 는 경우 가 많다.
일치 와 교체 에 대해 사실은 정규 표현 식 의 '역방향 인용' 원 리 를 응용 한 것 입 니 다. 제 블 로그 에 코드 예제 가 있 고 정규 에 익숙 하지 않 은 친 구 는 알 수 있 습 니 다. 여 기 는 상세 하 게 설명 하지 않 습 니 다.
3. 소스 코드 분석
사용자 정의 설정 에 접근 하 는 클래스:

  
  
using System;
using System.Configuration;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.XPath;

namespace PaoTiao.PTRewriter.Config
{
/// <summary>
/// IConfigurationSectionHandler ,
/// </summary>
public class RewriterConfigSerializerSectionHandler : IConfigurationSectionHandler
{
/// <summary>
///
/// ConfigurationManager.GetSection()
/// </summary>
public object Create( object parent, object configContext, System.Xml.XmlNode section)
{
XmlSerializer ser
= new XmlSerializer( typeof (RewriterConfiguration));
return ser.Deserialize( new XmlNodeReader(section));
}

}
// end class
}


이전에 WEB 프로그램 을 썼 는데 사용자 정의 노드 를 거의 사용 하지 않 았 습 니 다. 윈도 서 비 스 를 쓸 때 까지 app. config 를 사 용 했 습 니 다. 사용자 정의 노드 를 읽 으 려 면 IConfiguration Section Handler 인 터 페 이 스 를 실현 해 야 합 니 다.

  
  
using System;
using System.Web;
using System.Web.Caching;
using System.Configuration;
using System.Xml.Serialization;

namespace PaoTiao.PTRewriter.Config
{
[Serializable()]
[XmlRoot(
" RewriterConfig " )]
public class RewriterConfiguration
{
private RewriterRuleCollection rules;

/// <summary>
/// web.config , Cache IO
/// </summary>
/// <returns></returns>
public static RewriterConfiguration GetConfig()
{
//
if (HttpContext.Current.Cache[ " RewriterConfig " ] == null )
HttpContext.Current.Cache.Insert(
" RewriterConfig " , ConfigurationManager.GetSection( " RewriterConfig " ));

return (RewriterConfiguration)HttpContext.Current.Cache[ " RewriterConfig " ];
}

public RewriterRuleCollection Rules
{
get { return rules; }
set { rules = value; }
}

}
// end class
}


저 는 UrlRewrite 를 사용 하고 싶 은 사이트 의 대부분 은 대중 사용 자 를 대상 으로 하 는 것 입 니 다. 대중 사용 자 를 대상 으로 하 는 것 은 큰 데이터 와 병행 에 직면 하고 있 습 니 다. 누구 도 모든 요청 에 웹. config 를 한 번 읽 어 주 고 싶 지 않 습 니 다. 그러면 여기 서 Cache 를 사용 하 는 것 이 현명 합 니 다.또한 만 료 된 ConfigurationSettings. GetConfig () 방법 을 ConfigurationManager. GetSection () 방법 으로 바 꾸 었 습 니 다.
다음 두 가지 유형 은 유사 한 Model 기능 을 완성 합 니 다.

  
  
using System;
using System.Collections;

namespace PaoTiao.PTRewriter.Config
{
/// <summary>
///
/// </summary>
[Serializable()]
public class RewriterRuleCollection : CollectionBase
{
/// <summary>
///
/// </summary>
/// <param name="r"> RewriterRule </param>
public virtual void Add(RewriterRule r)
{
this .InnerList.Add(r);
}

/// <summary>
///
/// </summary>
public RewriterRule this [ int index]
{
get { return (RewriterRule) this .InnerList[index]; }
set { this .InnerList[index] = value; }
}

}
// end class
}


  
  
using System;

namespace PaoTiao.PTRewriter.Config
{
/// <summary>
///
/// </summary>
[Serializable()]
public class RewriterRule
{
private string mLookFor;
private string mSendTo;

/// <summary>
///
/// </summary>
public string LookFor{
get { return this .mLookFor; }
set { this .mLookFor = value; }
}

/// <summary>
///
/// </summary>
public string SendTo{
get { return this .mSendTo; }
set { this .mSendTo = value; }
}

}
// end class
} // end namespace


HttpModule 을 사용 하여 주소 재 작성

  
  
using System;
using System.Web;

namespace PaoTiao.PTRewriter
{
/// <summary>
/// IHttpModule
/// </summary>
public abstract class BaseModuleRewriter : IHttpModule
{
public virtual void Dispose() { }

public virtual void Init(HttpApplication app)
{
app.BeginRequest
+= new EventHandler( this .BaseModuleRewriter_BeginRequest);
}

protected virtual void BaseModuleRewriter_BeginRequest( object sender, EventArgs e)
{
HttpApplication app
= (HttpApplication)sender;
Rewrite(app);
}

/// <summary>
///
/// </summary>
/// <param name="app"></param>
protected abstract void Rewrite(HttpApplication app);

}
// end class
}


Http 모듈 에서 핵심 논리 처 리 를 합 니 다. 원본 코드 는 AuthorizeRequest 이벤트 에 있 습 니 다. 여기 서 BeginRequest 이 벤트 를 사 용 했 습 니 다.
추상 적 인 방법 Rewrite 의 실현URL 재 작성 은 사실 하나의 핵심 방법 인 HttpContext. RewritePath 를 발견 할 수 있 습 니 다.
MSDN 에서 이 방법 에 대한 설명 을 보십시오. 내부 재 작성 경 로 를 지정 하고 요청 한 URL 이 자원 의 내부 경로 와 다 를 수 있 도록 합 니 다.

  
  
using System;
using System.Text.RegularExpressions;
using System.Configuration;

using System.IO;

namespace PaoTiao.PTRewriter
{
public class ModuleRewriter : BaseModuleRewriter
{
/// <summary>
///
/// </summary>
/// <param name="app"></param>
protected override void Rewrite(System.Web.HttpApplication app)
{
//
app.Context.Trace.Write( " ModuleRewriter " , " Entering ModuleRewriter " );

//
Config.RewriterRuleCollection rules = Config.RewriterConfiguration.GetConfig().Rules;

for ( int i = 0 ; i < rules.Count; i ++ )
{
string lookFor = rules[i].LookFor;
Regex reg
= new Regex(lookFor, RegexOptions.IgnoreCase);

if (reg.IsMatch(app.Request.Url.ToString()))
{
// URL
string sendToUrl = reg.Replace(app.Request.Url.ToString(), rules[i].SendTo);

//
app.Context.Trace.Write( " ModuleRewriter " , " Rewriting URL to " + sendToUrl);
//
app.Context.RewritePath(sendToUrl);

// Temp code for debug
// using (StreamWriter sw = new StreamWriter(@"c:\test\rr.txt", true, System.Text.Encoding.UTF8))
// {
// sw.WriteLine(app.Request.Url.ToString());
// sw.WriteLine("--------------------------------------");
// sw.Close();
// }

// for
break ;
}
}

//
app.Context.Trace.Write( " ModuleRewriter " , " Exiting ModuleRewriter " );
}

}
// end class
}


마지막 으로 웹. config 에 사용자 정의 Http 모듈 을 등록 합 니 다.

  
  
< httpModules >
< add name ="ModuleRewriter" type ="PaoTiao.PTRewriter.ModuleRewriter, PaoTiao.PTRewriter" />
</ httpModules >


응용
앞의 예시 로 돌아 가면,http://wu-jian.cnblogs.com --> /wu-jian/default.aspx
wu - jian 이 있 는 위 치 는 도 메 인 이름 접두사 또는 2 급 도 메 인 이름 입 니 다. 이것 은 DNS 에서 *. cnblogs. com 의 일반적인 해석 을 해 야 합 니 다.
두 번 째 예 는 디 렉 터 리 를 특정한 주소 로 해석 하 는 것 입 니 다.http://www.cnblogs.com/wu-jian --> /test/url.aspx?p=wu-jian
IIS 가 이러한 형식의 요청 을. net 프로 세 스에 맡 기 는 것 이 관건 임 이 분명 하 다. 일단. net framwork 에 들 어가 면 우리 마음대로 할 수 있다.OK, 다음 과 같은 조작 과정 을 통 해:
IIS 관리 -- > 사이트 -- > 속성 -- > 홈 디 렉 터 리 탭 -- > 설정 -- > 어댑터 프로그램 맵 -- > 삽입
1. C: \ \ WINDOWS \ Microsoft. NET \ \ Framework \ \ v 2.0.50727 \ \ aspnet 선택isapi.dll
2. '파일 이 존재 하 는 지 확인' 을 선택 하지 않 음
学习笔记42(asp.net的地址重写URLRewriter实现原理及代码示例)
총화
Url Rewrite 에 대한 소개 가 많 고 제3자 구성 요소 도 많 습 니 다. 예 를 들 어 isapi rewrite, 예 를 들 어 Irf 등 이 있 습 니 다. 그들 은 IIS 바 텀 인 터 페 이 스 를 통 해 실현 되 기 때문에 효율 이 더욱 높 습 니 다. Url Rewriter 는. Net 프로 세 스 에서 실현 되 었 고 마이크로소프트 가 Framework 1.1 시대 에 제공 한 해결 방안 이기 도 합 니 다. 사실은 이 글 도 몇 년 전에 쓴 것 입 니 다. 다만 최근 에 IIRF 를 바 꾸 려 고 합 니 다.. Net Framework 4.0 에서 기한 이 지난 방법 을 제시 하 는 것 을 보면 서 시간 흐름 에 감탄 하지 않 을 수 없다. 예전 에 시간 과 정력 을 들 였 던 것들 을 정리 하고 잊 어 버 리 는 동시에 필요 한 사람 에 게 도움 을 주 고 싶다.

좋은 웹페이지 즐겨찾기