天天看點

秋色園QBlog技術原了解析:UrlRewrite之無字尾URL原理(三)

文章回顧:

鑒于園子裡有很多UrlRewrite的文章,是以就不略為簡單的講解了:

一:用ISAPI篩選器:即網上第三方釋出的比較常見的,如:RewriteEval.dll

2:我負責部落格使用者背景,另一同僚負責寫部落格前台

3:一女同僚負責寫js外挂

4:2個美工負責寫了好幾套模版

5:另一個同僚折騰了個中文轉拼音的。

6:一共花了3個月左右的時間,開發了出來。

以前7個人幹的活,現在,我一個人幹了,知道我有多不容易了吧。

還弄了個空間域名51xxdn,便宜沒好貨,150/一年的伺服器三天兩頭就打不開,一天到晚是和客服溝通。一年後站點到期後我就扔了,連備案過的域名也不要了。

當年使用第三方插件時,遇到麻煩的地方:

需要把dll送出給客服,然後還要教客服的技術人員怎麼添加,最可怕的是還要重新開機IIS才生效。

人家一個伺服器放那麼多網站,咋能随随便便的讓要求重新開機IIS呢?可是不重新開機你的站點又又打不開,是以每次還要挑無中午吃飯的時間重新開機,重新開機後還是不行,不行咋折騰?

過了一會客服技術又說行了,勉強運作了起來,後來發現該伺服器還是相當的經常性的重新開機IIS,因為站點老是打不開。

還有每次修改代碼修改或增加URL規則時,又得叫人家重新開機下IIS,唉,那個折騰,人家也折騰。

二:IHttpModule的RewritePath方法

自己來,怎麼來?用C++寫個ISAPI會不會?答:不會。

那就來點簡單的了:從Global.asax折騰到IHttpHandle,折騰了半天,搞錯了方向,轉來轉去還是在原地,後來經地的那麼一搜,才發現了,路子要走還得往IHttpModule上走。

用IHttpModule很容易,很多人都用這個折騰,寫個類繼承自IHttpModule,然後到配置檔案裡注冊一下就可以了,示例如下:

1:建立類庫項目:起名:UrlRewrite

2:添加引用System.Web,因為IHttpModule在這名稱空間下,而類庫預設是沒引用這個的

3:把Class1.cs更名為UrlRewrite.cs,并讓類繼承自IHttpModule,實作接口,最終如下:

秋色園QBlog技術原了解析:UrlRewrite之無字尾URL原理(三)

把着我們把代碼小小調整一下如:

#region IHttpModule 成員

public void Dispose()

{

//throw new Exception("The method or operation is not implemented.");

}

public void Init(HttpApplication context)

context.BeginRequest += new EventHandler(context_BeginRequest);

void context_BeginRequest(object sender, EventArgs e)

HttpApplication app = (HttpApplication)sender;

HttpUrlRewrite(app.Context);

public void HttpUrlRewrite(HttpContext context)

string url = context.Request.Url.ToString();//使用者請求的Url

//--這裡要做很多Url邏輯處理

context.RewritePath("~/Default.aspx", null,"url="+url);

#endregion

上面的代碼,意思為:

将整個請求的url都當成參數送到Default.aspx頁面中,所有的請求都轉化為Default.aspx?url=www.cyqdata.com類似的方式

下面再建一個站點,來接受并輸出結果

4:添加建立網站起名:UrlRewriteDemo

ps:本來是要建應用程式的,怕大夥下載下傳示例時打不開,是以示例用網站形式

5:添加對UrlRewrite項目的引用

6:F5一下,調出web.config,然後在配置檔案添加配置項代碼如下:

< httpModules>

< add name="UrlRewrite" type="UrlRewrite.UrlRewrite,UrlRewrite" />

< /httpModules>

目前情況示例如圖:

秋色園QBlog技術原了解析:UrlRewrite之無字尾URL原理(三)

然後到Default.aspx寫一行代碼輸出接收到的參數:

protected void Page_Load(object sender, EventArgs e)

Response.Write(Request["url"]);

一切就緒,運作,我們看結果:

圖1:請求預設存在的頁面,輸出結果,表示很正常

秋色園QBlog技術原了解析:UrlRewrite之無字尾URL原理(三)

圖2:随便請求一個不存在頁面,輸出了結果,表示也很正常

秋色園QBlog技術原了解析:UrlRewrite之無字尾URL原理(三)

圖3:請求一個連字尾都沒有的Url,輸出了結果,表示有點驚訝

秋色園QBlog技術原了解析:UrlRewrite之無字尾URL原理(三)

從圖3看出,看來VS2005內建的IIS對所有的請求都統一處理了,是以連無字尾的也能處理

重點說明:

對于以IIS站點開發或最終部署來說,預設aspnet_isapi.dll是處理不了無字尾或圖檔等字尾的,是以,需要通過添加擴充“通用映射”能達到此功能。

從以上解析的内容可以看出,已經可以截取到使用者輸出的任意請求位址,包括無字尾。

那麼秋色園具體是如何處理各種請求的,讀取配置檔案得用正則解析還是說其它?

見下篇為你解析内部實作原理,敬請關注。

秋色園QBlog技術原了解析:UrlRewrite之無字尾URL原理(三)

     本文轉自cyq1162 51CTO部落格,原文連結:http://blog.51cto.com/cyq1162/499456,如需轉載請自行聯系原作者

繼續閱讀