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重写规则,匹配到期望的输入网址后,将它们重写成你希望转向的网址。
使用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文件中:
代码清单2:添加到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重写规则:
代码清单3:对URLRewriting.Net配置重写规则
<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而不是重写的那个。参看以下示例:
代码清单4:定制的form标记可以处理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扩展。把你的新扩展名增加到相同的配置中。
如何利用URL重写
上面你已经花了不少时间了解了如何实现URL重写,现在你需要来看一下如何利用这个功能来完善你的网站。
1、提高搜索引擎阅读和索引你的网站的能力
搜索引擎是根据URL来抓取和索引网站的。很多动态数据库驱动的网站具有一些具有URL参数的动态URL,诸如像“www.mysite.com/UserProfile.aspx?ID=1”中的ID参数,搜索引擎不能够完全索引你的网站。通过修改网址成为像“www.mysite.com/UserProfile/1.aspx”之类的形式,你可以帮助搜索引擎更容易的索引你的网站。
搜索引擎通常还通过你的URL中的关键字来判断你的网页的相关性。有的时候,你可能希望在不用修改网站目录架构的情况下,修改URL以更好的反映网页的内容。
让你的网站更好的被搜索引擎收录虽然没有什么良丹妙药或速成法,但是了解搜索引擎的工作原理,然后根据它来优化你的网站,可能会带来意想不到的效果。
2、修改站点结构,却不用要求用户修改他们的书签,也不用要求其他网站改变指向你网站的友情链接
如果你想修改一个网页的名称,或者修改存储网页的文件夹结构,将会给那些已经收藏了你的网页的人和某些网站对你的友情链接带来混乱。一个可行的解决方案就是使用URL重写来透明的把用户重定向到正确的网页。
举个例子来说,如果你有一个“www.mysite.com/main/sitecontacts.aspx”,用户可能已经在书签中收藏了这个地址,而你想修改它到“www.mysite.com/contacts.aspx”,你可以简单的建立一个重定向规则,当用户在浏览器中输入“www.mysite.com/main/sitecontacts.htm”的时候,被重定向到“www.mysite.com/contacts.htm”页面。
3、提高网站安全性
网址可以为黑客提供一些攻击的线索,因为它们通常会暴露你的网站的内部工作机制。
举个例子来说,通过使用“.aspx”作为后缀,你已经暴露给别人你正在使用ASP.NET框架。这样一个潜在的黑客就掌握了一条如何攻击你的网站的线索。URL重写可以将扩展名改为“.x”或“.mysite”,从而可以让攻击者去猜测你的网站到底用的是什么框架。
另一个安全担心是,在URL中显示你的站点目录和URL参数,通常会让黑客获得重要信息来进行前端攻击。通过这个信息,他们可以通过修改参数,或直接访问相关目录,从而暗中找出你的网站可能存在的一个安全漏洞。URL重写帮助你隐藏这些信息不被黑客所发现。
不过值得注意的是,URL重写只是网站的整体安全防护措施中的一小部分。简单的隐藏了安全漏洞并不意味着安全漏洞已经不存在,因此确保详细的测试你的网站的安全性,并修补安全漏洞。
4、提高网站可用性和专业性
冗长、非用户友好的URL通常会给你的网站带来可用性的问题。用户不会总是从一个链接来访问你的网站,很多时候要直接在浏览器中输入你的网站网址,如果太长或不同意记忆的话,通常会让用户放弃对你的网站的访问。而且在用户讨论网站的时候,也会给用户的交流带来一定的影响。
无论是哪一种情况,保持一个网址简单、简练往往都是一个很好的想法。URL重写可以有助于透明的实现这个操作,且不用改变底层的目录结构和页面名称。
好看好记的网址通常会增加网站的专业性和整体外观感觉。从而让你有机会展示你知道或正在做的事情。
结论
本文中所介绍的方法和思想只是建造一个完美网站的整体解决方案中的一部分,但是我希望这篇文章可以让你全面了解如何实现以及为什么URL重写可以用来完善你的网站。