概要
分析如何使用微軟提供的來對動態產生的URL地址進行網址重寫
內容簡介
稍微花點時間看一看你做的網站裡頭的URL地址
如上所述
在老版本ASP中
網址重寫的一般用途
創建一個數據操作的ASP
創建一個包含類似這樣網址的網站最終有兩種結果
· 是否簡短
· 是否易於輸入
· 是否將站點結構形象化
· 是否具有隱蔽性
我想還應該在上述列表中再增加一條
一種較好的方法就是使用一種比較直觀且容易記憶的方式來將網址表示為
注
網址重寫技術除了用於將復雜的網址簡單化之外
當一個Web請求傳送到IIS會發生什麼?
在探討如何實現網址重寫這項技術之前
例如
你可以自定義IIS
圖一.已配置的文件擴展名映射
關於對IIS如何管理所接收的請求的詳細探討有些超出本文內容
用ISAPI過濾器來分析請求
除了將請求的文件擴展名映射到相應的ISAPI應用程序外
如同ISAPI應用程序一樣
· 權限控制與授權(Authentication and Authorization)
· 日志記錄與監視(Logging and Monitoring)
· HTTP內容壓縮(HTTP Compression)
· 網址重寫(URL Rewriting)
本文所探討的用ASP
當一個請求傳入ASP
ASP
· 在處理接收的請求的生命期內也會產生事件
· 允許任意數量的HttpModule操控產生的事件
· 將請求的資源委托給HttpHandler處理
和IIS一樣
如上所述
回憶在IIS中
所有通過ASP
ASP
圖二描繪了一個針對ASP
圖二.IIS和ASP
創建並注冊自定義HttpModule和HttpHandler
創建自定義HttpModule的工作相對較簡單
一旦HttpModule和HttpHandler被創建後
例如
<HttpModules>
<add type=
</HttpModules>
其中type屬性為HttpModule的標識號和類庫名稱
HttpHandler和HttpHandlerFactory則是 在nfig文件中configuration\System
<httpHandlers>
<add verb=
</HttpModules>
回憶上文
<httpHandlers>
<add varb=
</httpHandlers>
其中 type是我們定義的HttpHandler的類型
注意
實現網址重寫
網址重寫技術不但可以在IIS Web服務器一級通過ISAPI過濾器實現
構建網址重寫引擎
在ASP
在微軟
為了實現ASP
·根據請求的路徑決定所需要重寫的路徑
·重寫路徑
以前文所構建的那個站點為例
使用HttpModule來調用網址重寫
在ASP
HttpModule
事件
簡介
FormsAuthenticationModule
AuthenticateRequest
判斷用戶是否已通過表單授權方式獲取授權
回想一下BeginRequest事件在AuthenticateRequest事件之前引發
實現網址重寫的一個較為安全的場合就是把它放在在BeginRequest事件中執行
如果把網址重寫放在BeginRequest事件或者AuthenticateRequest事件中
同上類似
為了解決這個微妙的問題
假定有一群用戶並沒有Windows級別的訪問權限訪問C:\inetpub\wwwroot\info\employee
那麼什麼時候在HttpModule調用網址重寫合適呢?他決定於所使用的驗證方式
使用HttpHandler來調用網址重寫
除了上面所述方法外
本節將著眼於為這些ASP
要通過一個HttpHandler來調用網址重寫
在所有HttpModule被初始化後
下一章我們著眼於如何構建一個可重用的網址重寫引擎
使用網址重寫引擎實現簡單的網址重寫
為了便於在Web應用程序中實現網址重寫
·可以在nfig文件中為頁面開發者定義其所使用的網址重寫引擎的規則
·通過使用正則表達式來使所制定的網址重寫規則具有更加強大的重寫能力
·能夠通過簡單配置即可在HttpModule和HttpHandler中使用網址重寫
本節只探討通過HttpModule來實現網址重寫
我們來探討一下在nfig中網址重寫規則的配置節
<!
<HttpModules>
<add type=
</HttpModules>
<!
<httpHandlers>
<add verb=
</httpHandlers>
被注釋掉的<HttpModules>為配置使用HttpModule調用網址重寫
不論配置使用<HttpModules>還是<httpHandlers>調用網址重寫
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>pattern to look for</LookFor>
<SendTo>String to replace pattern with </SendTo>
</RewriterRule>
<RewriterRule>
<LookFor>pattern to look for</LookFor>
<SendTo>String to replace pattern with </SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
每一條規則都用一個<RewriterRule>元素表示
配置<LookFor>節要使用正則表達式來進行字符串匹配和替換
創建一個HttpModule很簡單
·Init(HttpApplication)
·Dispose()
為了更加方便地為網址重寫創建HttpModule
通過對該基類的繼承
public abstract class BaseModuleRewriter : IHttpModule
{
public virtual void Init(HttpApplication app) {
// WARNING! This does not work with Windows authentication!
// If you are using Windows authentication
// change to app
app
}
public virtual void Dispose() {}
protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender
HttpApplication app = (HttpApplication) sender;
Rewrite(app
}
protected abstract void Rewrite(string requestedPath
}
注意
ModuleRewriter繼承自BaseModuleRewriter
protected override void Rewrite(string requestedPath
{
// get the configuration rules
RewriterRuleCollection rules = RewriterConfiguration
// iterate through each rule
for(int i =
{
// get the pattern to look for
// Resolve the Url (convert ~ into the appropriate directory)
string lookFor =
RewriterUtils
// Create a regex (note that IgnoreCase is set)
Regex re = new Regex(lookFor
// See if a match is found
if (re
{
// match found
string sendToUrl = RewriterUtils
// Rewrite the URL
RewriterUtils
break; // exit the for loop
}
}
}
該Rewriter()方法以獲取nfig文件中的網址重寫規則的設置為起始
如果發現一條匹配
注意
我們已經探討了主要的部分
為了更好地示范網址重寫引擎的運行
分類編號(CategoryID) 分類名稱(CategoryName)
假定已經建立好一個名為ListProductsByCategoryID
顯然這裡發現了一個網址重寫的案例
<RewriterConfig>
<Rules>
<! —
<RewriterRule>
<LookFor>~/Products/Baverage
<SendTo>~/ListProductsByCategoryID
</RewriterRule>
</Rules>
</RewriterConfig>
很明顯地看到
注意
通過該規則定義
圖三.網址重寫後的對商品分類的請求
和/Products/Baverage
為了讓該網址更具有
要認識為什麼這些額外的步驟是必須的
所以我們需要創建一個/Products/目錄並在該目錄下額外創建一個空文件Default
<RewriterRule>
<LookFor>~/Products/Default
<SendTo>~ListCategories
</RewriterRule>
通過該規則
圖四
如果要重寫的網址上包含有服務器端Web Form並執行數據回送
之所以發生這種現象的原因是當Web Form在呈現之時就明確地設置其action屬性為當前Request對象中文件路徑的值
然而不幸的是該Web Form不會允許你指定action屬性
感謝繼承這個強大的功能
namespace ActionlessForm
{
public class Form:System
{
protected override void RenderAttributes(System
{
writer
base
writer
base
this
base
if (base
{
writer
}
}
}
}
對RenderAttributes()方法重載的代碼包含了原類HtmlForm的RenderAttributes()方法全部的代碼內容
當創建並編譯了這個類後
<% @ Register TagPrefix =
然後將<Form runat=
<skm:Form id=
並將結束標記</Form>替換為
<skm:Form>
你可以查看該文檔相關下載中的ListProductsByCategoryID
注意
創建真正
上一節簡單網址重寫的示例展示了如何通過新的網址重寫規則來輕松地配置網址重寫引擎
時下正在流行Blog
Blog可以在任何地點由作者進行更新
在維護一個Blog的時候
首先
然後
<RewriterConfig>
<Rules>
<!
<RewriterRule>
<LookFor>~/(d{
<SendTo>~/ShowBlogContent
</RewriterRule>
<RewriterRule>
<LookFor>~/(d{
<SendTo><![CDATA[~/ShowBlogContent
</RewriterRule>
<RewriterRule>
<LookFor>~/(d{
<SendTo>~/ShowBlogContent
</RewriterRule>
</Rules>
</RewriterConfig>
這些網址重寫規則展示了正則表達式的強大威力
注意
下面圖五
圖五
圖六
圖七
注意
創建必須的目錄結構
當IIS接收到對/
通過這種方法你得手動為每一年的Blog創建一個年份的目錄並在該年份下放置一個默認文件Default
很明顯
關於對所有類型文件的處理的詳細討論已經超出了本書范圍
結束語
本文探討了通過類HttpContext類的RewriteUrl()方法來實現ASP
網址重寫不但可以在HttpModule中執行
當然
From:http://tw.wingwit.com/Article/program/net/201311/12964.html