松下客
動(dòng)態(tài)生成的網(wǎng)頁(yè)在構(gòu)造真正大型的網(wǎng)站時(shí)是不可缺少的。但是,動(dòng)態(tài)頁(yè)面的名字(即它的URL)往往缺乏明確的含義。例如,名為product.asp?Id=4的頁(yè)面總不如名為/applicances/dishwashers/Model3809.htm的頁(yè)面來(lái)得好記。本文介紹如何實(shí)現(xiàn)靜態(tài)頁(yè)面名字和動(dòng)態(tài)頁(yè)面的映射。 概述 靜態(tài)頁(yè)面名字除了具有含義更明確這一優(yōu)點(diǎn)之外,它的另外一個(gè)優(yōu)點(diǎn)在于搜索引擎能夠索引這些頁(yè)面。大多數(shù)搜索引擎,如Alta Vista和Yahoo,不會(huì)檢索URL中帶有問(wèn)號(hào)的頁(yè)面,因?yàn)樗鼈儞?dān)心進(jìn)入永無(wú)止境的鏈接迷宮。把動(dòng)態(tài)頁(yè)面名字轉(zhuǎn)換成靜態(tài)頁(yè)面名字之后,搜索引擎就會(huì)對(duì)這些頁(yè)面進(jìn)行索引和分類(lèi),從而為網(wǎng)站帶來(lái)更多的訪(fǎng)問(wèn)量。 要使用本文介紹的方法將動(dòng)態(tài)名字轉(zhuǎn)換成靜態(tài)名字,你必須使用Windows 2000和IIS 5.0。IIS 5.0的兩個(gè)改進(jìn)使得我們可以實(shí)現(xiàn)這種轉(zhuǎn)換,它們是:使用Server.Transfer的“自定義錯(cuò)誤信息”功能以及在ASP頁(yè)面中使用Server.Transfer的能力。雖然IIS 4.0也支持自定義錯(cuò)誤信息,但它使用的是Response.Redirect,沒(méi)有用,所以本文方法要求使用IIS 5.0。Response.Redirect之所以沒(méi)有用,是因?yàn)樗阉饕娌粫?huì)追隨重定向。 使用本文所介紹的方法,網(wǎng)站開(kāi)發(fā)者先用靜態(tài)風(fēng)格的URL鏈接事實(shí)上并不存在的頁(yè)面。然后設(shè)置IIS服務(wù)器,告訴它要用指定的ASP頁(yè)面(404.asp)來(lái)處理網(wǎng)站上出現(xiàn)的所有404錯(cuò)誤。在這個(gè)404.asp頁(yè)面里,把原來(lái)的URL轉(zhuǎn)換成正式的動(dòng)態(tài)URL,利用Server.Transfer執(zhí)行并向用戶(hù)瀏覽器返回目標(biāo)頁(yè)面。 假設(shè)有如下URL: http://www.myserver.com/applicances/dishwashers/kenmore/Model3809.htm 其中myserver.com以網(wǎng)站的域名取代,該URL將返回404錯(cuò)誤。我們首先要做的是用某個(gè)專(zhuān)用的.asp頁(yè)面來(lái)處理所有這些404錯(cuò)誤。這可以用IIS 5.0的“自定義錯(cuò)誤信息”功能來(lái)實(shí)現(xiàn)。設(shè)置該功能的過(guò)程如下: ●在MMC中打開(kāi)IIS服務(wù)器管理器 ●右擊Web網(wǎng)站節(jié)點(diǎn),然后選擇“屬性” ●點(diǎn)擊“自定義錯(cuò)誤信息”頁(yè) ●向下滾動(dòng),直至找到404錯(cuò)誤 ●雙擊404錯(cuò)誤,打開(kāi)“錯(cuò)誤映射屬性”對(duì)話(huà)框 ●將消息類(lèi)型改為URL ●在URL框輸入“/404.asp” ●點(diǎn)擊“確定”關(guān)閉窗口 現(xiàn)在404錯(cuò)誤已經(jīng)由404.asp處理了。當(dāng)IIS調(diào)用404.asp頁(yè)面時(shí),它會(huì)提供導(dǎo)致這個(gè)404錯(cuò)誤的URL,這對(duì)我們來(lái)說(shuō)是非常有用的。 錯(cuò)誤處理頁(yè)面 接下來(lái)我們創(chuàng)建處理錯(cuò)誤的404.asp頁(yè)面。首先要做的是獲得導(dǎo)致這個(gè)404錯(cuò)誤的頁(yè)面名字。下面這行代碼從查詢(xún)字符串提取這個(gè)頁(yè)面的名字: < % '獲得頁(yè)面名字 strQ = Request.ServerVariables("QUERY_STRING") % > 那么,strQ中的哪些內(nèi)容才是重要的呢?在上例中它應(yīng)該如下所示:/applicances/dishwashers/kenmore/Model3809.htm。我們真正需要的只有其中的Model3809(產(chǎn)品型號(hào)),因?yàn)檫@是產(chǎn)品數(shù)據(jù)庫(kù)中的唯一鍵。下面這幾行代碼根據(jù)產(chǎn)品型號(hào)找出產(chǎn)品的ID(編號(hào)): < % ' 計(jì)算產(chǎn)品型號(hào) nIndex = InStrRev(strQ,"/") If (nIndex >0) Then strModelNumber = Right(strQ,Len(strQ)-nIndex) strQ = Left(strQ,nIndex-1) End If ' 從產(chǎn)品型號(hào)去掉.htm后綴 If ((Mid(strPageName,Len(strPageName),1)="m") And _ (Mid(strPageName,Len(strPageName)-1,1)="t") And _ (Mid(strPageName,Len(strPageName)-2,1)="h") And _ (Mid(strPageName,(strPageName)-3,1)=".")) Then strModelNumber =Left(strPageName,Len(strModelNumber)-4) End If ' 從產(chǎn)品數(shù)據(jù)庫(kù)查找產(chǎn)品編號(hào) strSQL = "SELECT Product_Id FROM Product " _ & "WHERE Product_Model = '" & strModelNumber & "'" Set oRS = oConn.Execute(strSQL) If (Not oRS.EOF) Then lProductId = oRS("Product_Id") End If % > 現(xiàn)在我們得到了產(chǎn)品編號(hào),在轉(zhuǎn)換到正確的ASP頁(yè)面之前必須先保存它。我們無(wú)法通過(guò)Server.Transfer在查詢(xún)字符串中傳遞產(chǎn)品編號(hào)(這是IIS的一個(gè)局限),因此必須通過(guò)Session對(duì)象來(lái)傳遞它。 < % Session("Id") = lProductId Server.Transfer("/product.asp") % > 執(zhí)行這個(gè)頁(yè)面時(shí),瀏覽器地址欄中的內(nèi)容如下: http://www.myserver.com/applicances/dishwashers/kenmore/Model3809.htm 由于使用了Server.Transfer,瀏覽器地址欄中的URL不會(huì)改變,同樣瀏覽器也不需要與服務(wù)器再交互一次,這與Response.Redirect是不同的。 另外也請(qǐng)注意URL中的目錄是根本不存在的,事實(shí)上在這里URL中除了服務(wù)器名字之外的其余內(nèi)容根本不起什么作用。例如,下面的幾個(gè)URL都將返回同一頁(yè)面。 http://www.myserver.com/Model3809.htm http://www.myserver.com/trucks/ford/Model3809.htm 那么為什么要加上這么多目錄呢?這些目錄將提高搜索引擎對(duì)網(wǎng)站的評(píng)價(jià)。一些搜索引擎認(rèn)為URL中的單詞是比頁(yè)面標(biāo)題和正文更重要的搜索關(guān)鍵詞,所以目錄名字是非常重要的。 調(diào)用不存在的頁(yè)面 我們已經(jīng)討論了將并不存在的URL轉(zhuǎn)換為有效動(dòng)態(tài)URL的技術(shù)。然而,要讓搜索引擎能夠索引這些頁(yè)面,我們還需要鏈接這些并不存在的URL。換句話(huà)說(shuō),只有當(dāng)我們鏈接了Model3809.htm頁(yè)面后搜索引擎才會(huì)發(fā)現(xiàn)它。 以前鏈接這種頁(yè)面時(shí)我們只需按照如下方式給出產(chǎn)品編號(hào):“product.asp?Id=4”。現(xiàn)在我們就來(lái)構(gòu)造一個(gè)以產(chǎn)品編號(hào)為參數(shù)返回恰當(dāng)URL的函數(shù)。 < % Function CreateProductURL(lProductId) strSQL = "SELECT Product_Model FROM Product " _ & "WHERE Product_Id =" & lProductId Set oRS = oConn.Execute(strSQL) If (Not oRS.EOF) Then strModel = oRS("Product_Model") End If CreateProductURL = "/" & strModel & ".htm" End Function % > 現(xiàn)在如果我們要加入U(xiǎn)RL,只需按照如下方式進(jìn)行: < A HREF="< %=CreateProductURL(4)% >" >洗碗機(jī)< /A > 本例我們假定不知道產(chǎn)品型號(hào)名稱(chēng),必須查詢(xún)數(shù)據(jù)庫(kù)才能得知。但在現(xiàn)實(shí)中可能并非如此,我們知道產(chǎn)品的型號(hào)名稱(chēng),可以直接創(chuàng)建URL而無(wú)需再次訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。 性能問(wèn)題 本文所介紹的方法會(huì)明顯地影響性能。首先,為了創(chuàng)建靜態(tài)風(fēng)格的URL它需要一次數(shù)據(jù)庫(kù)調(diào)用。其次,為了從產(chǎn)生404的URL出發(fā)得到正確的URL,它還要增加一次額外的數(shù)據(jù)庫(kù)調(diào)用。最后,兩次Server.Transfer需要較大的開(kāi)銷(xiāo)。 不過(guò),有些性能問(wèn)題可以用XCache(www.postpointsoft.com)來(lái)解決。XCache能夠把出現(xiàn)404錯(cuò)誤的URL轉(zhuǎn)換到正確的頁(yè)面,并緩存該信息以供后來(lái)的請(qǐng)求使用。 實(shí)例 請(qǐng)?jiān)L問(wèn)http://www.kulshan.com,這是一個(gè)應(yīng)用本文技術(shù)的例子。Kulshan.com的大多數(shù)分支頁(yè)面,如餐館、飯店的評(píng)論,都為了在搜索引擎中獲得更高的評(píng)價(jià)而使用了這種技術(shù)。Kulshan.com也使用了XCache。 小結(jié) 利用IIS 5.0的自定義錯(cuò)誤信息功能控制404錯(cuò)誤可以為動(dòng)態(tài)頁(yè)面制作出靜態(tài)頁(yè)面風(fēng)格的URL。只要無(wú)需創(chuàng)建這些靜態(tài)URL所用到的目錄和文件,那么應(yīng)該說(shuō)創(chuàng)建這種既利于市場(chǎng)宣傳、也利于搜索引擎排位的URL是相當(dāng)簡(jiǎn)單的。
|
溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!