亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

技巧/訣竅:在ASP.NET中重寫URL

系統(tǒng) 2170 0
轉(zhuǎn)自 Scott Guthrie 博客,收藏學(xué)習(xí)。

【原文地址】 Tip/Trick: Url Rewriting with ASP.NET

經(jīng)常有人請我指導(dǎo)應(yīng)該如何動態(tài)地“重寫”URL,以在他們的ASP.NETweb應(yīng)用中發(fā)布比較干凈的URL端點。這個博客帖子概述了幾個方法,你可以用來在ASP.NET中干凈地映射或重寫URL,以及按照你自己的需求組織你的URL的結(jié)構(gòu)。

為什么URL映射和重寫很重要?

下面是開發(fā)人員想要對URL有更大的靈活性的最常見的場景:

1) 處理這樣的情形:你要更改你的web應(yīng)用中網(wǎng)頁的結(jié)構(gòu),但你同時也要確保在你移動網(wǎng)頁后,那些被人收藏的老URL不會成為死鏈接。重寫URL允許你透明地將請求轉(zhuǎn)交到新的網(wǎng)頁地址而不出錯。

2) 在象Google,Yahoo 和 Live 這樣的搜索引擎中提高你網(wǎng)站上網(wǎng)頁的搜索相關(guān)性。具體地來說,URL重寫經(jīng)常能使你在你網(wǎng)站上網(wǎng)頁的URL里更加容易地嵌入關(guān)鍵詞,這么做往往會增加別人點擊你的鏈接的機(jī)會。從使用查詢字符串參數(shù)到使用完全限定(fully qualified)的URL也能在某些情形下提高你在搜索引擎結(jié)果中的優(yōu)先順序。使用強(qiáng)制referring鏈接使用同樣的大小寫(same case)和URL入口(譬如,使用weblogs.asp.net/scottgu 而不是 weblogs.asp.net/scottgu/default.aspx)的技術(shù)也能避免因跨越多個URL而造成的網(wǎng)頁排名(pagerank)的降低(avoid diluting your pagerank across multiple URLs),從而增加你的搜索結(jié)果。

在一個搜索引擎日漸驅(qū)動網(wǎng)站訪問量的世界里,在你的網(wǎng)頁排名上稍微得到一些提高就能給你的業(yè)務(wù)帶來不錯的投資回報(ROI)。逐漸地,這驅(qū)使開發(fā)人員使用URL重寫以及其他SEO(搜索引擎優(yōu)化 )技術(shù)來優(yōu)化網(wǎng)站(注,SEO是個步調(diào)很快的空間,增加你的搜索相關(guān)性的建議月月在演變)。想了解一些關(guān)于搜索引擎優(yōu)化方面好的建議的話,我建議你閱讀一下《 SSW Rules to Better Google Rankings (SSW的提高Google排名之要領(lǐng)) 》,以及MarketPosition關(guān)于《 how URLs can affect top search engine ranking (URL會如何影響頂級搜索引擎排名) 》的文章。

例程的URL重寫場景

為這個博客貼子起見,我將假設(shè)我們將在一個應(yīng)用里建造一套電子商務(wù)的產(chǎn)品目錄網(wǎng)頁,產(chǎn)品是按種類來組織的(譬如,圖書,錄像,CD,DVD等等)。

讓我們假定一開始我們有個網(wǎng)頁叫Products.aspx,通過查詢字符串參數(shù)接受一個類別名稱,相應(yīng)地過濾顯示的產(chǎn)品。與這個Products.aspx網(wǎng)頁對應(yīng)類別的URL看上去象這樣:

http://www.store.com/products.aspx?category=books
http://www.store.com/products.aspx?category=DVDs
http://www.store.com/products.aspx?category=CDs

但我們不想使用查詢字符串來呈示每個類別,我們想修改應(yīng)用,讓每個產(chǎn)品類別對搜索引擎來說看上去象是一個獨特的URL,并且在實際的URL中嵌入關(guān)鍵詞(而不是通過查詢字符串參數(shù))。我們將在這個博客帖子剩下來的篇幅里,討論一下達(dá)成這個目的我們可以采取的4種不同方法。

方法一:使用Request.PathInfo 參數(shù)而不是查詢字符串

我將示范的第一個方法根本不使用URL重寫,而是使用ASP.NET中不太為人所知的一個特性,Request的PathInfo屬性。為幫助解釋這個屬性的有用之處,考慮一下我們電子商店下面這些URL的情形:

http://www.store.com/products.aspx/Books
http://www.store.com/products.aspx/DVDs
http://www.store.com/products.aspx/CDs

你會在上面這些URL中注意到的一個東西是,他們不再含有查詢字符串值,取而代之的是,類別參數(shù)的值是附加到URL上的,是以Products.aspx網(wǎng)頁處理器名稱之后的/參數(shù) 值的方式出現(xiàn)的。然后,一個自動化的搜索引擎爬蟲(search engine crawler)會把這些URL解釋成三個不同的URL,而不是一個URL帶有三個不同的輸入值 (搜索引擎是不理會文件擴(kuò)展名的,只把它當(dāng)作URL中的另一個字符而已)。

你也許很想知道怎么在ASP.NET中處理這個附加的參數(shù)的情形。好消息是,這非常簡單。只要使用Request的PathInfo屬性就可以了,該屬性返回URL中緊隨 products.aspx 后面的那部分內(nèi)容。所以,對上面這些URL, Request.PathInfo會分別返回 “/Books”, “/DVDs”,和 “/CDs”(萬一你想知道的話, Request的Path 屬性返回“/products.aspx” )。

然后,你可以輕易地編寫一個函數(shù)來獲取產(chǎn)品類別,象這樣(下面這個函數(shù)去除前面的斜杠字符,只返回“Books”,“DVDs”,或 “CDs”):

Function GetCategory() AsString

If
(Request.PathInfo.Length = 0 )
Then
Return
""
Else
Return
Request.PathInfo.Substring( 1
)
EndIf

EndFunction

樣例下載 :我建立的一個展示這個技術(shù)的樣例應(yīng)用可以 在這里下載 。這個樣例和這個技術(shù)的很好的地方在于,為部署使用這個方法的ASP.NET應(yīng)用,不需作任何服務(wù)器配置改動。在共享主機(jī)的環(huán)境里,這個技術(shù)也行之有效。

方法二:使用HttpModule實現(xiàn)URL重寫

上述Request.PathInfo技術(shù)的替換方法是,利用ASP.NET提供的HttpContext.RewritePath方法。這個方法允許開發(fā)人員動態(tài)地重寫收到的URL的處理路徑,然后讓ASP.NET使用剛重寫過后的路徑來繼續(xù)執(zhí)行請求。

譬如,我們可以選擇向大眾呈示下列URL:

http://www.store.com/products/Books.aspx
http://www.store.com/products/DVDs.aspx
http://www.store.com/products/CDs.aspx

在外界看來,網(wǎng)站上有三個單獨的網(wǎng)頁(對搜索爬蟲而言,這看上去很棒)。通過使用 HttpContext的RewritePath方法,我們可以在這些請求剛進(jìn)入服務(wù)器時,動態(tài)地把收到的URL重寫成單個Products.aspx網(wǎng)頁接受一個查詢字符串的類別名稱或者PathInfo參數(shù)。譬如,我們可以使用Global.asax中的Application_BeginRequest事件,來這么做:

void Application_BeginRequest( object sender,EventArgse){

string fullOrigionalpath = Request.Url.ToString()
;

if
(fullOrigionalpath.Contains( "/Products/Books.aspx"
)){
Context.RewritePath(
"/Products.aspx?Category=Books" )
;
}
elseif (fullOrigionalpath.Contains( "/Products/DVDs.aspx"
)){
Context.RewritePath(
"/Products.aspx?Category=DVDs" )
;
}
}

手工編寫象上面這樣的編碼的壞處是,很枯燥乏味,而且容易犯錯。我建議你別自己寫,而是使用網(wǎng)上現(xiàn)成的HttpModule來完成這項工作。這有幾個你現(xiàn)在就可以下載和使用的免費的HttpModule:

這些模塊允許你用聲明的方式在你應(yīng)用的web.config文件里表達(dá)匹配規(guī)則。譬如,在你應(yīng)用的web.config文件里使用 UrlRewriter.Net模塊 來把上面的那些URL映射到單個Products.aspx頁上,我們只要把這個web.config文件添加到我們的應(yīng)用里去就可以了(不用任何編碼):

< ?xml version ="1.0"?>

< configuration >

< configSections >
< section name ="rewriter"
requirePermission
="false"

type
="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler,Intelligencia.UrlRewriter"
/>
</
configSections >


< system.web >

< httpModules >
< add name ="UrlRewriter" type ="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter"/>
</
httpModules >


</ system.web >

< rewriter >
< rewrite url ="~/products/books.aspx" to ="~/products.aspx?category=books" />
<
rewrite url ="~/products/CDs.aspx" to ="~/products.aspx?category=CDs"
/>
<
rewrite url ="~/products/DVDs.aspx" to ="~/products.aspx?category=DVDs"
/>
</
rewriter >


</ configuration >

上面的HttpModule URL重寫模塊還支持正則表達(dá)式和URL模式匹配(以避免你在web.config 文件里硬寫每個URL)。所以,不用寫死類別名稱,你可以象下面這樣重寫匹配規(guī)則,把類別名稱動態(tài)地從任何/products/[類別].aspx組合的URL里取出來:

< rewriter >
< rewrite url ="~/products/(.+).aspx" to ="~/products.aspx?category=$1" />
</ rewriter >

這使得你的編碼極其干凈,并且擴(kuò)展性非常之好。

樣例下載 :我建立的一個使用UrlRewriter.Net模塊展示這個技術(shù)的樣例應(yīng)用可以 在這里下載

這個樣例和這個技術(shù)的很好的地方在于,為部署使用這個方法的ASP.NET應(yīng)用,不需作任何服務(wù)器配置改動。在設(shè)置為中等信任安全等級(medium trust)的共享主機(jī)的環(huán)境里,這個技術(shù)也行之有效 (只要把文件FTP/XCOPY到遠(yuǎn)程服務(wù)器就可以了,不需要安裝)。

方法三:在IIS7中使用HttpModule 實現(xiàn)無擴(kuò)展名的URL重寫

上述的HttpModule方法在你要重寫的URL含有.aspx 擴(kuò)展名或者包含另一個被設(shè)置為ASP.NET處理的擴(kuò)展名的情形下一切都工作。你這么做的話,不需要任何特定的服務(wù)器配置,你只要把你的應(yīng)用拷貝到遠(yuǎn)程服務(wù)器,它會正常工作的。

但有的時候,你要重寫的URL要么擁有一個不為ASP.NET處理的文件擴(kuò)展名(譬如, .jpg, .gif, 或 .htm),要么根本沒有擴(kuò)展名。譬如,我們也許要把這些URL呈示成公開的產(chǎn)品目錄網(wǎng)頁(注意,它們沒有 .aspx 擴(kuò)展名):

http://www.store.com/products/Books
http://www.store.com/products/DVDs
http://www.store.com/products/CDs

在 IIS5 和 IIS6 中,使用ASP.NET處理上面這樣的URL不是很容易。 IIS 5/6 使得在ISAPI擴(kuò)展(ASP.NET就是這樣一個擴(kuò)展)里非常難以重寫這些類型的URLS。你需要做的是使用ISAPI過濾器在IIS請求管道(request pipeline)的較早期實現(xiàn)重寫。我將在下面的第四個方法里示范如何在 IIS5/6 實現(xiàn)這樣的重寫。

但好消息是, IIS 7.0 使得處理這類情形容易之極。你現(xiàn)在可以在 IIS 請求管道的任何地方執(zhí)行一個HttpModule,這意味著你可以使用上面的 URLRewriter 模塊 來處理和重寫無擴(kuò)展名的URL(甚至是帶有 .asp,.php,或 .jsp 擴(kuò)展名的URL)。下面示范了你在IIS7中該如何配置:

< ?xml version ="1.0" encoding ="UTF-8"?>

< configuration >

< configSections >
< section name ="rewriter"
requirePermission
="false"

type
="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler,Intelligencia.UrlRewriter"
/>
</
configSections >


< system.web >

< httpModules >
< add name ="UrlRewriter" type ="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" />
</
httpModules >


</ system.web >

< system.webServer >

< modules runAllManagedModulesForAllRequests ="true">
< add name ="UrlRewriter" type ="Intelligencia.UrlRewriter.RewriterHttpModule" />
</
modules >


< validation validateIntegratedModeConfiguration ="false" />

</
system.webServer >


< rewriter >
< rewrite url ="~/products/(.+)" to ="~/products.aspx?category=$1" />
</
rewriter >


</ configuration >

注意一下<system.webServer>內(nèi)<modules>部分設(shè)置為true的runAllManagedModulesForAllRequests屬性。這個屬性確保來自Intelligencia的UrlRewriter.Net模塊(是在IIS7正式發(fā)布前編寫的),會被調(diào)用,有機(jī)會重寫到服務(wù)器的所有URL請求(包括文件夾)。上面的web.config文件非常酷之處在于:

1) 它在任何IIS7機(jī)器上都會工作,你不需要管理員在遠(yuǎn)程主機(jī)上啟用任何東西,它也能在設(shè)置為中等信任安全等級(medium trust)的共享主機(jī)的環(huán)境場景下工作。

2) 因為我在<httpModules>和 IIS7 的<modules> 部分同時配置了UrlRewriter,我既能在 VS內(nèi)置的web服務(wù)器(即Cassini)中,也能在IIS7下使用同樣的URL重寫規(guī)則。兩者完全支持無擴(kuò)展名的URL重寫。這使得測試和開發(fā)非常容易。

IIS 7.0 將在今年的晚些時候作為Windows Longhorn服務(wù)器的一部分發(fā)布,將在幾個星期內(nèi)隨Beta3版本的發(fā)布支持go-live許可。由于添加到IIS7中的所有的新宿主(hosting)特性,我們預(yù)期主機(jī)供應(yīng)商將會非常快地開始積極提供IIS7賬號,這意味著你應(yīng)該很快就可以開始利用上述的無擴(kuò)展名的URL重寫支持。我們將在 IIS7 RTM 時段里發(fā)布一個為微軟所支持的URL重寫模塊,該模板是免費的,你可以在IIS7上使用,并且這模塊將對你web服務(wù)器上的所有內(nèi)容的高級URL重寫場景提供很好的支持。

樣例下載:我建立的一個使用IIS7和UrlRewriter.Net模塊展示無擴(kuò)展名URL重寫技術(shù)的樣例應(yīng)用可以 在這里下載

方法四:在IIS5和IIS6中使用 ISAPIRewrite 來實現(xiàn)無擴(kuò)展名的URL重寫

如果你不想等到IIS7出來才利用無擴(kuò)展名的URL重寫,那么你最好的措施是使用ISAPI過濾器來重寫URL。我知道有2個ISAPI過濾器方案,你也許要去看一下:

我沒親手用過上面的產(chǎn)品,雖然我聽過到對這2個產(chǎn)品的好評。 Scott Hanselman Jeff Atwood 最近都寫了精彩的博客貼子講述使用這些產(chǎn)品的體驗,同時提供了一些如何在這些產(chǎn)品中配置匹配規(guī)則的例子。Helicon Tech的ISAPI Rewrite的規(guī)則使用跟 Apache的mod_rewrite同樣的句法,譬如( 取自Jeff的博客貼子 ):

[ISAPI_Rewrite]
#fixmissingslashonfolders
#note,thisassumeswehavenofolderswithperiods!
RewriteCondHost:(.*)
RewriteRule([^.?]+[^.?/])http\://$1$2/[RP]

#removeindexpagesfromURLs
RewriteRule(.*)/default.htm$$1/[I,RP]
RewriteRule(.*)/default.aspx$$1/[I,RP]
RewriteRule(.*)/index.htm$$1/[I,RP]
RewriteRule(.*)/index.html$$1/[I,RP]

#forceproperwww.prefixonallrequests
RewriteCond%HTTP_HOST^test\.com[I]
RewriteRule^/(.*)http://www.test.com/$1[RP]

#onlyallowwhitelistedrefererstohotlinkimages
RewriteCondReferer:(?!http://(?:www\.good\.com|www\.better\.com)).+
RewriteRule.*\.(?:gif|jpg|jpeg|png)/images/block.jpg[I,O]

一定要去讀一下 Scott Jeff的貼子 以了解這些ISAPI 模塊的詳情,以及你都能用它們做些什么。

注:使用ISAPI過濾器的一個壞處是,共享主機(jī)環(huán)境一般不允許你安裝這樣的組件,所以你要用它們的話,你要么需要一個專用的虛擬主機(jī)服務(wù)器,要么需要一個專用的主機(jī)服務(wù)器。但,如果你有一個主機(jī)計劃允許你安裝ISAPI的話,這會在IIS5/6下會提供最大的靈活性,讓你過渡到IIS7推出為止。

在URL重寫里處理ASP.NET PostBack

大家在使用ASP.NET和重寫URL時經(jīng)常遇到的一個疑難雜癥跟處理postback場景有關(guān)。具體地來說,當(dāng)你在一個網(wǎng)頁上放置一個 <form runat="server"> 控件時,ASP.NET 會自動地默認(rèn)輸出標(biāo)識的action屬性指向當(dāng)前所在頁面。當(dāng)使用URL重寫時,會出現(xiàn)這樣的問題,<form> 控件顯示的URL不是原先請求的URL(譬如,/products/books),而是重寫過后的URL(譬如,/products.aspx?category=books)。這意味著,當(dāng)你做一個postback到服務(wù)器時,URL不再是你原先干凈利落的那個了。

在 ASP.NET 1.0 和1.1 中,大家經(jīng)常訴諸于繼承<form> 控件生成他們自己的控件,來正確地輸出要使用的action屬性。雖然這可以工作,但結(jié)果有點亂,因為這意味著你需要更新你所有的頁面來使用這個另外的表單控件,而且有時在Visual Studio所見即所得設(shè)計器里也會遇上問題。

好消息是,在ASP.NET 2.0中,有個比較干凈的訣竅你可以用來重寫<form>控件的action屬性。具體地來說,你可利用新的 ASP.NET 2.0控件適配器 擴(kuò)展架構(gòu)來定制控件的輸出,用你提供的值來覆蓋action屬性的值。 這不要求在你的.aspx頁面里做任何編碼改動 ,而只要在你的/app_browsers文件夾里添加一個.browser文件,注冊使用一個控件適配類即可輸出新的action屬性。

技巧/訣竅:在ASP.NET中重寫URL

你可在這里查看一個我創(chuàng)建的樣例實現(xiàn),其展示了該 如何實現(xiàn)與URL重寫協(xié)作的表單控件適配器(Form Control Adapter) 。它在我上面使用的第一個(Request.PathInfo),第二個方法(UrlRewriter.Net 模塊)中都工作,它使用Request的RawUrl屬性獲取原先沒改寫過的 URL來顯示。而在第四個方法(ISAPIRewrite過濾器)中,你可以獲取ISAPI過濾器保存在Request.ServerVariables["HTTP_X_REWRITE_URL"] 中的原先的URL值。

我上面的FormRewriter類實現(xiàn)在標(biāo)準(zhǔn)的ASP.NET和ASP.NET AJAX 1.0網(wǎng)頁上應(yīng)該都工作(如果你遇上問題的話,告訴我一聲)。

正確地處理CSS和圖像引用

不少人在第一次使用URL重寫時,有時會遇上一個疑難雜癥,就是他們發(fā)現(xiàn)他們的圖像和CSS樣式表引用有時會停止工作。這是因為他們在HTML網(wǎng)頁里有對這些文件的相對引用,當(dāng)你開始在應(yīng)用里重寫URL時,你需要意識到瀏覽器經(jīng)常會在不同的邏輯層次結(jié)構(gòu)層上(logical hierarchy levels)請求文件,而不是實際存儲在服務(wù)器上的東西。

譬如,如果我們上面的/products.aspx網(wǎng)頁對.aspx 網(wǎng)頁里的logo.jpg有一個相對引用,但是通過 /products/books.aspx這個URL來請求的,那么瀏覽器在顯示網(wǎng)頁時,將會發(fā)出一個對/products/logo.jpg的請求,而不是對/logo.jpg的請求。要正確地引用這個文件,確認(rèn)你用根目錄限定了(root qualify)CSS和圖像引用(“/style.css”,而不是 “style.css”)。對于ASP.NET控件,你也可以使用“~”句法從你應(yīng)用的根目錄來引用文件(譬如,<asp:image imageurl="~/images/logo.jpg" runat="server"/>) 。

希望本文對你有所幫助,

附注:想學(xué)習(xí)更多的ASP.NET 2.0技巧和訣竅的話,請查看一下我的 ASP.NET 2.0技巧,訣竅和教程網(wǎng)頁

附注2:特別感謝Scott Hanselman 和Michael K. Campbell在他們的網(wǎng)站測試我的表單控件適配器 (Form Control Adapter)。

技巧/訣竅:在ASP.NET中重寫URL


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲人人干 | 色中色资源站 | 色综合伊人色综合网亚洲欧洲 | 国产小视频在线观看免费 | 久久青草91线频免费观看 | 人喾交性专区免费看 | 国产乱码亚洲精品一区二区 | 国产ww久久久久久久久久 | 九九成人 | 久久亚洲精品玖玖玖玖 | 天天草天天草 | 成人 亚洲 成人影院 | 亚洲欧洲日产国码天堂 | 国产精品久久久久久久久久久搜索 | 国产高清福利91成人 | 热久久精品免费视频 | 91久久线看在观草草青青 | 国产精品久久自在自2021 | 一级欧美在线的视频 | 中文字幕在线观看一区二区三区 | 亚洲在线视频观看 | 国产羞羞事1000部在线观看 | 成人国产精品免费视频不卡 | 成人激情开心网 | 最近免费中文字幕大全免费版视频 | 久99久热只有精品国产99 | 国产高清精品久久久久久久 | 91热久久免费频精品黑人99 | 日韩一二区 | 国产精品久久久久久久9999 | 欧美精品午夜 | 欧美毛片aaaaa片久久久久 | 九九在线观看高清免费 | 午夜dj影院在线视频观看完整 | 99婷婷| 久久精视频 | 男人的天堂在线精品视频 | 香蕉视频亚洲一级 | 国产臀控福利视频在线 | 久久国产欧美日韩精品免费 | 欧做爰xxxⅹ性欧美大片孕妇 |