找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1492|回复: 1

[建站技术] 不用正则,60行代码搞定高效Url重写

[复制链接]
发表于 2011-8-21 17:30:31 | 显示全部楼层 |阅读模式
在Url重写的很多方案中,都用到了正则,在页面比较少的情况下,可能看不出什么问题

但页面一旦过多,正则的性能凸显,这里给出一个不需要试用正则的方案,当然了,不用正则就需要遵守一些约定

我这里定制了一个规则,一个Url由4部分组成:页面路径信息 + 分隔符 + 参数列表 + Url后缀

给个例子:Home/q/id/1/cata/2/name/icecoffee.aspx

页面路径信息 = Home

分隔符 = /q/

参数列表 = id/1/cata/2/name/icecoffee

Url后缀 = .aspx

我标红的部分,是可配置的,好了,废话不多说,直接上代码
  1. public class UrlRouteModule : IHttpModule
  2.     {
  3.         private static string URL_FLAG = "/q/"; //Url中区别路径和参数的分隔符
  4.         private static string URL_SUFFIX = ".aspx"; //对哪种后缀的Url实施Rewrite

  5.         public void Init(HttpApplication context)
  6.         {
  7.             context.BeginRequest += new EventHandler(context_BeginRequest);
  8.         }

  9.         private void context_BeginRequest(object sender, EventArgs e)
  10.         {
  11.             HttpApplication app = sender as HttpApplication;
  12.             if (app == null) return;

  13.             string currentUrl = app.Context.Request.RawUrl;
  14.             if (currentUrl.EndsWith(URL_SUFFIX, StringComparison.OrdinalIgnoreCase) == false) //后缀不符合的跳过
  15.                 return;

  16.             int p = currentUrl.IndexOf(URL_FLAG, StringComparison.OrdinalIgnoreCase); //无参的也跳过
  17.             if (p == -1) return;

  18.             currentUrl = currentUrl.Substring(0, currentUrl.Length - URL_SUFFIX.Length); //去除后缀
  19.             string url = string.Format("{0}.aspx", currentUrl.Substring(0, p));
  20.             string query = FormmatUrlToQuery(currentUrl.Substring(p + URL_FLAG.Length));

  21.             app.Context.RewritePath(url, string.Empty, query);
  22.         }

  23.         private string FormmatUrlToQuery(string url)
  24.         {
  25.             int j = 0; //计数器
  26.             int len = url.Length;
  27.             char[] chars = new char[len];

  28.             for (int i = 0; i < len; i++)
  29.             {
  30.                 if (url[i] != '/')
  31.                     chars[i] = url[i];
  32.                 else
  33.                 {
  34.                     if (++j % 2 == 1)
  35.                         chars[i] = '=';
  36.                     else
  37.                         chars[i] = '&';
  38.                 }
  39.             }

  40.             return new string(chars);
  41.         }

  42.         public void Dispose() { }
  43.     }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|王牌互联

GMT+8, 2024-12-21 08:11 , Processed in 0.031019 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表