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

来源:互联网 发布:2017年中国老龄化数据 编辑:程序博客网 时间:2024/05/16 06:37

看了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 { }

完成,执行结果一样...

原创粉丝点击