C# UrlRewrite
發(fā)布日期:2022/8/31 作者:
瀏覽:772
using System;
using System.Web;
using System.Text.RegularExpressions;
using System.Xml;
/// <summary>
///UrlRewrit
/// </summary>
namespace qhwins.SEO
{
//繼承自IHttpModule接口
public class HttpModule : System.Web.IHttpModule
{
/**//// <summary>
/// 實現(xiàn)接口的Init方法
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
//建立個委托讓他執(zhí)行下面的ReUrl_BeginRequest事件
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
}
/**//// <summary>
/// 實現(xiàn)接口的Dispose方法
/// </summary>
public void Dispose()
{
}
private void ReUrl_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
string requestPath = context.Request.Path.ToLower();
//SiteUrls是下面的一個類,這里大家可以重構下
foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)
{
//是否找到了匹配選項
if (Regex.IsMatch(requestPath, url.Pattern, RegexOptions.None | RegexOptions.IgnoreCase))
{
//開始替換成我們程序能讀懂的url
//string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.LastIndexOf("/")), url.Pattern, url.QueryString, RegexOptions.None | RegexOptions.IgnoreCase);
//context.Response.Write("input=" + requestPath.Substring(context.Request.Path.IndexOf("/")) + "<br/>Pattern=" + url.Pattern + "<br/>" + "url.QueryString=" + url.QueryString + "<br/>");
string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.IndexOf("/")), url.Pattern, url.QueryString, RegexOptions.None | RegexOptions.IgnoreCase);
//這里你可以輸出一下看看
//context.Response.Write("<br/>url.Page=" + url.Page + "<br>newUrl=" + newUrl + "<br>");
//context.Response.End();
//開始把用戶便于記憶的URL替換成程序能讀懂的url
//context.Response.Write("url.Page=" + url.Page + "<br/>newUrl=" + newUrl);
context.RewritePath(url.Page, string.Empty, newUrl); //參數(shù)說明:虛擬路徑、路徑信息、查詢字符串信息
}
}
}
}
public class SiteUrls
{
//定義成volatitle類型主要是為了多線程訪問方便,在這個示例程序中沒什么實際意義,項目大了就有用了
private static volatile SiteUrls instance = null;
string UrlsFile = HttpContext.Current.Server.MapPath("~/config/urls.config");
//定義兩個屬性
private System.Collections.ArrayList _Urls;
public System.Collections.ArrayList Urls
{
get { return _Urls; }
set { _Urls = value; }
}
//這個就是個鍵植對 表害怕一點也不高深
private System.Collections.Specialized.NameValueCollection _Paths;
public System.Collections.Specialized.NameValueCollection Paths
{
get { return _Paths; }
set { _Paths = value; }
}
//構造函數(shù)
private SiteUrls()
{
Urls = new System.Collections.ArrayList();
Paths = new System.Collections.Specialized.NameValueCollection();
//以XML個數(shù)讀取那CONFIG文件
XmlDocument urlconfig = new XmlDocument();
urlconfig.Load(UrlsFile);
XmlNode root = urlconfig.SelectSingleNode("urls");
foreach (XmlNode n in root.ChildNodes)
{
//XmlNodeType.Comment如果不是注釋
if (n.NodeType != XmlNodeType.Comment && n.Name.ToLower() == "rewrite")
{
XmlAttribute name = n.Attributes["name"];
XmlAttribute path = n.Attributes["path"];
XmlAttribute page = n.Attributes["page"];
XmlAttribute querystring = n.Attributes["querystring"];
XmlAttribute pattern = n.Attributes["pattern"];
if (name != null && path != null && page != null && querystring != null && pattern != null)
{
Paths.Add(name.Value, path.Value);
//壓進去的都是url實體類
Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^", "&"), querystring.Value.Replace("^", "&")));
}
}
}
}
//用方法實例化
public static SiteUrls GetSiteUrls()
{
if (instance == null)
{
instance = new SiteUrls();
}
return instance;
}
// url實體類#region url實體類
public class URLRewrite
{
// 成員變量#region 成員變量
private string _Name;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
private string _Pattern;
public string Pattern
{
get
{
return _Pattern;
}
set
{
_Pattern = value;
}
}
private string _Page;
public string Page
{
get
{
return _Page;
}
set
{
_Page = value;
}
}
private string _QueryString;
public string QueryString
{
get
{
return _QueryString;
}
set
{
_QueryString = value;
}
}
// 構造函數(shù)#region 構造函數(shù)
public URLRewrite(string name, string pattern, string page, string querystring)
{
_Name = name;
_Pattern = pattern;
_Page = page;
_QueryString = querystring;
}
//#endregion
}
//#endregion
}
}
定義:
<?xml version="1.0" encoding="utf-8"?>
<urls>
<!--<rewrite name="default" path="/default-{0}-{1}.aspx" pattern = "/default-(\d+)(-(\d+))?.aspx" page="/default.aspx" querystring="id=$1^page=$3" />-->
<!--<rewrite name="Flower" path="/Flower-{0}.aspx" pattern = "^/Flower-(\d{1,4}).aspx$" page="/Flower.aspx" querystring="page=$1" />-->
<rewrite name="Default" path="/Default.html" pattern = "^/default.html$" page="/default.aspx" querystring="" /> <!--首頁-->
<rewrite name="Job" path="/job.html" pattern = "^/job.html$" page="/job.aspx" querystring="" /> <!--人才-->
<rewrite name="News" path="/nl/{0}-{1}.html" pattern = "^/nl/(\d{1,6})(-(\d{1,4}))?.html$" page="/News.aspx" querystring="ClassCode=$1^page=$3" />
</urls>
使用,在webconfig中配置
<system.web> ... ... <httpModules> <add type="qhwins.SEO.HttpModule" name="HttpModule"/> </httpModules> <pages validateRequest="false" enableSessionState="true" enableViewStateMac="false"></pages> <globalization fileEncoding="utf-8"/> <machineKey validation="3DES" validationKey="318W9AF6GC2B7A87C996B280450BB36506A8DFEDF9B51211" decryption="3DES" decryptionKey="998950BB36319B474C996B506A95AEDF9B51211B1DA7B287"/> </system.web>
下拉加載更多評論