Asp.Net 2.0의 새로운 기능은 내장된 URL 재작성 지원입니다. 이 새로운 기능을 조사했을 때 정규식 지원이 부족하다는 것을 알았습니다. 이것이 바로 Url Mapper의 핵심입니다. ScottGlu는 자신의 블로그에서 Asp.Net 팀이 이 기능을 구현하지 않은 이유를 설명합니다. 기본적으로 그들은 완전한 기능을 갖춘 버전이 차기 IIS 7.0의 새로운 기능, 특히 모든 콘텐츠 유형(이미지 및 디렉터리)에 대한 지원을 활용하기를 원한다는 것을 깨달았습니다.
어쨌든 Asp.Net에서 Regex 지원을 통해 Url Rewriting 모듈을 구현하는 것은 정말 간단합니다. 이를 위해 빠르고 간단한 HttpModule을 작성했습니다. 모든 마법은 HttpModule 내의 몇 줄 내에서 수행됩니다.
1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
2 문자열 strPath = HttpContext.Current.Request.Url.AbsolutePath;
3 UrlRedirection oPR = new UrlRedirection();
4 문자열 strURL = strPath;
5 문자열 strRewrite = oPR.GetMatchingRewrite(strPath);
6 if (!String.IsNullOrEmpty(strRewrite)) {
7 strURL = strRewrite;
8 } 그 외 {
9 strURL = strPath;
10 }
11 HttpContext.Current.RewritePath("~" + strURL);
12 }
코드는 자명합니다. Asp.Net 엔진에 의해 요청이 처리되면 모듈은 xml에서 정규식 일치를 확인합니다. Web.config를 사용하여 일치 규칙을 저장하는 많은 URL 재작성 엔진을 보았지만 추가 XML 파일을 사용하는 것을 선호합니다. 재작성 규칙 파일은 다음과 같습니다.
1 <?xml version="1.0" 인코딩="utf-8" 독립형="yes"?>
2 <URL 재작성>
3 <규칙 이름="범주 페이지">
4 <url>/([a-zA-Z][w-]{1,149}).aspx</url>
5 <rewrite>/Default.aspx?Category=$1</rewrite>
6 </rule>
7 <규칙 이름="항목 페이지">
8 <url>/([a-zA-Z][w-]{1,149})/([a-zA-Z][w-]{1,149}).aspx</url>
9 <rewrite>/Default.aspx?Category=$1&Item=$2</rewrite>
10 </rule>
11 </urlrewrites>
GetMatchingRewrite() 메서드에 구현된 규칙 일치 루틴은 매우 간단하고 가볍습니다.
1 public string GetMatchingRewrite(string URL) {
2 문자열 strRtrn = "";
3
4 System.Text.RegularExpressions.Regex oReg;
5
6 foreach(규칙의 RedirectRule oRule) {
7
8 Reg = new Regex(oRule.URL);
9 매치 oMatch = oReg.Match(URL);
10
11 if (oMatch.Success) {
12 strRtrn = oReg.Replace(URL, oRule.Rewrite);
13 }
14
15 }
16 strRtrn을 반환합니다.
17 }
이 재작성 엔진을 사용하는 샘플 프로젝트를 업로드했습니다. HttpModule과 해당 도우미 클래스는 App_Code 폴더 안에 있습니다. 이 코드가 도움이 되기를 바랍니다. 질문이 있는 경우 이 항목에 의견을 남겨주세요. 즐거운 코딩하세요!
------------------------------------- -----------------
DEVEL.oping.net에서
게시일: 2006-04-26 14:17 徐灿钊Asp.net专栏 阅读(48) 评论(1) 编辑 收藏 收藏至365Key 所属分类: .net2.0
설명:
# re: ASP.NET 2.0용 Regex를 사용한 URL 재작성(在asp.net2.0中使用正规表达式建立URL중写) 2006-04-26 20:22 | AXii
哈哈哈,测试后 1 public void Rewrite_BeginRequest(개체 전송자, System.EventArgs args)
2 {
3 문자열 appPath = HttpContext.Current.Request.ApplicationPath;
4 HttpContext.Current.Response.Write(appPath + "<br />");
5
6 문자열 strPath = HttpContext.Current.Request.Url.AbsolutePath;
7 HttpContext.Current.Response.Write(strPath + "<br />");
8
9 strPath = strPath.Substring(appPath.Length);
10
11 HttpContext.Current.Response.Write(strPath + "<br />");
12
13 UrlRedirection oPR = new UrlRedirection();
14
15 문자열 strURL = strPath;
16
17 문자열 strRewrite = oPR.GetMatchingRewrite(strPath);
18
19 if (!String.IsNullOrEmpty(strRewrite))
20 {
21 strURL = strRewrite;
22 }
그 외 23개
24 {
25 strURL = strPath;
26 }
27
28 HttpContext.Current.RewritePath("~" + strURL);
29 } 发现这个处理办法对于虚拟路径会出现转发错误,注意第2、3、9行,是我增加的,可以有效的解决虚拟路径问题。
2、无法满足页면回发的问题!如何解决,还请您来修改:):