URL重寫好處有很多,如有利于SEO、便于記憶、隱藏真實(shí)路徑使安全性提高、便于更新等等。本文概要描述了各種URL重寫的實(shí)現(xiàn)。
ASP.NET 2.0 中實(shí)現(xiàn)URL重寫有很多方法,如:Global.asax中捕獲用Application_BeginRequest請(qǐng)求,再用HttpContext類的Rewrite方法或Server.Transfer方法實(shí)現(xiàn)重寫;自己實(shí)現(xiàn)IHttpModule實(shí)現(xiàn)重寫;還有的利用服務(wù)器的404錯(cuò)誤引導(dǎo)到新的頁面實(shí)現(xiàn)重寫;最后就是用組件實(shí)現(xiàn)重寫(基本原理大多也是實(shí)現(xiàn)IHttpModule、IHttpHandler接口處理請(qǐng)求)。
如果自己處理請(qǐng)求,實(shí)現(xiàn)起來麻煩,特別是在大項(xiàng)目中,做好使用組件實(shí)現(xiàn)。網(wǎng)上有很多開源或免費(fèi)的實(shí)現(xiàn)URL重寫的組件,選擇余地特別大。當(dāng)初我選擇的標(biāo)準(zhǔn)是小巧、快速、實(shí)現(xiàn)常用的URL重寫功能。經(jīng)過比較選擇了只有32KB大小的UrlRewritingNet。
查看其文檔主要功能有以下一些:
1.基于正則表達(dá)式的重寫
2.支持Themes和母版頁
3.支持輸出緩存
4.支持信任級(jí)別為"Medium"的使用環(huán)境
5.支持Postback
6.支持無Cookie的Session
7.運(yùn)行時(shí)添加、修改改寫規(guī)則
8.容易安裝使用
OK!功能完全夠用,就選他了?。ū鞠到y(tǒng)使用的是支持.html的方法,即第二種配置)
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>
測(cè)試用的文件:Default.aspx
<%@ Page Language="C#" %>
(一)、擴(kuò)展名不變的重寫:
重寫規(guī)則:
<add name="RewritePhoto" virtualUrl="^~/(\d+).aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
IIS配置:(此配置應(yīng)該為默認(rèn)配置,但有的虛擬主機(jī)提供商修改了此配置)
網(wǎng)站->屬性->目錄->配置(G)...->映射->應(yīng)用程序擴(kuò)展->擴(kuò)展名 .aspx ->編輯->"確認(rèn)文件是否存在"復(fù)選框不選
運(yùn)行結(jié)果:
(二)、偽靜態(tài)重寫,擴(kuò)展名為.html等
重寫規(guī)則:
<add name="RewritePhoto" virtualUrl="^~/(\d+).html"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
IIS配置:網(wǎng)站->屬性->目錄->配置(G)...->映射->應(yīng)用程序擴(kuò)展->添加
可執(zhí)行文件:c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
擴(kuò)展名:.html
動(dòng)作:限制為 GET,HEAD,POST,DEBUG
腳本引擎:選中
確認(rèn)文件是否存在:不選
運(yùn)行結(jié)果:
(三)、任意擴(kuò)展名的重寫 如:擴(kuò)展名為.zxjay
重寫規(guī)則:
<add name="Rewrite1" virtualUrl="^~/(\d+).zxjay"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
IIS配置:同上
運(yùn)行結(jié)果:
(四)、無后綴的重寫
重寫規(guī)則:
<add name="Rewrite1" virtualUrl="^~/(\d+)/Default.aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
IIS配置:網(wǎng)站->屬性->目錄->配置(G)...->映射->通配符應(yīng)用程序映射->插入
可執(zhí)行文件:c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
確認(rèn)文件是否存在:不選
如圖:
其原理是:請(qǐng)求"當(dāng)前目錄"時(shí),查找默認(rèn)文檔,實(shí)現(xiàn)重寫,因此重寫規(guī)則中的"^~/(\d+)/Default.aspx"要與第一個(gè)默認(rèn)文檔相對(duì)應(yīng)。
關(guān)于“通配符應(yīng)用程序映射”的詳細(xì)信息可參考微軟的說明
運(yùn)行結(jié)果:
(五)、二級(jí)域名到多級(jí)域名的重寫
(注意:由于條件的限制,該規(guī)則沒有測(cè)試,理論上可以實(shí)現(xiàn),如果有錯(cuò)誤,請(qǐng)留言指正,謝謝!)
重寫規(guī)則:
<add name="Rewrite1" virtualUrl="^http\://(.×).xianfen.net/Default.aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
注意事項(xiàng):
重寫規(guī)則、參數(shù)個(gè)數(shù)等等可以自己定義,還可以在運(yùn)行時(shí)添加、修改重寫規(guī)則,也可以擴(kuò)展該組件的功能來滿足形形色色的需求。具體可查看其文檔和源碼。
本文示例僅在本機(jī)上測(cè)試,并且沒有嚴(yán)格測(cè)試,僅第一種重寫方式正在虛擬機(jī)上使用,就是您看到的本個(gè)人博客
系統(tǒng)(http://xianfen.net/)使用的改寫規(guī)則。