伪地址

  一个网站中的页面为了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;
    }

}

具体如下:

  1. 实现 System.Web.IHttpModule接口;
    
    
  2. context.BeginRequest += new EventHandler(ReUrl_BeginRequest);

    解释如下:
    // 摘要:
    // 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
    public event EventHandler BeginRequest;

  3. 方法 ReUrl_BeginRequest
  4. 跳转规则: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>

 

  

posted @ 2013-01-11 11:23  TigerWang1986  阅读(564)  评论(0编辑  收藏  举报