看了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&month=$2&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&month=$2&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 { }
完成,執行結果一樣...