urlrewrite是什么:使用Microsoft Url Rewrite Module 进行URL重写以及Postback的后保持URL的解决方案

  Microsoft URL Rewrite Module 是微软推出asp.net url重写模块仅支持IIS7要在IIS6上进行url重写可以采用些第 3方模块比如 urlrewriting.net首先去下载Rewrite Module并安装安装完毕后在IIS管理工具中就会出现Url Rewrite图标

image

双击你需要进行URL重写网站WebSite或者虚拟目录URL Rewrite按钮可以进行规则编辑微软重写模块非常强大有很多功能还可以自己写对其进行扩展本文仅介绍最常用和实用利用正则表达式进行重写重写基本原理是当服务器接收到个请求时候利用正则表达式匹配当前输入url然后根据个规则将这个url转换为实际url例如我们要把 localhost/Game/game.aspx?ID=SomeName转换为 localhost/SomeName/,也就是每个游戏名都作为个独立目录于是我们要匹配输入url格式是 ([^/?]*)/$这个正则表达式不包括根目录例如localhost/,它含义是所有非/和?并且以/结尾按照我们要求实际地址是~/Game/game.aspx,参数是正则表达式中第个圆括号匹配到内容实际url中会用到这个正则表达式反向引用反向引用格式是 {R:n}其中n是个整数n等于0时候是整个正则表达式n大于0时候是从左往右数第n个捕获组在这里个例子中我们实际url就是 Game/Game.aspx?ID={R:1}对于正则表达式反向引用不太熟悉微软也提供了个很方便功能Test Pattern

image

在这里可以很方便测试自己正则表达式是否正确完成后点击Apply就完成了条规则设置它会在web.config文件中添加如下内容:

<system.webServer>

<rewrite> <rules> <rule name="Game"> <match url="([^/?]*)/$" /> <action type="Rewrite" url="Game/Game.aspx?ID={R:1}" appendQueryString="false" /> </rule> </rules> </rewrite> </system.webServer>

熟悉话可以直接在web.config中修改比较方便不过VS2008并没有智能提示反而提示rewrite节

当有多条重写规则时候asp.net从上到下依次匹配因此如果我们有如下规则

<rewrite> <rules> <rule name="News"> <match url="News/$" /> <action type="Rewrite" url="Game/News.aspx" appendQueryString="false" /> </rule> <rule name="Game"> <match url="([^/?]*)/$" /> <action type="Rewrite" url="Game/Game.aspx?ID={R:1}" appendQueryString="false" /> </rule> </rules> </rewrite>

那么 localhost/News/将会被转换为 Game/News.aspx 而不是 Game/Game.aspx?ID=News如果对正则表达比较熟悉重写url是没什么困难

最后讲个很困扰问题也就是当实际url中带有参数时候如果页面上某个Control控件执行了postback操作那么浏览器上url又会重新带上参数变成类似http://localhost/goldshop/Aion/?ID=Aion 样子这是IIS实际处理页面还是那个带有参数真实url因此postback时候还是回发到原始url上解决方案主要参考 Jeffery Zhao博文重提URL Rewrite(3):在URL Rewrite后保持PostBack地址主要想法就是利用个Control Adapter改写html中formControl控件输出方式将它action改成我们重写过后url而不再是原始url这个Adapter代码如下:

using .IO; using .Web; using .Web.UI; Sample.Web.UI.Adapters { public FormRewriterControlAdapter : .Web.UI.Adapters.ControlAdapter { protected override void Render(HtmlTextWriter writer) { base.Render( RewriteFormHtmlTextWriter(writer)); } } public RewriteFormHtmlTextWriter : HtmlTextWriter { public RewriteFormHtmlTextWriter(HtmlTextWriter writer) : base(writer) { this.InnerWriter = writer.InnerWriter; } public RewriteFormHtmlTextWriter(TextWriter writer) : base(writer) { this.InnerWriter = writer; } public override void WriteAttribute( name, value, bool fEncode) { (name "action") { HttpContext context = HttpContext.Current; (context.Items["ActionAlreadyWritten"] null) { value = context.Request.RawUrl; context.Items["ActionAlreadyWritten"] = true; } } base.WriteAttribute(name, value, fEncode); } } }

把这个代码放到App_Code文件夹中另外在 App_Browser文件夹中新建个browser文件内容如下:

<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType=".Web.UI.HtmlControls.HtmlForm" adapterType="Sample.Web.UI.Adapters.FormRewriterControlAdapter" /> </controlAdapters> </browser> </browsers>

用来指定Control Adapter这样就OK了
Tags:  urlrewrite作用 urlrewrite规则 urlrewrite urlrewrite是什么

延伸阅读

最新评论

发表评论