快捷搜索:

使用Microsoft Url Rewrite Module 进行URL重写以及Postb

Microsoft URL Rewrite Module 是微软推出的asp.net url重写模块,仅支持IIS7,要在IIS6长进行url重写,可以采纳一些第三方的模块,比如 urlrewriting.net。首先去下载Rewrite Module并安装。安装完毕后,在IIS治理对象中就会呈现Url Rewrite图标。

双击你必要进行URL重写的网站或者虚拟目录的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

在这里可以很方便的测试自己的正则表达式是否精确。完成后,点击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中带有参数的时刻,假如页面上某个控件履行了postback的操作,那么浏览器上的url又会从新带上参数,变成类似http://localhost/goldshop/Aion/?ID=Aion 的样子。这是由于IIS实际处置惩罚的页面照样那个带有参数的真实url,是以postback的时刻照样回发到原始的url上。办理规划主要参考 Jeffery Zhao的博文重提URL Rewrite(3):在URL Rewrite后维持PostBack地址。主要设法主见便是使用一个Control Adapter改写html中form控件的输出要领。将它的action改成我们重写过后的url而不再是原始的url。这个Adapter的代码如下:

using System.IO;

using System.Web;

using System.Web.UI;

namespace Sample.Web.UI.Adapters

{

public class FormRewriterControlAdapter :

System.Web.UI.Adapters.ControlAdapter

{

protected override void Render(HtmlTextWriter writer)

{

base.Render(new RewriteFormHtmlTextWriter(writer));

}

}

public class 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(string name, string value, bool fEncode)

{

if (name == "action")

{

HttpContext context = HttpContext.Current;

if (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="System.Web.UI.HtmlControls.HtmlForm"

adapterType="Sample.Web.UI.Adapters.FormRewriterControlAdapter" />

controlAdapters>

browser>

browsers>

用来指定Control Adapter。这样就OK了。

您可能还会对下面的文章感兴趣: