asp.net的URL重写

什么是URL重写?

URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“www.mysite.com/UserProfile/1.aspx”,那么它可以被重写成 “www.mysite.com/UserProfile.aspx?ID=1”这样的URL,这样的网址可以更好的被网站所阅读。

URL重写的作用:
(1)它可以让你提高搜索引擎阅读和索引你的网站的能力;
(2)在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接;
(3)它还可以提高你的网站的安全性,减少黑客攻击的线索。
(4)通常会让你的网站更加便于使用和更专业。

URL重写的方法:
(1)可以通过编程的方式来实现。ASP.NET中的Contex.RewritePath()方法可以让你从程序中实现重写请求的URL。
在Global.asax文件的Application_BeginRequest()方法中,你需要增加代码来阅读进来的路径,然后根据一个或多个URL重写规则来成需要进一步处理的路径。下面的例子执行以下URL重写规则:
void Application_BeginRequest(object sender, EventArgs e)
{
String path = Request.Url.ToString();
if (Regex.IsMatch(path, "/URLRewriting/OldUrl.aspx", RegexOptions.IgnoreCase))
{
Context.RewritePath("/URLRewriting/NewUrl.aspx");
}
else if (Regex.IsMatch(path, "/URLRewriting/UserAccount/(.+).aspx",RegexOptions.IgnoreCase))
{
String idString = path.Substring(path.LastIndexOf('/') + 1, path.Length - path.LastIndexOf('/') - 6);
Context.RewritePath("/URLRewriting/UserAccount.aspx?id=" + idString);
}
}
在这个例子中,每次一个新的请求被处理的时候,它将首先查看这个Application_BeginRequest()。通过使用Request.Url属性来获得输入的URL路径,然后通过正则表达式来应用网站URL重写规则,匹配到期望的输入网址后,将它们重写成你希望转向的网址。

(2)使用UrlRewriting.NET实现更强大的URL重写

当重写规则比较简单且规模比较小的时候,使用Context.RewritePath() 方法以编程的方式重写URL效果比较不错,但是一些大型网站通常有非常多的URL重写规则。手工方式对所有这些重写规则进行编程可能是一件麻烦且容易出错的方法。
一个更好的解决方法是从web.config文件中使用一个HttpModule来动态的处理URL重写规则。更令人高兴的是,你无需自己动手来编写HttpModule来处理这些任务,已经有几个非常不错的免费版供你使用。以下是其中几个:URLRewriting.Net ,URLRewriter.Net ,Rewrite.Net 。

在这篇文章中,我将使用URLRewriting.Net演示一个简单的例子。在开始使用URLRewriting.Net之前,首先从URLRewriting.Net网站下载它,并把它放到你的网站的/bin文件夹下。

接下来,增加如下配置到你的web.config文件中:
<configSections>
<section name="urlrewritingnet" requirePermission ="false" type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter" />
</configSections>

<system.web>
<compilation debug="true"/>
<authentication mode="Windows"/>
<httpModules>
<add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule,UrlRewritingNet.UrlRewriter" />
</httpModules>
</system.web>
现在,在web.config文件中你可以增加下面的代码并输入你自己的URL重写规则。它将实现以下URL重写规则:
<urlrewritingnet rewriteOnlyVirtualUrls="true" contextItemsPrefix="QueryString" defaultPage = "Default.aspx" defaultProvider="RegEx" xmlns="http://www.urlrewriting.net/schemas/config/2006/07" >
<rewrites>
<add name="UserAccount" virtualUrl="^~/UserAccountV2/(.+).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/UserAccountV2.aspx?id=$1" ignoreCase="true" />
<add name="Movies_Action" virtualUrl="^~/Movies/Action.aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/Movies.aspx?MovieType=Action" ignoreCase="true" />
<add name="Movies_Drama" virtualUrl="^~/Movies/Drama.aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/Movies.aspx?MovieType=Drama" ignoreCase="true" />
<add name="Movies_Comedy" virtualUrl="^~/Movies/Comedy.aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/Movies.aspx?MovieType=Comedy" ignoreCase="true" />
</rewrites>
</urlrewritingnet>
如上面所看到的,当使用一个类似URLRewriting.Net的HttpModule的时候,你可以简单的逐一把你的网站重写规则插入到web.config文件中,而不用编写任何代码。这样,无论你的网站规模大小,管理这些URL重写规则变成了一件非常容易的事情。

值得一提的是,尽管我们这儿的例子非常简单,URLRewriting.Net是一个强大的程序,它具有很多我这儿没有用到的选项。完整的文档和示例应用程序可以从URLRewriting官方网站查看。

处理回送数据(Postback)

当在ASP.NET中使用URL重写方法的时候,经常引发一个潜在的问题:在一个页面回送数据给服务器的时候,原先干净的输入URL通常不会被保存。举个例子来说,你使用诸如“~/Movies/Action.aspx”之类的简洁URL输入了一个网址,但是当你点击一个按钮执行回送数据给服务器的时候,这个网址将会变回实际的URL——“~/Movies.aspx?MovieType= Action”。
问题的根源在于<form runat="server"> 标签Action动作的属性,它使用真实的URL而不是输入的网址。

解决这个问题的一个简单的办法是通过扩展继承已有的form标签来实现你自己的form标记版本。然后你可以设置其action为输入的URL而不是重写的那个。参看以下示例:
public class RewriteForm : HtmlForm
{
protected override void RenderAttributes(System.Web.UI.HtmlTextWriter writer)
{ // Name
writer.WriteAttribute("name", this.Name);
base.Attributes.Remove("name");
// Method
writer.WriteAttribute("method", this.Method);
base.Attributes.Remove("method");
this.Attributes.Render(writer);
// Action
String action = Context.Request.RawUrl;
if (action != null)
{
writer.WriteAttribute("action", action);
}
base.Attributes.Remove("action");
// ID
if (base.ID != null)
{
writer.WriteAttribute("id", base.ClientID);
}
}
}
使用以上代码,你现在可以使用<MyTags:RewriteForm ID="form1" runat="server"> 标记,而不用使用标准的<form id="form1" runat="server"> 标记,这样即使在数据回送过程中,也将保持网址不变。

处理链接和Image/CSS网址

当使用URL重写的时候需要注意的很重要的一个问题是,被重写后的页面中的相对链接、图片和CSS可能无法正常显示,因为相对参照将成为输入的URL而不时实际的URL。

举个例子来说,如果一个网站的主页是“/home.aspx?lang=en”,具有一个相对地址的“mysitelogo.jpg”,但是这个页面是被“/en/home.aspx”网址请求的,它具有一个“/en”目录来显示用户希望访问英文版的页面,“mysitelogo.jpg”的相对链接变成了“/en/mysitelogo.jpg”;这当然是不正确的,因此这个图像将不会正确的显示。

为了确保这个图像和链接指向正确的网址,请你指定一个绝对路径,例如“/mysitelogo.jpg”或者“www.mysite.com/mysitelogo.jpg”。另一个选择是在你的链接前使用“~/”,也就是说“~/mysitelogo.jpg”。这样它将自动展现你的文件或链接的正确路径。

修改文件扩展名

你可以对你的站点进行的另一个更有意思的修改是,修改你的页面的扩展名。例如,有的用户希望修改“.aspx”扩展名为特定的扩展名,诸如“.x”或“.mysite”,甚至是“.jsp”或“.php”。这样做有出于安全方面的考虑,也可以仅仅是为了增加你的网站的美观性。

要想修改你的网站页面的扩展名,只需使用上面的URL重写例子中的方法就可以,将包含“.mysite”的URL重写指向一个“.aspx”网址。如果你使用诸如URLRewriting.NET之类的模块的话,实现这个改变更是一件轻松的事情。只需要在重写规则的末尾加上一个重写规则,举个例子来说,重写“~/(.+).mysite”为“~/(.+).aspx”。因为URL重写规则是按顺序执行的,所以将这条规则放在最后会捕获所有页面。

还有需要注意的一点,当使用特定的文件扩展名的时候,确认要在IIS映射中配置这个新的扩展名。ASP.NET相关的扩展名(“.aspx”、“.asax”、“.config”、“.cs”等等)全部会被映射向aspnet_isapi.dll的ISAPI扩展。把你的新扩展名增加到相同的配置中。

分享来源地址:http://tech.it168.com/msoft/2008-01-08/200801080919796.shtml

 

posted @ 2016-01-08 15:38  simpleZone  阅读(505)  评论(0编辑  收藏  举报