链接重写也叫链接映射,他很重要,我们可以想像一些场景:
一些链接后代很长的各种参数,看起来很不好看
一些winform写死来某个固定链接,想要改版或者切换版本很不方便
这些我们都可以通过链接映射来解决,就好像nginx的映射一样。有几种方式:
通过Global.asax中的 Application_BeginRequest事件来解决,
通过编写专门的HttpModule来解决
通过编写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和图像引用
一些人在使用地址重写后,能正常工作的页面不正常了,很大的可能性是你使用了相对地址,把地址都改成绝对地址即可。