說明
IIRF與ISAPI_Rewrite的規劃區別只在於IIRF不需要使用逸出字元\,而ISAPI_Rewrite則需要使用逸出字元\.
介紹
IIRF是一款開源的重寫URL過濾器,類似於Apache的URL重寫,基於VC8.0(可以用Visual Studio2005或Visual C++ 2005 Express重新編譯)開發。它可以運行在IIS5.0+,支援ASP,ASP.NET,PHP等許多格式。相對比ASP.NET2.0內建的URL重寫,具有更好的效能和許多我們所需要特性,重要的一點在於:它可以支援無副檔名的URL(例如:cnlbogs.com/****,你無需在建立一個預設的default.aspx檔案,IIRF自動會幫你解析),讓URL更加的方便我們記憶,也能進一步提高搜尋的排名?IIRF能夠在aspnet_isapi提前捕獲我們所請求的URL進行處理,如果我們訪問cnlbogs.com/a.aspx,需要擷取cnlbogs.com/a.htm,步驟需要(iis-aspnet_isapi),通過IIRF,我們可以直接跳aspnet_isapi.dll,直接存取a.htm,要知道,這種方式在ASP.NET是無法實現的。
IIRF跟ASP.NET重寫URL一樣,它也是基於正則的方式來匹配,具有LOG記錄,請求的條件判斷。還是進入正題吧。
安裝
IIRF安裝需要我們手動操作來完成。不過。也是很方便了。
1 將IsapiRewrite4.dll, IsapiRewrite4.ini複製到c:\windows\system32\inetsrv(你也可以複製到其它適當的檔案夾下面)。
IsapiRewrite4.ini是IIRF設定檔,每次該檔案更改之後,IIRF會自動重新載入該檔案,無需重啟IIS來重新載入配置,如果您修改後INI檔案後格式不正確,IIRF將會自動擷取最後正確載入的設定檔。
2 開啟IIS管理器,選擇“預設網站”,右擊“屬性”,選擇“ISAPI篩選器”,點擊“添加”,輸入篩選器名稱:Ionic Rewriter,可執行檔選擇上面複製到c:\windows\system32\inetsrv下面的IsapiRewrite4.dll檔案,點“確定”。
3重啟IISADMIN service服務。(在電腦管理----windows服務裡面)
4 完成。
日誌
IIRF能夠將INI設定檔載入,使用者的URL請求記錄都會儲存到指定的記錄檔裡。因為它具有很大的效能開銷,因此建議將它日誌的記錄等級設為0,只有
為了方便調試的時候時候,可以設定為5,
RewriteLog 儲存的日誌路徑,如 c:\temp\iirfLog.out
RewriteLogLevel {0,1,2,3,4,5} 日誌的等級,預設值為0
0 –不會記錄日誌
1- 少許的日誌
2- 比較多的日誌
3- 比較詳細的日誌
4- 詳細的日誌(4),並會跟蹤server variable和替換的字串。
5- 詳細的日誌(5),包括記錄檔更改的事件,建議方便調試的時候使用
正則
正則的文法跟.NET一樣,只不過是格式不一樣而已。所以我也不在詳細介紹。具體有關正則的說明大家可以用GOOGLE搜尋。
格式:
RewriteRule <url-pattern> <replacement-string> [<modifiers>]
url-pattern:匹配的Regex(必需)
replacement-string:要替換的字串(必需)
modifiers:有關對RewriteRule的操作標記。可選選項。在下面我會說明
預設下IIRF的url-pattern,replacement-string正則的前面已經帶了主機頭的。
為了方便描述,直接看幾個樣本(以下樣本基本全部來源IIRF文檔)
RewriteRule ^/original/(.*).php /modified/$1.aspx
源:http://xxx/original/index.php
目標:http://xxx/modified/index.aspx
RewriteRule ^/dinoch/album/([^/]+)/([^/]+).(jpg|JPG|PNG) /chiesa/pics.aspx?d=$1&p=$2.$3
源:http://xxx/dinoch/album/30/1.jpg
目標:http://xxx/chiesa/pics.aspx?d=30&p=1.jpg
比較簡單,主要還在於modifiers的功能。下面列舉了它的所有值,允許組合(如[R,L])。
R = Redirect(URL跳轉到<replacement-string>地址)
NF = Not found(返回404錯誤給使用者,但該檔案並未移除,還是保留在網站中)
L = Last test if match(如果已經匹配,將不在繼續匹配下去)
F = Forbidden(跟NF標誌相似,)
I = Do case-insensitive matching
U = Store original url in server Variable HTTP_X_REWRITE_URL(儲存原始的url到HTTP_X_REWRITE_URL伺服器變數中。)
[R] or [R=code]
就像跟我們在ASP.NET使用的Redirect方法一樣,重新改變瀏覽器的方向,跳轉到新的指定的URL中。
[R=code]允許我們指定特定的HTTP狀態返回碼。只能介於301到399。如果超出這個範圍。預設會是使用302狀態。
RewriteRule ^/goto.aspx?r=(.*)$ $1 [R]
源:http://xxx/goto.aspx?r=http://www.google.com/
目標:http://www.google.com
[L]
上面已經簡單介紹過。不在說明
[NF]
上面已經簡單介紹過。它還可以跟RewriteCond一起配合,來實現自訂的404錯誤請求。
特別要注意,你所要匹配的檔案必須存在,替換的字串不允許是存在檔案名稱
RewriteRule ^/1008.aspx$ /1.aspx [NF]
1008.aspx檔案需要存在,1.aspx不存在,否則無法正常達到我們的結果。
(很奇怪,我不知道是不是我搞錯了。但我最終測試的結果確實是這樣,文檔也沒詳細說明過,有知道的朋友可以告訴我一下原因)
[F]
不在說明。
[I]
模糊比對
[U]
儲存原始的url到HTTP_X_REWRITE_URL伺服器變數中。
在ASP.NET你可以用Request.ServerVariables["HTTP_X_REWRITE_URL"]擷取原始值。