技巧/诀窍:在ASP.NET中重写URL(3)

作者:Scott Guthrie 来源:Scott Guthrie博客中文版 时间:2007-09-23 12:21:00 

方法三:在IIS7中使用HttpModule 实现无扩展名的URL重写

上述的HttpModule方法在你要重写的URL含有.aspx 扩展名或者包含另一个被设置为ASP.NET处理的扩展名的情形下一切都工作。你这么做的话,不需要任何特定的服务器配置,你只要把你的应用拷贝到远程服务器,它会正常工作的。

但有的时候,你要重写的URL要么拥有一个不为ASP.NET处理的文件扩展名(譬如, .jpg, .gif, 或 .htm),要么根本没有扩展名。譬如,我们也许要把这些URL呈示成公开的产品目录网页(注意,它们没有 .aspx 扩展名):

http://www.store.com/products/Books
http://www.store.com/products/DVDs
http://www.store.com/products/CDs

在 IIS5 和 IIS6 中,使用ASP.NET处理上面这样的URL不是很容易。 IIS 5/6 使得在ISAPI扩展(ASP.NET就是这样一个扩展)里非常难以重写这些类型的URLS。你需要做的是使用ISAPI过滤器在IIS请求管道(request pipeline)的较早期实现重写。我将在下面的第四个方法里示范如何在 IIS5/6 实现这样的重写。

但好消息是, IIS 7.0使得处理这类情形容易之极。你现在可以在 IIS 请求管道的任何地方执行一个HttpModule,这意味着你可以使用上面的URLRewriter 模块 来处理和重写无扩展名的URL(甚至是带有 .asp,.php,或 .jsp 扩展名的URL)。下面示范了你在IIS7中该如何配置:


<?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.webServer>内<modules>部分设置为true的runAllManagedModulesForAllRequests属性。这个属性确保来自Intelligencia的UrlRewriter.Net模块(是在IIS7正式发布前编写的),会被调用,有机会重写到服务器的所有URL请求(包括文件夹)。上面的web.config文件非常酷之处在于:

1) 它在任何IIS7机器上都会工作,你不需要管理员在远程主机上启用任何东西,它也能在设置为中等信任安全等级(medium trust)的共享主机的环境场景下工作。

2) 因为我在<httpModules>和 IIS7 的<modules> 部分同时配置了UrlRewriter,我既能在 VS内置的web服务器(即Cassini)中,也能在IIS7下使用同样的URL重写规则。两者完全支持无扩展名的URL重写。这使得测试和开发非常容易。

IIS 7.0 将在今年的晚些时候作为Windows Longhorn服务器的一部分发布,将在几个星期内随Beta3版本的发布支持go-live许可。由于添加到IIS7中的所有的新宿主(hosting)特性,我们预期主机供应商将会非常快地开始积极提供IIS7账号,这意味着你应该很快就可以开始利用上述的无扩展名的URL重写支持。我们将在 IIS7 RTM 时段里发布一个为微软所支持的URL重写模块,该模板是免费的,你可以在IIS7上使用,并且这模块将对你web服务器上的所有内容的高级URL重写场景提供很好的支持。

样例下载:我建立的一个使用IIS7和UrlRewriter.Net模块展示无扩展名URL重写技术的样例应用可以在这里下载

标签:url,重写,asp.net
0
投稿

猜你喜欢

  • Oracle新建用户、角色,授权,建表空间的sql语句

    2012-07-11 15:39:24
  • 如何避免SQL语句中含有单引号而导致操作失败?

    2009-11-07 18:40:00
  • 如何实现固定长度的自动编号?

    2010-06-03 10:08:00
  • oracle 优化的一点体会

    2009-10-02 17:59:00
  • CSS文件的编码要和页面的编码相一致

    2010-06-06 13:59:00
  • javascript弹出窗口总结

    2009-08-21 12:40:00
  • SQL Server 作业的备份(备份作业非备份数据库)

    2012-07-11 15:58:49
  • ASP--IP字段截取

    2009-05-26 15:47:00
  • JavaScript版的DateAdd、DateDiff、IsDate函数

    2008-01-30 15:35:00
  • PHP工厂模式Factory Pattern的实现及特点

    2023-05-25 05:19:24
  • 常见系统中文字体的英文名

    2008-03-03 12:44:00
  • 全面阐述overflow:hidden属性

    2008-08-18 13:30:00
  • 也谈用户体验

    2009-07-15 12:56:00
  • asp如何同时处理数据库和页面错误?

    2010-06-07 20:58:00
  • asp经典入门教程 在ASP中使用SQL 语句

    2013-06-01 20:23:21
  • 前端也应关注安全

    2009-03-16 17:02:00
  • JavaScript,5种调用函数的方法[译]

    2009-02-24 16:26:00
  • HTML5 声明兼容IE的写法

    2011-06-06 10:34:00
  • Date对象格式化方法

    2009-11-16 13:17:00
  • 通过事务日志解决SQL Server常见四大故障(一)

    2009-03-25 13:46:00
  • asp之家 网络编程 m.aspxhome.com