학습 노트 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
&
month=$2
&
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. '파일 이 존재 하 는 지 확인' 을 선택 하지 않 음
총화
Url Rewrite 에 대한 소개 가 많 고 제3자 구성 요소 도 많 습 니 다. 예 를 들 어 isapi rewrite, 예 를 들 어 Irf 등 이 있 습 니 다. 그들 은 IIS 바 텀 인 터 페 이 스 를 통 해 실현 되 기 때문에 효율 이 더욱 높 습 니 다. Url Rewriter 는. Net 프로 세 스 에서 실현 되 었 고 마이크로소프트 가 Framework 1.1 시대 에 제공 한 해결 방안 이기 도 합 니 다. 사실은 이 글 도 몇 년 전에 쓴 것 입 니 다. 다만 최근 에 IIRF 를 바 꾸 려 고 합 니 다.. Net Framework 4.0 에서 기한 이 지난 방법 을 제시 하 는 것 을 보면 서 시간 흐름 에 감탄 하지 않 을 수 없다. 예전 에 시간 과 정력 을 들 였 던 것들 을 정리 하고 잊 어 버 리 는 동시에 필요 한 사람 에 게 도움 을 주 고 싶다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
jsp URL 재 작성다음은 사용 설명: 1. url rewrite 다운로드, 공식 다운로드 주소: 2. 압축 파일 을 풀 고 압축 파일 을 프로젝트 에 복사 합 니 다 (압축 파일 위치 - > 프로젝트 위치). urlrewrite-2....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.