URL重寫好處有很多,如有利於SEO、便於記憶、隱藏真實路徑使安全性提高、便於更新等等。本文概要描述了各種URL重寫的實現。
ASP.NET 2.0 中實現URL重寫有很多方法,如:Global.asax中捕獲用Application_BeginRequest請求,再用HttpContext類的Rewrite方法或Server.Transfer方法實現重寫;自己實現IHttpModule實現重寫;還有的利用伺服器的404錯誤引導到新的頁面實現重寫;最後就是用組件實現重寫(基本原理大多也是實現IHttpModule、IHttpHandler介面處理請求)。
如果自己處理請求,實現起來麻煩,特別是在大項目中,做好使用組件實現。網上有很多開源或免費的實現URL重寫的組件,選擇餘地特別大。當初我選擇的標準是小巧、快速、實現常用的URL重寫功能。經過比較選擇了只有32KB大小的UrlRewritingNet。
查看其文檔主要功能有以下一些:
1.基於Regex的重寫
2.支援Themes和主版頁面
3.支援輸出緩衝
4.支援信任層級為"Medium"的使用環境
5.支援Postback
6.支援無Cookie的Session
7.運行時添加、修改改寫規則
8.容易安裝使用
OK!功能完全夠用,就選他了!
Web.config中的配置:
<configuration>
<configSections>
<section name="urlrewritingnet"
requirePermission ="false"
type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter" />
</configSections>
<urlrewritingnet
rewriteOnlyVirtualUrls="true"
contextItemsPrefix="QueryString"
defaultPage = "Default.aspx"
defaultProvider="RegEx"
xmlns="http://www.urlrewriting.net/schemas/config/2006/07" >
<rewrites>
<add name="RewritePhoto" virtualUrl="^~/(\d+).aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
<!--更多重寫規則-->
</rewrites>
</urlrewritingnet>
<appSettings/>
<connectionStrings/>
<system.web>
<httpModules>
<add name="UrlRewriteModule"
type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
</httpModules>
<!--
設定 compilation debug="true" 將偵錯符號插入
已編譯的頁面中。但由於這會
影響效能,因此只在開發過程中將此值
設定為 true。
-->
<compilation debug="true" />
<!--
通過 <authentication> 節可以配置 ASP.NET 使用的
安全身分識別驗證模式,
以標識傳入的使用者。
-->
<authentication mode="Windows" />
<!--
如果在執行請求的過程中出現未處理的錯誤,
則通過 <customErrors> 節可以配置相應的處理步驟。具體說來,
開發人員通過該節可以配置
要顯示的 html 錯誤頁
以代替錯誤堆疊追蹤。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>
測試用的檔案:Default.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>URL 重寫測試 飄遙 http://xianfen.net</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%
Response.Write("原始URL:" + Request.RawUrl + "<br />");
Response.Write("擷取的ID:" + Request.QueryString["ID"]);
%>
</div>
</form>
</body>
</html>
(一)、副檔名不變的重寫:
重寫規則:
<add name="RewritePhoto" virtualUrl="^~/(\d+).aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
IIS配置:(此配置應該為預設配置,但有的虛擬機器主機供應商修改了此配置)
網站->屬性->目錄->配置(G)...->映射->應用程式擴充->副檔名 .aspx ->編輯->"確認檔案是否存在"複選框不選
運行結果:
(二)、偽靜態重寫,副檔名為.html等
重寫規則:
<add name="RewritePhoto" virtualUrl="^~/(\d+).html"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
IIS配置:網站->屬性->目錄->配置(G)...->映射->應用程式擴充->添加
可執行檔:c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
副檔名:.html
動作:限制為 GET,HEAD,POST,DEBUG
指令碼引擎:選中
確認檔案是否存在:不選
運行結果:
(三)、任意副檔名的重寫 如:副檔名為.zxjay
重寫規則:
<add name="Rewrite1" virtualUrl="^~/(\d+).zxjay"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
IIS配置:同上
運行結果:
(四)、無尾碼的重寫
重寫規則:
<add name="Rewrite1" virtualUrl="^~/(\d+)/Default.aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />
IIS配置:網站->屬性->目錄->配置(G)...->映射->萬用字元應用程式對應->插入
可執行檔:c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
確認檔案是否存在:不選
其原理是:請求"目前的目錄"時,尋找預設文件,實現重寫,因此重寫規則中的"^~/(\d+)/Default.aspx"要與第一個預設文件相對應。
關於“萬用字元應用程式對應”的詳細資料可參考微軟的說明
運行結果:
(五)、次層網域到多級網域名稱的重寫
(注意:由於條件的限制,該規則沒有測試,理論上可以實現,如果有錯誤,請留言指正,謝謝!)
重寫規則:
<add name="Rewrite1" virtualUrl="^http\://(.*).xianfen.net/Default.aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/Default.aspx?ID=$1"
ignoreCase="true" />