在 ASP.NET 中執行 URL 重寫(RewritePath)

來源:互聯網
上載者:User

看了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> 元素中指定模式時,請注意,要使用Regex來執行匹配和字串替換。由於模式是Regex,應確保轉義Regex中的任何保留字元。(一些Regex保留字元包括:.、?、^、$ 及其他。可以通過在前面加反斜線(如 /.)對這些字元進行轉義,以匹配文字句點。)

在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 { }

完成,執行結果一樣...

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.