動態生成的網頁在構造真正大型的網站時是不可缺少的。但是,動態頁面的名字(即它的URL)往往缺乏明確的含義。例如,名為product.asp?Id=4的頁面總不如名為/applicances/dishwashers/Model3809.htm的頁面來得好記。本文介紹如何實現靜態頁面名字和動態頁面的映射。
概述
靜態頁面名字除了具有含義更明確這一優點之外,它的另外一個優點在於搜索引擎能夠索引這些頁面。大多數搜索引擎,如Alta Vista和Yahoo,不會檢索URL中帶有問號的頁面,因為它們擔心進入永無止境的鏈接迷宮。把動態頁面名字轉換成靜態頁面名字之後,搜索引擎就會對這些頁面進行索引和分類,從而為網站帶來更多的訪問量。
要使用本文介紹的方法將動態名字轉換成靜態名字,你必須使用Windows 2000和IIS 5.0。IIS 5.0的兩個改進使得我們可以實現這種轉換,它們是:使用Server.Transfer的“自定義錯誤信息”功能以及在ASP頁面中使用Server.Transfer的能力。雖然IIS 4.0也支持自定義錯誤信息,但它使用的是Response.Redirect,沒有用,所以本文方法要求使用IIS 5.0。Response.Redirect之所以沒有用,是因為搜索引擎不會追隨重定向。
使用本文所介紹的方法,網站開發者先用靜態風格的URL鏈接事實上並不存在的頁面。然後設置IIS服務器,告訴它要用指定的ASP頁面(404.asp)來處理網站上出現的所有404錯誤。在這個404.asp頁面裡,把原來的URL轉換成正式的動態URL,利用Server.Transfer執行並向用戶浏覽器返回目標頁面。
假設有如下URL:
http://www.myserver.com/applicances/dishwashers/kenmore/Model3809.htm
其中myserver.com以網站的域名取代,該URL將返回404錯誤。我們首先要做的是用某個專用的.asp頁面來處理所有這些404錯誤。這可以用IIS 5.0的“自定義錯誤信息”功能來實現。設置該功能的過程如下:
●在MMC中打開IIS服務器管理器
●右擊Web網站節點,然後選擇“屬性”
●點擊“自定義錯誤信息”頁
●向下滾動,直至找到404錯誤
●雙擊404錯誤,打開“錯誤映射屬性”對話框
●將消息類型改為URL
●在URL框輸入“/404.asp”
●點擊“確定”關閉窗口
現在404錯誤已經由404.asp處理了。當IIS調用404.asp頁面時,它會提供導致這個404錯誤的URL,這對我們來說是非常有用的。
錯誤處理頁面
接下來我們創建處理錯誤的404.asp頁面。首先要做的是獲得導致這個404錯誤的頁面名字。下面這行代碼從查詢字符串提取這個頁面的名字:
< %
'獲得頁面名字
strQ = Request.ServerVariables("QUERY_STRING")
% >
那麼,strQ中的哪些內容才是重要的呢?在上例中它應該如下所示:/applicances/dishwashers/kenmore/Model3809.htm。我們真正需要的只有其中的Model3809(產品型號),因為這是產品數據庫中的唯一鍵。下面這幾行代碼根據產品型號找出產品的ID(編號):
< %
' 計算產品型號
nIndex = InStrRev(strQ,"/")
If (nIndex >0) Then
strModelNumber = Right(strQ,Len(strQ)-nIndex)
strQ = Left(strQ,nIndex-1)
End If
' 從產品型號去掉.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
' 從產品數據庫查找產品編號
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
% >
現在我們得到了產品編號,在轉換到正確的ASP頁面之前必須先保存它。我們無法通過Server.Transfer在查詢字符串中傳遞產品編號(這是IIS的一個局限),因此必須通過Session對象來傳遞它。
< %
Session("Id") = lProductId
Server.Transfer("/product.asp")
% >
執行這個頁面時,浏覽器地址欄中的內容如下:
http://www.myserver.com/applicances/dishwashers/kenmore/Model3809.htm
由於使用了Server.Transfer,浏覽器地址欄中的URL不會改變,同樣浏覽器也不需要與服務器再交互一次,這與Response.Redirect是不同的。
另外也請注意URL中的目錄是根本不存在的,事實上在這裡URL中除了服務器名字之外的其余內容根本不起什麼作用。例如,下面的幾個URL都將返回同一頁面。
http://www.myserver.com/Model3809.htm
http://www.myserver.com/trucks/ford/Model3809.htm
那麼為什麼要加上這麼多目錄呢?這些目錄將提高搜索引擎對網站的評價。一些搜索引擎認為URL中的單詞是比頁面標題和正文更重要的搜索關鍵詞,所以目錄名字是非常重要的。
調用不存在的頁面
我們已經討論了將並不存在的URL轉換為有效動態URL的技術。然而,要讓搜索引擎能夠索引這些頁面,我們還需要鏈接這些並不存在的URL。換句話說,只有當我們鏈接了Model3809.htm頁面後搜索引擎才會發現它。
以前鏈接這種頁面時我們只需按照如下方式給出產品編號:“product.asp?Id=4”。現在我們就來構造一個以產品編號為參數返回恰當URL的函數。
< %
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
% >
現在如果我們要加入URL,只需按照如下方式進行:
< A HREF="< %=CreateProductURL(4)% >" >洗碗機< /A >
本例我們假定不知道產品型號名稱,必須查詢數據庫才能得知。但在現實中可能並非如此,我們知道產品的型號名稱,可以直接創建URL而無需再次訪問數據庫。
性能問題
本文所介紹的方法會明顯地影響性能。首先,為了創建靜態風格的URL它需要一次數據庫調用。其次,為了從產生404的URL出發得到正確的URL,它還要增加一次額外的數據庫調用。最後,兩次Server.Transfer需要較大的開銷。
不過,有些性能問題可以用XCache(www.postpointsoft.com)來解決。XCache能夠把出現404錯誤的URL轉換到正確的頁面,並緩存該信息以供後來的請求使用。
實例
請訪問http://www.kulshan.com,這是一個應用本文技術的例子。Kulshan.com的大多數分支頁面,如餐館、飯店的評論,都為了在搜索引擎中獲得更高的評價而使用了這種技術。Kulshan.com也使用了XCache。
小結
利用IIS 5.0的自定義錯誤信息功能控制404錯誤可以為動態頁面制作出靜態頁面風格的URL。只要無需創建這些靜態URL所用到的目錄和文件,那麼應該說創建這種既利於市場宣傳、也利於搜索引擎排位的URL是相當簡單的。