全面解析ASP.NET2.0下的URL重写
2007-12-22 09:17
393 查看
本文将通过实例比较ASP.NET下的三种典型URL重写方案——ISAPI重写(使用开源组件IIRF),ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中可能遇到的陷阱及处理办法。
下载示例程序源码
需要手动为UrlRewriteSample目录添加一个到http://localhost/UrlRewriteSample的同名虚拟目录,允许匿名访问,并设置目录默认页为default.aspx。
另外,为了启用IIRF的URL重写支持,需要将UrlRewriteSample/bin目录下的IsapiRewrite4.dll添加为IIS默认网站的ISAPI过滤器。
设置重写规则
注意,我们的演示程序中将混合使用三种方式的URL重写,因此,需要为三种实现分别设置一些URL重写规则:
1、IIRF,对于IIRF,对应于IsapiRewrite4.dll,在相同的目录会有一个IsapiRewrite4.ini文件,除了默认的一些设置,我们在文件末尾添加了几条自定义规则如下:
# Custom RewriteRules
RewriteRule ^/UrlRewriteSample/test(.*).aspx /UrlRewriteSample/Default.aspx?page=$1
RewriteRule ^/UrlRewriteSample/folder/(.*).aspx /UrlRewriteSample/Default.aspx?folder=$1
RewriteRule ^/UrlRewriteSample/folder/? /UrlRewriteSample/Default.aspx?folder=default
熟悉正则表达式的朋友应该很容易理解上面这三条规则。
规则一将形如testXXX.aspx这样的页面访问,重写为Default.aspx?page=XXX这样的页面;
规则二将形如folder/XXX.aspx的路径,重写为Default.aspx?folder=XXX这样的页面;
规则三将不带任何文件的folder目录的访问,重写为Default.aspx?folder=default这样的页面。
2、urlMappings是ASP.NET2.0内置支持的URL重写配置块,它应该包含在web.config的<system.web>配置块中。但是,这个内置的URL重写支持不支持正则表达式,因而只能用来实现一对一的路径和页面的重写。urlMappings的配置内容包含在下面的Web.config文件中。
3、NBear.Web.Modules.UrlRewriteModule则是NBear中实现的一个基于HTTPModule的URL重写实现,它允许使用正则表达式来描述重写规则。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="UrlRewriteRules" type="NBear.Web.Modules.UrlRewriteRules, NBear.Web"/>
</configSections>
<UrlRewriteRules>
<Rule key="^/UrlRewriteSample/sample(.*).aspx" value="/UrlRewriteSample/Default.aspx?page=$1" />
<Rule key="^/UrlRewriteSample/section/(.*).aspx" value="/UrlRewriteSample/Default.aspx?section=$1" />
</UrlRewriteRules>
<system.web>
<urlMappings enabled="true">
<add url="~/buildin/Default.aspx" mappedUrl="~/Default.aspx?buildin=default" />
<add url="~/buildin.aspx" mappedUrl="~/Default.aspx?page=buildin" />
<add url="~/notexistfolder/buildin.aspx" mappedUrl="~/Default.aspx?page=buildin" />
</urlMappings>
<compilation debug="true">
<assemblies/>
</compilation>
<httpModules>
<add type="NBear.Web.Modules.UrlRewriteModule, NBear.Web" name="UrlRewriteModule"/>
</httpModules>
</system.web>
</configuration>
注意,代码中包含了urlMappings配置和用于NBear.Web.Modules.UrlRewriteModule重写规则。为了比较着几种重写方案,正则表达式基本上是和前面的IIRF定义中的规则类似的。
页面测试
定义完这些重写规则,我们就可以试着在页面中使用它们了。例如,如果我们写一个测试页面如下:
Default.aspx
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="buildin.aspx">buildin page</a>
<br />
<br />
<a href="notexistfolder/buildin.aspx">buildin page</a>
<br />
<br />
<a href="test1.aspx">test page</a>
<br />
<br />
<a href="sample2.aspx">sample page</a>
<br />
<br />
<a href="folder/1.aspx">folder page</a>
<br />
<br />
<a href="section/2.aspx">section page</a>
<br />
<br />
<a href="buildin">buildin default page</a>
<br />
<br />
<a href="folder">folder default page</a>
<br />
<br />
<a href="section">section default page</a>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="test postback" /></div>
</form>
</body>
</html>
Default.aspx.cs
public partial class _Default : System.Web.UI.Page
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server" onsubmit="this.action=document.location.href">
<div>
<a href="<%= ResolveUrl("buildin.aspx") %>">buildin page</a>
<br />
<br />
<a href="<%= ResolveUrl("notexistfolder/buildin.aspx") %>">buildin page</a>
<br />
<br />
<a href="<%= ResolveUrl("test1.aspx") %>">test page</a>
<br />
<br />
<a href="<%= ResolveUrl("sample2.aspx") %>">sample page</a>
<br />
<br />
<a href="<%= ResolveUrl("folder/1.aspx") %>">folder page</a>
<br />
<br />
<a href="<%= ResolveUrl("section/2.aspx") %>">section page</a>
<br />
<br />
<a href="<%= ResolveUrl("buildin") %>">buildin default page</a>
<br />
<br />
<a href="<%= ResolveUrl("folder") %>">folder default page</a>
<br />
<br />
<a href="<%= ResolveUrl("section") %>">section default page</a>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="test postback" /></div>
</form>
</body>
</html>
好了,再试一试点击页面上的链接和按钮,多点几次,再点,再点。。。
。。。
呼~
终于搞定了吧!^-^
下载示例程序源码
需要手动为UrlRewriteSample目录添加一个到http://localhost/UrlRewriteSample的同名虚拟目录,允许匿名访问,并设置目录默认页为default.aspx。
另外,为了启用IIRF的URL重写支持,需要将UrlRewriteSample/bin目录下的IsapiRewrite4.dll添加为IIS默认网站的ISAPI过滤器。
设置重写规则
注意,我们的演示程序中将混合使用三种方式的URL重写,因此,需要为三种实现分别设置一些URL重写规则:
1、IIRF,对于IIRF,对应于IsapiRewrite4.dll,在相同的目录会有一个IsapiRewrite4.ini文件,除了默认的一些设置,我们在文件末尾添加了几条自定义规则如下:
# Custom RewriteRules
RewriteRule ^/UrlRewriteSample/test(.*).aspx /UrlRewriteSample/Default.aspx?page=$1
RewriteRule ^/UrlRewriteSample/folder/(.*).aspx /UrlRewriteSample/Default.aspx?folder=$1
RewriteRule ^/UrlRewriteSample/folder/? /UrlRewriteSample/Default.aspx?folder=default
熟悉正则表达式的朋友应该很容易理解上面这三条规则。
规则一将形如testXXX.aspx这样的页面访问,重写为Default.aspx?page=XXX这样的页面;
规则二将形如folder/XXX.aspx的路径,重写为Default.aspx?folder=XXX这样的页面;
规则三将不带任何文件的folder目录的访问,重写为Default.aspx?folder=default这样的页面。
2、urlMappings是ASP.NET2.0内置支持的URL重写配置块,它应该包含在web.config的<system.web>配置块中。但是,这个内置的URL重写支持不支持正则表达式,因而只能用来实现一对一的路径和页面的重写。urlMappings的配置内容包含在下面的Web.config文件中。
3、NBear.Web.Modules.UrlRewriteModule则是NBear中实现的一个基于HTTPModule的URL重写实现,它允许使用正则表达式来描述重写规则。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="UrlRewriteRules" type="NBear.Web.Modules.UrlRewriteRules, NBear.Web"/>
</configSections>
<UrlRewriteRules>
<Rule key="^/UrlRewriteSample/sample(.*).aspx" value="/UrlRewriteSample/Default.aspx?page=$1" />
<Rule key="^/UrlRewriteSample/section/(.*).aspx" value="/UrlRewriteSample/Default.aspx?section=$1" />
</UrlRewriteRules>
<system.web>
<urlMappings enabled="true">
<add url="~/buildin/Default.aspx" mappedUrl="~/Default.aspx?buildin=default" />
<add url="~/buildin.aspx" mappedUrl="~/Default.aspx?page=buildin" />
<add url="~/notexistfolder/buildin.aspx" mappedUrl="~/Default.aspx?page=buildin" />
</urlMappings>
<compilation debug="true">
<assemblies/>
</compilation>
<httpModules>
<add type="NBear.Web.Modules.UrlRewriteModule, NBear.Web" name="UrlRewriteModule"/>
</httpModules>
</system.web>
</configuration>
注意,代码中包含了urlMappings配置和用于NBear.Web.Modules.UrlRewriteModule重写规则。为了比较着几种重写方案,正则表达式基本上是和前面的IIRF定义中的规则类似的。
页面测试
定义完这些重写规则,我们就可以试着在页面中使用它们了。例如,如果我们写一个测试页面如下:
Default.aspx
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="buildin.aspx">buildin page</a>
<br />
<br />
<a href="notexistfolder/buildin.aspx">buildin page</a>
<br />
<br />
<a href="test1.aspx">test page</a>
<br />
<br />
<a href="sample2.aspx">sample page</a>
<br />
<br />
<a href="folder/1.aspx">folder page</a>
<br />
<br />
<a href="section/2.aspx">section page</a>
<br />
<br />
<a href="buildin">buildin default page</a>
<br />
<br />
<a href="folder">folder default page</a>
<br />
<br />
<a href="section">section default page</a>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="test postback" /></div>
</form>
</body>
</html>
Default.aspx.cs
public partial class _Default : System.Web.UI.Page
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server" onsubmit="this.action=document.location.href">
<div>
<a href="<%= ResolveUrl("buildin.aspx") %>">buildin page</a>
<br />
<br />
<a href="<%= ResolveUrl("notexistfolder/buildin.aspx") %>">buildin page</a>
<br />
<br />
<a href="<%= ResolveUrl("test1.aspx") %>">test page</a>
<br />
<br />
<a href="<%= ResolveUrl("sample2.aspx") %>">sample page</a>
<br />
<br />
<a href="<%= ResolveUrl("folder/1.aspx") %>">folder page</a>
<br />
<br />
<a href="<%= ResolveUrl("section/2.aspx") %>">section page</a>
<br />
<br />
<a href="<%= ResolveUrl("buildin") %>">buildin default page</a>
<br />
<br />
<a href="<%= ResolveUrl("folder") %>">folder default page</a>
<br />
<br />
<a href="<%= ResolveUrl("section") %>">section default page</a>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="test postback" /></div>
</form>
</body>
</html>
好了,再试一试点击页面上的链接和按钮,多点几次,再点,再点。。。
。。。
呼~
终于搞定了吧!^-^
相关文章推荐
- 全面解析ASP.NET2.0下的URL重写
- 全面解析ASP.NET2.0下的URL重写
- 全面解析ASP.NET2.0下的URL重写
- 全面解析ASP.NET2.0下的URL重写 (转)
- 全面解析ASP.NET2.0下的URL重写 (转)
- 在ASP.Net2.0中使用UrlRewritingNet实现链接重写
- 在ASP.Net2.0中使用UrlRewritingNet实现链接重写
- PHP获取当前url的具体方法全面解析
- 在ASP.Net2.0中使用UrlRewritingNet实现链接重写(转)
- 借助微软提供的url重写类库URLRewriter.dll(1.0)实现程序自动二级域名,域名需要泛解析
- 在ASP.Net2.0中使用UrlRewritingNet实现链接重写
- 全面解析ASP.NET2.0下的URL重写
- 在ASP.Net2.0中使用UrlRewritingNet实现链接重写
- 全面解析ASP.NET2.0下的URL重写
- 全面解析ASP.NET2.0下的URL重写 --来自Internet
- 一个非常全面的javascript URL解析函数和分段URL解析方法
- 全面解析ASP.NET2.0下的URL重写
- 全面解析ASP.NET2.0下的URL重写[转]
- 全面解析ASP.NET2.0下的URL重写
- ASP.NET2.0下的URL重写