在 ASP.NET 2.0中,URL重写

分享于 

7分钟阅读

Web开发

  繁體 雙語

介绍

在本文中,你将学习 ASP.NET 2.0中的URL重写。 URL重写最初被Apache引入为一个名为mod_rewrite的扩展。 URL重写的概念很简单。 它允许你将那些丑陋的url重写成更好的url,因此它在搜索引擎优化方面表现得更好。

大多数搜索引擎将忽略动态 url,如以 QueryString。比如。http://www.worldofasp.net/displayproduct.aspx?ID=10 结尾的动态 url。 因此,如果你想要更多的点击和流量来自搜索引擎,考虑重写所有这些 QueryString 网址的正常网址。

如果重写 URL 上面,实际上可以将它的重写为更为易读的格式 比如。 或者,你可以将它的重写为 http://www.worldofasp.net/product/10.aspx。

搜索引擎机器人会认为你的动态页面是普通页面,因此会抓取页面,因此你的页面会有更好的搜索结果。 如果你查看 Worldofasp.net 或者 CodeProject.com, 中的页面,你可以看到网页开发人员已经使用了URL重写技术。

主要

for. NET 框架 2.0有一个有限的URL重写库支持,如果需要复杂的URL重写,你必须编写自己的URL重写引擎。 你可以秒为单位实现最简单的URL重写是将代码 below 复制并粘贴到你的global.asax file:

void Application_BeginRequest(Object sender, EventArgs e) 
{{
 String strCurrentPath;
 String strCustomPath;
 strCurrentPath = Request.Path.ToLower();
 if (strCurrentPath.IndexOf("ID") >= 0) 
 {
 strCustomPath = "/Product10.aspx"; 
 // rewrite the URL Context.RewritePath( strCustomPath );
 }
}

从代码 上面 中可以看到,URL重定向仅限于一个规则。 如果它检测到你的URL包含ID关键字,它将总是重定向到一个叫做 product10.aspx的页面。 当然,如果你想要不同的QueryString for重定向到不同的页面,或者想要不同的查询字符串类型。

我们可以使用 正规表达式 来实现不同的重定向技术,从而有更复杂的URL重写规则。 现在,让我们开始为你的重定向编写一些规则。

<urlrewrites><rule><url>product/(.*).aspx</url><rewrite>displayProduct.aspx?ID=$1</rewrite></rule><rule><url>Items/Mouse/(.*).aspx</url><rewrite>ViewItem.aspx?ID=$1</rewrite></rule></urlrewrites>

从第一条规则 上面 可以看到,它将URL从产品/( 号码)。aspx displayProduct.aspx? 到 ID= ( 号码)。 第二条规则将重定向 URL,如果它包含 Items/Mouse/(Number).aspx to to ViewItem.aspx? ID= ( 号码)。 你可以添加任意数量的规则,只要在上面添加XML节点即可。

void Application_BeginRequest(Object sender, EventArgs e)
{
 string sPath = Context.Request.Path; 
 //To overcome Postback issues, stored the real URL. Context.Items["VirtualURL"] = sPath;
 Regex oReg;
 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(Server.MapPath("/XML/Rule.xml"));
 _oRules = xmlDoc.DocumentElement;
 foreach (XmlNode oNode in _oRules.SelectNodes("rule"))
 {
 oReg = new Regex(oNode.SelectSingleNode("url/text()").Value);
 Match oMatch = oReg.Match(sPath);
 if (oMatch.Success)
 {
 sPath = oReg.Replace(sPath, 
 oNode.SelectSingleNode("rewrite/text()").Value);
 break;
 }
 }
 Context.RewritePath(sPath);
}

代码 上面 是自解释的。 它将搜索XML文件中的规则,如果匹配,那么它将重写路径。 这就是实现URL重写所需做的全部事情。 但是,在重写URL之后,所有页回发将无法正常工作。 原因是 ASP.NET 将自动输出标记的" action"属性以指向它所在的页。 使用URL重写时的问题是页面呈现的URL不是请求的原始 URL。 这意味着当你在服务器上做 postback 时,URL不会是你的好东西。

要解决这里问题,需要在每个要执行 postback的页面上添加这里代码:

protectedoverridevoid Render(HtmlTextWriter writer)
{
 if (HttpContext.Current.Items["VirtualURL"]!= null)
 {
 string sVirURL= HttpContext.Current.Items["VirtualURL"].ToString()
 RewriteFormHtmlTextWriter oWriter = 
 new RewriteFormHtmlTextWriter(writer,sVirURL);
 base.Render(oWriter);
 }
}
RewriteFormHtmlTextWriter的源代码
publicclass RewriteFormHtmlTextWriter : HtmlTextWriter
{
 privatebool inForm;
 privatestring _formAction;
 public RewriteFormHtmlTextWriter(System.IO.TextWriter writer):base(writer)
 {
 }
 publicoverridevoid RenderBeginTag(string tagName)
 {
 if (tagName.ToString().IndexOf("form") >= 0)
 {
 base.RenderBeginTag(tagName);
 }
 }
 public RewriteFormHtmlTextWriter(System.IO.TextWriter writer, string action)
 : base(writer)
 {
 this._formAction = action;
 }
 publicoverridevoid WriteAttribute(string name, stringvalue, bool fEncode)
 {
 if (name == "action")
 {
 value = _formAction;
 }
 base.WriteAttribute(name, value, fEncode);
 }
}

这就是你需要实现一个复杂且完全可扩展的URL重写工具所需要的全部。 你可以在 Rules.xml 文件中创建无限的规则,并重定向到你想要。

结束语

在本文中,你可以看到为你的网站实现URL重写是多么容易。 你可以进行增强并改进代码 上面的工作流程。 你可以使用 caching 文件作为缓存对象,以便在每次重写时保存和关闭XML文件,从而加快规则执行速度。

引用


asp  asp-net  URL  Rewriting  Url重写  
相关文章