一. 為了頁面更有利於seo優化,url重寫程序需要做出的不可缺少的手段之一。
二.目前url重寫最常見的兩種方法有:
1.通過熟悉頁面的內部執行流程,也就是asp.net請求管道中的相關知識點,進行url重寫。
2.通過使用微軟提供的UrlRewriter.dll實現url重寫(簡單);
三、在請求管道中的第一個請求管道中攔截url並使其完成url重寫功能:
1.熟悉請求管道實現程序運行的全過程:
(1):BeginRequest: 開始處理請求
(2):AuthenticateRequest授權驗證請求,獲取用戶授權信息
(3):PostAuthenticateRequest獲取成功
(4): AunthorizeRequest 授權,一般來檢查用戶是否獲得權限
(5):PostAuthorizeRequest:獲得授權
(6):ResolveRequestCache:獲取頁面緩存結果
(7):PostResolveRequestCache 已獲取緩存
(8):PostMapRequestHandler 創建頁面對象
(9):AcquireRequestState 獲取Session-----先判斷當前頁面對象是否實現了IRequiresSessionState接口,如果實現了,則從瀏覽器發來的請求報文體中獲得SessionID,並到服務器的Session池中獲得對應的Session對象,最后賦值給HttpContext的Session屬性
(10)PostAcquireRequestState 獲得Session
(11)PreRequestHandlerExecute:准備執行頁面對象
執行頁面對象的ProcessRequest方法
(12)PostRequestHandlerExecute 執行完頁面對象了
(13)ReleaseRequestState 釋放請求狀態
(14)PostReleaseRequestState 已釋放請求狀態
(15)UpdateRequestCache 更新緩存
(16)PostUpdateRequestCache 已更新緩存
(17)LogRequest 日志記錄
(18)PostLogRequest 已完成日志
(19)EndRequest 完成、
2.直接上代碼:
網站結構圖:
using System; using System.Collections.Generic; using System.Web; using System.Text; using System.Text.RegularExpressions; namespace UrlReWriter { class UrlWriter:IHttpModule { #region IHttpModule 成員 public void Init(HttpApplication context) { context.BeginRequest+=new EventHandler(context_BeginRequest); } void context_BeginRequest(object sender, EventArgs e) { //獲得當前頁面請求管道的HttpApplication對象 HttpApplication application = sender as HttpApplication; HttpContext context = application.Context;//獲得上下文對象 string url = context.Request.Url.LocalPath;//獲得URL(不包含域名和路徑) Regex reg1 = new Regex("/WebForm2/[A-Z0-9a-z_]+");//注意文件夾與文件名稱的大小寫. if (reg1.IsMatch(url)) //這種情況是匹配根據ID值來查看某個文章的內容。 { string strUserName = url.Substring(url.LastIndexOf('/')+1); context.RewritePath("/WebForm2.aspx?id=" + strUserName); //前台的列表頁就可以這樣寫:<a href='../WebForm2/<%#Eval("id")%>'></a> } else if (url.Contains("/admin")) //如果url中包含"/admin"字樣則轉向,實現用戶驗證,哈哈,不過這里是錯的,應為這個請求管道中還獲取不到session值呢,這個驗證最好在第九個請求管道(AcquireRequestState )中完成。 { context.RewritePath("/Error.aspx"); } } public void Dispose() { } #endregion } }
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="url重寫.WebForm1" %> <!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></title> </head> <body> <form id="form1" runat="server"> <div> <a href="WebForm2/12">重寫</a> <!--這里是有利於seo的鏈接--> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace url重寫 { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write(Request.QueryString["id"]); //在轉到的頁面輸出傳過來的參數 } } }
<httpModules> <add name="UrlReWriter" type="UrlReWriter.UrlWriter,UrlReWriter"/> </httpModules> <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/> </system.web>
note:記得在url重寫項目中引用UrlReWriter項目。否則httpModules接口沒有注冊,url重寫泡湯是必然的。呵呵
四、第二種重寫方式,是微軟提供的bll,很容易實現的,大家可以在網上查一下資料,很簡單的我就不寫了,如果不會也可以跟我留言,咱們再一起溝通的。。呵呵,886。。。