伪地址
一个网站中的页面为了SEO优化等原因,需要修改页面的地址,制作成伪地址,即不直接用aspx结尾的页面地址。伪地址方法如下:
/// <summary> /// Url重写 /// </summary> public class UrlReWrite :System.Web.IHttpModule { /// <summary> /// 实现接口IHttpModule的Init方法,绑定事件 /// </summary> /// <param name="context"></param> public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(ReUrl_BeginRequest); } /// <summary> /// 实现接口的Dispose方法 /// </summary> public void Dispose() { } /// <summary> /// 重写Url /// </summary> /// <param name="sender">事件的源</param> /// <param name="e">包含事件数据的 EventArgs</param> private void ReUrl_BeginRequest(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; string strRequestPath = context.Request.Url.AbsoluteUri.ToLower(); //请求Url string strNewUrl = string.Empty; //解析后的url strNewUrl = ResolveUrl(strRequestPath); if (!string.IsNullOrEmpty(strNewUrl)) { if (!string.IsNullOrEmpty(strNewUrl)) { context.RewritePath(strNewUrl); } } } /// <summary> /// 解析用户请求URL /// </summary> /// <param name="strRequestPath">用户请求URL</param> /// <returns>false/true</returns> private string ResolveUrl(string strRequestPath) { string strRule = "^http://网址\\.com/list_([1-9])(_([1-3]))?/(p(\\d+)\\.html)?$"; Regex regRule = new Regex(strRule, RegexOptions.IgnoreCase); Match matRule = regRule.Match(strRequestPath); if (!matRule.Success) return strRequestPath; //如果未能匹配,则原样返回 string strNewUrl = ConfigurationManager.AppSettings["ErrorPath"]; //匹配成功 string strCateID = string.Empty; //栏目ID strCateID = matRule.Groups[1].ToString(); string strType = string.Empty; //时间类型:今天昨天更早 strType = matRule.Groups[3].ToString(); if (string.IsNullOrEmpty(strType)) strType = "1"; //代表今天 string strPage = string.Empty; //类型 strPage = matRule.Groups[5].ToString(); if (string.IsNullOrEmpty(strPage)) strPage = "1"; //第一页 if (string.IsNullOrEmpty(strCateID) || string.IsNullOrEmpty(strType) || string.IsNullOrEmpty(strPage)) { LogTools.LogHelper.Write("Url重写,获取页面参数失败。" + strRequestPath, null); return strNewUrl; } strNewUrl = "/List.aspx?CateID=" + strCateID + "&PubDate=" + strType + "&Page=" + strPage; return strNewUrl; } }
具体如下:
- 实现 System.Web.IHttpModule接口;
-
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
解释如下:
// 摘要:
// 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
public event EventHandler BeginRequest; - 方法 ReUrl_BeginRequest
- 跳转规则:ResolveUrl方法
上面的代码实现的功能如下:
浏览器地址栏显示地址为:http://网址.com/list_3_2/p1.html
实际找到的页面是:http://网址.com/List.aspx?CateID=3&PubDate=2&Page=1
即实现两个地址的映射;
注意:在配置文件中<system.web>节点中,需要加入:
<httpModules> <add name="HttpModule" type="UrlReWrite"/> </httpModules>