2014-11-18 1 views

답변

0

이 솔루션은 꽤 강렬하지만, 그럼에도 불구하고 유효한 하나 .

몇 년 전 (우리가 강력히 권장하는 ASP.NET MVC로 이동하기 전에) 우리는 같은 일을했습니다.

먼저 새 ASP.NET 모듈을 만들고 IIS 또는 Web.config에 등록했습니다. 이 모듈은 수신 클라이언트의 요청을 수신합니다.

우리는 HttpModule 우리 자신을 구축하고 우리가 귀하의 경우 http://www.example.com/Men/에, 우리의 유효한 경로를 정의 구성 파일, 함께 작업했다.

그러면 관리자의 목록을 갖게됩니다. 이 관리자은 파이프 라인으로 작동합니다. 각 관리자는 이전 관리자의 출력을 수신합니다.

이 방법에 따라, 우리의 첫 매니저는 우리의 영문을 URL을 사용하여 계속할 수 들어오는 요청의 URL의 재 작성, 그래서 미래의 관리자 (레거시 사람을) 처리 우리 RewriteManager했다. 당신이 볼 수 있듯이, 우리는 정규 표현식 우리의 경로를 정의하고, 라는 이름의 그룹을 사용하여 필요한 정보를 채취

<configuration name="note" 
       mode="1" 
       urlPattern="^https?://(([a-z0-9\-]*\.)?localhost(:[0-9]+)?/((?'note_id'[0-9]+)-?(?'title'.*))$" 
       rewriteUrl="/note.aspx?note_id={note_id}&amp;site={ContextInfo.site}"> 

    <manager type="LaNacion.Framework.Web.Managers.RewriteManager, LaNacion.Framework.Web.Managers"/> 

    <!-- THESE MANAGERS NEED THE ASPX URL, THEY ARE LEGACY MANAGERS --> 
    <manager type="LaNacion.Framework.Web.Managers.FileCacheManager, LaNacion.Framework.Web.Managers"/> 
    <manager type="LaNacion.Hola.Web.Managers.NotaManager, LaNacion.Hola.Web.Managers"/> 
    <manager type="LaNacion.Framework.Web.Managers.OutputImageCacheManager, LaNacion.Framework.Web.Managers"/> 

</configuration> 

: 여기

우리의 모듈의 구성 파일에있는 우리의 경로 중 하나의 예입니다 정규식에
. 우리는 나중에 수집 한 정보를 사용하여 기존 URL을 구축합니다.

당신이 경우, urlPattern 속성과 같습니다

https?://(([a-z0-9\-]*\.)?localhost(:[0-9]+)?/(?'entity'[a-zA-Z]+) 

그리고 rewriteUrl 속성은 수 wourld :

/Category.aspx?cid=c001&cname={entity} 

을 우리는의 RewritePath 방법을 사용하여 URL의 재 작성을 HttpContext 인스턴스 :

System.Web.HttpContext.Current.RewritePath(newUrl); 

향후 관리자는 쿼리 매개 변수를 추출하여 이전처럼 수행 할 수 있으므로 레거시 관리자는 이전과 동일한 방식으로 작동합니다.

나는 나 자신을 충분히 분명하게 만들었고 이것은 당신을 도왔습니다.

0

@ Mati-Cicero에서 설명한 솔루션은 이미 재 작성 규칙을 알고있는 경우 잘 작동합니다. 이 방법으로 가고 싶다면 http://weblogs.asp.net/scottgu/tip-trick-url-rewriting-with-asp-net (오래되었지만 좋은 기사)에서 기사를 제안 할 수도 있습니다.

하지만 당신은 데이터베이스에 저장된 URL로 재 작성하려는 경우, 이것이 내가 제안 것입니다 :

public class DBRewriteModule : IHttpModule 
{ 
    public DBRewriteModule() 
    { 

    } 

    public void Init(HttpApplication context) 
    { 
     context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest); 
    } 

    void context_AuthorizeRequest(object sender, EventArgs e) 
    { 
     Rewriter rw = new Rewriter(); 
     rw.Process(); 
    } 
} 

이처럼 web.config 파일에 추가 :

이 HttpModule을 이런 식으로 작성

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="DBRewrite" type="smartdev.web.Modules.DBRewriteModule" /> 
    </modules> 
</system.webServer> 

그리고 당신의 라이터 CS에서 는 시간해야 파일 같은 비슷한 :

public class Rewriter 
{ 
    public Rewriter() 
    { 
    } 

    public bool Process() 
    { 
     // get path from database based on your original path: 
     // use HttpContext.Current.Request.Path and HttpContext.Current.Request.QueryString 
     string substPath = "...your db logic here ..."; 
     HttpContext.Current.RewritePath(substPath); 
    } 
}