在 ASP.NET 中执行 URL 重写(RewritePath)

看了MSDN和其他人的一些资料,整理了一下在ASP.Net下的URL重写. 这是一些资料 http://msdn.microsoft.com/zh-cn/library/ms972974.aspx#XSLTsection123121120120 http://hi.baidu.com/yequanfu/blog/item/1513ce3325b54840ad4b5fbc.html http://hi.baidu.com/sunsonruby/blog/item/d933b7b45d5688778ad4b26e.html 先引入一段引言 让我们花点时间来看一下网站上的一些 URL。您是否发现一些类似于 http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary 的 URL?或者,您可能将一系列网页从一个目录或网站移动到另一个目录或网站,结果导致已将旧 URL 用作书签的访问者断开链接。在本文中,我们将了解如何通过将 http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary 替换为类似于 http://yoursite.com/people/sales/chuck.smith 的网址,使用 URL 重写将那些冗长的 URL 缩写为富有意义且容易记忆的 URL。我们还将了解如何将 URL 重写用于创建智能 404 错误。 URL 重写是截取传入 Web 请求并自动将请求重定向到其他资源的过程。执行 URL 重写时,通常会检查被请求的 URL,并基于 URL 的值将请求重定向到其他 URL。例如,在进行网站重组而将 /people/ 目录下的所有网页移动到 /info/employees/ 目录中时,您可能希望使用 URL 重写来检查 Web 请求是否指向了 /people/ 目录中的文件。如果请求指向 /people/ 目录中的文件,您可能希望自动将请求重定向到 /info/employees/ 目录中的同一文件。 使用传统的 ASP,应用 URL 重写的唯一方法是编写 ISAPI 筛选器,或者购买提供 URL 重写功能的第三方产品。但是,使用 Microsoft® ASP.NET,您可以通过很多方法来轻松地创建您自己的 URL 重写软件。本文讨论了可供 ASP.NET 开发人员实现 URL 重写的各种技术,然后讨论了 URL 重写的一些实际使用情况。在深入讨论 URL 重写的技术细节之前,让我们先看一些可以使用 URL 重写的日常情景。 经过上面文章的介绍,对URL重写有些了解了,下面是我做的一个小例子. 首先,先将URLRewriter.dll引入项目 http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi 这里包含着URLRewriter和ActionlessForm,如果有必要,可以进行重写,编译后将.dll引入到项目中. 我先对webconfig进行配制.Web.config 文件中指明要使用 HTTP 模块还是 HTTP 处理程序来执行 URL 重写。这里使用了HTTP 模块进行处理 <configSections>     <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/> </configSections> <httpModules>     <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter"/> </httpModules> 若使用HTTP 处理程序,则在httpHandlers中进行配制 <httpHandlers> <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" /> </httpHandlers> 除了指定使用 HTTP 模块还是 HTTP 处理程序执行重写外,Web.config 文件还包含重写规则:重写规则由两个字符串组成:要在被请求的 URL 中查找的模式;要替换此模式的字符串(如果找到)。在 Web.config 文件中,此信息是使用以下语法表达的: <RewriterConfig> <Rules> <RewriterRule> <LookFor>要查找的模式</LookFor> <SendTo>要用来替换模式的字符串</SendTo> </RewriterRule> <RewriterRule> <LookFor>要查找的模式</LookFor> <SendTo>要用来替换模式的字符串</SendTo> </RewriterRule> ... </Rules></RewriterConfig> 每个重写规则均由 <RewriterRule> 元素表达。要搜索的模式由 <LookFor> 元素指定,而要替换所找到的模式的字符串将在 <SentTo> 元素中输入。这些重写规则将从头到尾进行计算。如果发现与某个规则匹配,URL 将被重写,并且对重写规则的搜索将会终止。 在 <LookFor> 元素中指定模式时,请注意,要使用正则表达式来执行匹配和字符串替换。由于模式是正则表达式,应确保转义正则表达式中的任何保留字符。(一些正则表达式保留字符包括:.、?、^、$ 及其他。可以通过在前面加反斜杠(如 \.)对这些字符进行转义,以匹配文字句点。) 在configuration下加入一结点 <RewriterConfig> <Rules> <RewriterRule> <LookFor>~/(\d{4})/(\d{2})/(\d{2})\.aspx</LookFor> <SendTo>~/ShowBlogContent.aspx?year=$1&amp;month=$2&amp;day=$3</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/(\d{4})/(\d{2})/Default\.aspx</LookFor> <SendTo><![CDATA[~/ShowBlogContent.aspx?year=$1&month=$2]]></SendTo> </RewriterRule> <RewriterRule> <LookFor>~/(\d{4})/Default\.aspx</LookFor> <SendTo>~/ShowBlogContent.aspx?year=$1</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/ModalPopupExtender</LookFor> <SendTo>~/ModalPopupExtender.aspx</SendTo> </RewriterRule> </Rules> </RewriterConfig> 配制完成,看效果 输入ModalPopupExtender时,就导向了ModalPopupExtender.aspx页面 二:使用global.asax,在Application_BeginRequest(Object sender, EventArgs e)中将url重写 配制一个XML <?xml version="1.0" encoding="utf-8" ?> <ReWriterUrls> <rule> <LookFor>ModalPopupExtender</LookFor> <SendTo>ModalPopupExtender.aspx</SendTo> </rule> <rule> <LookFor>(\d{4})/(\d{2})/(\d{2})\.aspx</LookFor> <SendTo>ShowBlogContent.aspx?year=$1&amp;month=$2&amp;day=$3</SendTo> </rule> <rule> <LookFor>(\d{4})/(\d{2})/Default\.aspx</LookFor> <SendTo><![CDATA[ShowBlogContent.aspx?year=$1&month=$2]]></SendTo> </rule> <rule> <LookFor>(\d{4})/Default\.aspx</LookFor> <SendTo>ShowBlogContent.aspx?year=$1</SendTo> </rule> </ReWriterUrls> beginrequest中的方法 try { string sPath = Server.MapPath("~/UrlReWrite.config"); System.Xml.XPath.XPathDocument myXPathDocument = new System.Xml.XPath.XPathDocument(sPath); System.Xml.XPath.XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator(); System.Xml.XPath.XPathNodeIterator myXPathNodeIterator = myXPathNavigator.Select("//rule"); System.Text.RegularExpressions.Regex oReg; string ReWriteUrl; while (myXPathNodeIterator.MoveNext()) { System.Xml.XPath.XPathNavigator nav2 = myXPathNodeIterator.Current.Clone(); string oldString = "", newString = ""; System.Xml.XPath.XPathNodeIterator it2 = nav2.Select("LookFor"); while (it2.MoveNext()) { oldString = it2.Current.Value; break; } it2 = nav2.Select("SendTo"); while (it2.MoveNext()) { newString = it2.Current.Value; break; } if (oldString != "" && newString != "") { oReg = new System.Text.RegularExpressions.Regex(oldString, RegexOptions.IgnoreCase); if (oReg.IsMatch(Request.Url.ToString())) { ReWriteUrl = Regex.Replace(Request.RawUrl, oldString, newString, RegexOptions.Compiled | RegexOptions.IgnoreCase); HttpContext.Current.RewritePath(ReWriteUrl); break; } } } } catch { } 完成,执行结果一样...
原文地址:https://www.cnblogs.com/icestone10/p/3250592.html