asp.net链接重写

链接重写也叫链接映射,他很重要,我们可以想像一些场景:

一些链接后代很长的各种参数,看起来很不好看

一些winform写死来某个固定链接,想要改版或者切换版本很不方便


这些我们都可以通过链接映射来解决,就好像nginx的映射一样。有几种方式:

  1. 通过Global.asax中的 Application_BeginRequest事件来解决,

  2. 通过编写专门的HttpModule来解决

  3. 通过编写IIS的ISAPIRewrite来解决。


这些方案各有特点,方案1:简单,但不灵活,适合少量重写。方案2:需要编写额外的组件,但是灵活,幸运的是有现成免费的组件已经有人写好了,但是对于IIS5/6,无扩展名的链接这种方案解决不了。

方案3:兼容性强,能解决方案2的无扩展名链接问题,但是这种方案不适用虚拟主机。按我选,主要还是用方案2的多吧。


言归正传,还是将下以上方案的实现吧:


方案1:


在Global.asax中的 Application_BeginRequest事件中,使用HttpContext.RewritePath方法

 void Application_BeginRequest(object sender, EventArgs e) 
 {         
     string fullOrigionalpath = Request.Url.ToString();                  
     if (fullOrigionalpath.Contains("/Products/Books.aspx")) 
     {             
         Context.RewritePath("/Products.aspx?Category=Books");         
     }         
     else if (fullOrigionalpath.Contains("/Products/DVDs.aspx")) 
     {             
         Context.RewritePath("/Products.aspx?Category=DVDs");         
     }     
}


方案2:


编写HttpModule组件,这里我们推荐使用已经编写好的,成熟的Intelligencia.UrlRewriter.dll

<?xml version="1.0" encoding="UTF-8"?> 
    <configuration>   
        <configSections>     
            <section name="rewriter"  requirePermission="false"  type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />   
        </configSections>      
        <system.web>            
            <httpModules>       
                <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />     
            </httpModules>        
        </system.web>   
        <system.webServer>     
            <modules runAllManagedModulesForAllRequests="true">       
                <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" />     
            </modules>     
            <validation validateIntegratedModeConfiguration="false" />   
        </system.webServer>   
        <rewriter>     
            <rewrite url="~/products/(.+)" to="~/products.aspx?category=$1" />
        </rewriter>    
</configuration>


应该注意到system.web和system.webServer两处都注册来模块,这里system.web对应的是经典模式,asp.net内置的IIS也是使用这个配置,system.webServer中对应的是集成模式


方案3:编写ISAPI rewrite


使用ISAPI过滤器来重写URL,Helicon Tech's ISAPI Rewrite他们提供一个99美元(可免费试用30天)的ISAPI URL重写产品完整版,以及一个免费的轻量级版本。



正确地处理CSS和图像引用


一些人在使用地址重写后,能正常工作的页面不正常了,很大的可能性是你使用了相对地址,把地址都改成绝对地址即可。