Microsoft URL Rewrite Module 是微软推出
![](/icons/98789de.gif)
asp.net url重写模块
![](/icons/98789dou.gif)
仅支持IIS7
![](/icons/98789dou.gif)
要在IIS6上进行url重写
![](/icons/98789dou.gif)
可以采用
![](/icons/98789yi.gif)
些第 3方
![](/icons/98789de.gif)
模块
![](/icons/98789dou.gif)
比如 urlrewriting.net
![](/icons/98789dou2.gif)
首先去下载Rewrite Module并安装
![](/icons/98789dou2.gif)
安装完毕后
![](/icons/98789dou.gif)
在IIS管理工具中就会出现Url Rewrite图标
双击你需要进行URL重写
![](/icons/98789de.gif)
网站WebSite或者虚拟目录
![](/icons/98789de.gif)
URL Rewrite按钮
![](/icons/98789dou.gif)
可以进行规则
![](/icons/98789de.gif)
编辑
![](/icons/98789dou2.gif)
微软
![](/icons/98789de.gif)
重写模块非常强大
![](/icons/98789dou.gif)
有很多功能
![](/icons/98789dou.gif)
还可以自己写
![](/icons/98789chengxu.gif)
对其进行扩展
![](/icons/98789dou2.gif)
本文仅介绍最常用和实用
![](/icons/98789de.gif)
利用正则表达式进行重写
![](/icons/98789dou2.gif)
重写
![](/icons/98789de.gif)
基本原理是当服务器接收到
![](/icons/98789yi.gif)
个请求
![](/icons/98789de.gif)
时候
![](/icons/98789dou.gif)
利用正则表达式匹配当前输入
![](/icons/98789de.gif)
url
![](/icons/98789dou.gif)
然后根据
![](/icons/98789yi.gif)
个规则将这个url转换为实际
![](/icons/98789de.gif)
url
![](/icons/98789dou2.gif)
例如
![](/icons/98789dou.gif)
我们要把 localhost/Game/game.aspx?ID=SomeName转换为 localhost/SomeName/,也就是每个游戏名都作为
![](/icons/98789yi.gif)
个独立
![](/icons/98789de.gif)
目录
![](/icons/98789dou2.gif)
于是
![](/icons/98789dou.gif)
我们要匹配输入
![](/icons/98789de.gif)
url
![](/icons/98789de.gif)
格式是 ([^/?]*)/$
![](/icons/98789dou.gif)
这个正则表达式不包括根目录
![](/icons/98789dou.gif)
例如localhost/,它
![](/icons/98789de.gif)
含义是所有非/和?
![](/icons/98789de.gif)
![](/icons/98789zifu.gif)
![](/icons/98789dou.gif)
并且以/结尾
![](/icons/98789dou.gif)
按照我们
![](/icons/98789de.gif)
要求
![](/icons/98789dou.gif)
它
![](/icons/98789de.gif)
实际地址是~/Game/game.aspx,参数是正则表达式中第
![](/icons/98789yi.gif)
个圆括号匹配到
![](/icons/98789de.gif)
内容
![](/icons/98789dou2.gif)
实际
![](/icons/98789de.gif)
url中会用到这个正则表达式
![](/icons/98789de.gif)
反向引用
![](/icons/98789dou2.gif)
反向引用
![](/icons/98789de.gif)
格式是 {R:n}
![](/icons/98789dou.gif)
其中n是
![](/icons/98789yi.gif)
个整数
![](/icons/98789dou2.gif)
n等于0
![](/icons/98789de.gif)
时候是整个正则表达式
![](/icons/98789dou.gif)
n大于0
![](/icons/98789de.gif)
时候是从左往右数第n个捕获组
![](/icons/98789de.gif)
值
![](/icons/98789dou2.gif)
在这里个例子中
![](/icons/98789dou.gif)
我们
![](/icons/98789de.gif)
实际url就是 Game/Game.aspx?ID={R:1}
![](/icons/98789dou2.gif)
对于正则表达式
![](/icons/98789de.gif)
反向引用不太熟悉
![](/icons/98789de.gif)
人
![](/icons/98789dou.gif)
微软也提供了
![](/icons/98789yi.gif)
个很方便
![](/icons/98789de.gif)
功能
![](/icons/98789dou.gif)
Test Pattern
在这里可以很方便
![](/icons/98789de.gif)
测试自己
![](/icons/98789de.gif)
正则表达式是否正确
![](/icons/98789dou2.gif)
完成后
![](/icons/98789dou.gif)
点击Apply
![](/icons/98789dou.gif)
就完成了
![](/icons/98789yi.gif)
条规则
![](/icons/98789de.gif)
设置
![](/icons/98789dou2.gif)
它会在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>
熟悉
![](/icons/98789de.gif)
话可以直接在web.config中修改
![](/icons/98789dou.gif)
比较方便
![](/icons/98789dou2.gif)
不过
![](/icons/98789dou.gif)
VS2008并没有智能提示
![](/icons/98789dou.gif)
反而提示rewrite节
![](/icons/98789cuowu.gif)
![](/icons/98789dou2.gif)
当有多条重写规则
![](/icons/98789de.gif)
时候
![](/icons/98789dou.gif)
asp.net从上到下依次匹配
![](/icons/98789dou.gif)
因此
![](/icons/98789dou.gif)
如果我们有如下规则
<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
![](/icons/98789dou2.gif)
如果对正则表达比较熟悉
![](/icons/98789dou.gif)
重写url是没什么困难
![](/icons/98789de.gif)
![](/icons/98789dou2.gif)
最后讲
![](/icons/98789yi.gif)
个很困扰
![](/icons/98789de.gif)
问题
![](/icons/98789dou.gif)
也就是当实际
![](/icons/98789de.gif)
url中带有参数
![](/icons/98789de.gif)
时候
![](/icons/98789dou.gif)
如果页面上某个Control控件执行了postback
![](/icons/98789de.gif)
操作
![](/icons/98789dou.gif)
那么浏览器上
![](/icons/98789de.gif)
url又会重新带上参数
![](/icons/98789dou.gif)
变成类似http://localhost/goldshop/Aion/?ID=Aion
![](/icons/98789de.gif)
样子
![](/icons/98789dou2.gif)
这是
![](/icons/98789yinwei.gif)
IIS实际处理
![](/icons/98789de.gif)
页面还是那个带有参数
![](/icons/98789de.gif)
真实url
![](/icons/98789dou.gif)
因此postback
![](/icons/98789de.gif)
时候还是回发到原始
![](/icons/98789de.gif)
url上
![](/icons/98789dou2.gif)
解决方案主要参考 Jeffery Zhao
![](/icons/98789de.gif)
博文重提URL Rewrite(3):在URL Rewrite后保持PostBack地址
![](/icons/98789dou2.gif)
主要想法就是利用
![](/icons/98789yi.gif)
个Control Adapter改写html中formControl控件
![](/icons/98789de.gif)
输出方式
![](/icons/98789dou2.gif)
将它
![](/icons/98789de.gif)
action改成我们重写过后
![](/icons/98789de.gif)
url而不再是原始
![](/icons/98789de.gif)
url
![](/icons/98789dou2.gif)
这个Adapter
![](/icons/98789de.gif)
代码如下:
using ![](/icons/98789System.gif)
.IO;
using ![](/icons/98789System.gif)
.Web;
using ![](/icons/98789System.gif)
.Web.UI;
Sample.Web.UI.Adapters
{
public
FormRewriterControlAdapter :
![](/icons/98789System.gif)
.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文件夹中
![](/icons/98789dou.gif)
另外在 App_Browser文件夹中新建
![](/icons/98789yi.gif)
个browser文件
![](/icons/98789dou.gif)
内容如下:
<browsers>
<browser refID="
Default"
>
<controlAdapters>
<adapter controlType="
.Web.UI.HtmlControls.HtmlForm"
adapterType="
Sample.Web.UI.Adapters.FormRewriterControlAdapter"
/>
</controlAdapters>
</browser>
</browsers>
用来指定Control Adapter
![](/icons/98789dou2.gif)
这样就OK了
延伸阅读
最新评论