首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 认证考试-> ORACLE认证
url重写可删节日期模式---正则表达式之强力应用_asp.net技巧
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

最近忙着自己的博客程序,自然而然就转到了博客中老生长谈的URL重写问题。一个原因是在多用户博客系统中的一个面子问题,本来想拿我的CSDN博客http://blog.csdn.net/joshualang来说事,想想还是用我的空间(http://www.tyoo.net)吧,因为这是我的博客完功之后的去所了。

http://www.tyoo.net/blog/joshualang 如若不进行必要的URL重写,就会出http://www.tyoo.net/blog/default.aspx?Bloger=joshualang样子的博客地址;大家要知道BLOG可谓是大部分网民视为筑在网络上的另一个家,现实生活中会考虑家的地址远近,交通好坏,同样网络中的家也要有个好记的门牌号的。这个门牌号还不算太长(还不是很体面哦),后边在加上一堆的参数只怕让人慢慢见而生畏,要看文章就要面对这么一大堆http://blog.tyoo.net/Articles/Default.aspx?Bloger=joshualang&ArticleID=20070118234530是不是有什么感觉了?再看看现在好多博客程序都要得到的一种效果吧http://blog.tyoo.net/joshua/Articles/2007/01/18/大家一看就知道这种效果的好处了,这也就引到了本文的重点所在了!

是的,要通过这样一个很规整的字符串来达到我们的一个目标。

一个可行的URL应该遵循以下标准来选择 :

• 简短。
 
• 易于键入。
 
• 可以看出站点的结构。
 
• “可删节”,允许用户通过删除 URL 的组成部分来浏览站点。
 

致于这点就不用我来多说了,其实都是要突出简单,实用。

注意:说到这里就有必要看看MSDN网站上Scott Mitchell的一遍文档http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx?pf=true#top

已经有专家在这里将URL重写的原理讲得足够明确了,不懂还可以下载上边文档的源代码 来研究一下。

为了图效率(人的时间是宝贵的,程序员的时间更是),就直接采用URLRewriter.net的组件,实际上以前没接触过URL重写经历,大致得源程序看了几遍就开始上路了。开始当然不求什么技术含量了,只要能重写成功就已经感觉很OK了,然后才是在不断的重写过程中找出其中问题还有新思路,新发现。。。所以就有了这遍文章。

现在开始吧。这次针对的其实主要就是刚提到的日期模式的URL重写.

http://blog.tyoo.net/Articles/2007/01/18/233030/joshualang.aspx 这就是要在这里实现的最终效果。


基础: UrlRewriter.net组件(当然也可以自已写), 了解正则表达式

参数:ArticleID  //文章编号 [ 类型:string    长度:14(like:yyyymmddhhmmss)//有意义且不会重复  ]

            Bloger   //博主用户名[ 类型:string   字母开头 ]

在URL重写过程中遇到的一个问题就是在访问不存在的目录或文件时出现404错误。在MSDN上的这遍文档提供的建议就是在程序目录下建立必要的文件夹目录及空的页面,说麻烦的确是麻烦,数千的目录需要建立。

既然不能随便就访问不存在的目录文件,那我们不访问这样的目录不就行了。就要访问我们已经存在的文件(我的全部URL指向都是根目录Blog下的一个Default.aspx页面然后动态加载控件组生成不同的视图功能页面)当然这次要指向的还是这个页面~/Default.aspx;

下面的任务就是传递参数,当然是URL传值了。这就是重写它的原因了。

主角又要出场了:正则表达式。

在这里用正则表达式真的是太帅了~ http://blog.tyoo.net/joshualang/Articles/2007/01/18/Default.aspx目录你可能会生成如下这样的URL重写规则:

<RewriterRule>
           <LookFor>~/(w{6,16})/Articles/(d{4})/(d{2})/(d{2})/Default.aspx</LookFor>
           <SendTo>~/Default.aspx?Bloger=$1&amp;year=$2&amp;month=$3&amp;day=$4</SendTo>
</RewriterRule>
 

这样写出的规则在进行删节时肯定是会因为访问的页面不存在而产生404错误。因为它会顺着你的目录标记一直往下找,要是再建目录工程可就大了,再看看下边的代码:

<RewriterRule>
           <LookFor>~/(w{6,16})/Articles/(d{4})/(d{2})/(d{2})/(d{6})/Default.aspx</LookFor>
           <SendTo>~/Default.aspx?Bloger=$1&amp;year=$2&amp;month=$3&amp;day=$4&amp;time=$5</SendTo>
</RewriterRule>
 

这下多出了时间部分该没人会选择建目录了。那就充分利用已经存在的文件来完成这个任务吧。

其实一说可能有很多人都能想到用文件名来代替目录结构。想想看,是不是这样。当然这还得对正则表达式有一定的了解。

好,来看看实现吧。

<RewriterRule>
    <LookFor>~/(w{5,16})/Articles/(d{4})\/(d{2})\/(d{2})\/(d{6}).aspx</LookFor>
    <SendTo>~/Default.aspx?ArticleID=$2$3$4$5&amp;Bloger=$1</SendTo>
</RewriterRule>
 

大家很容易看出我这里用到了“\”对“/”进行了转义,而且用在了文件名里边现在的结构就是

http://blog.tyoo.net/joshualang/2007/01/18.aspx

很显然我的ArticleID就是一个以年月日时分秒为基础的字符串,因为这样插入数据不用考虑重复还有意义,而在这里用时间也为查询时方便。$2$3$4$5得到的14位组合就是我的ArticleID.通过发表日期,文章编号都可以很容易查出记录。而最后一点好处就在进行删节时表现的特为明显。

现在来让我们删节时间部分:

<RewriterRule>
    <LookFor>~/(w{5,16})/Articles/(d{4})\/(d{2})\/(d{2}).aspx</LookFor>
    <SendTo>~/Default.aspx?ArticleID=$2$3$4&amp;Bloger=$1</SendTo>
</RewriterRule>
 

依次我们可以将URL删节为这样的模式:http://blog.tyoo.net/joshualang/Articles/2007.aspx甚至http://blog.tyoo.net/joshualang/Articles/Default.aspx

是不是很简单。但你要注意一个问题了:什么事不是能够就会实现的了,须要考虑的还有很多比如:

http://blog.tyoo.net/joshualang/Articles/2007.aspxhttp://blog.tyoo.net/joshualang/Articles/2007/.aspx有什么区别,做到上边的规则后后者能否正常运行?不能

同样:http://blog.tyoo.net/joshualang/Articles/2007/01/08/.aspx也是不行的。还需要定义其它应对规则来实现恰如其份的重写效果。

好了,大致上效果已经出来了;这里是完整的规则代码:

 

<!--author: Joshua Li  (joshuasco@126.com )  QQ:245965348-->
<!-- Rules for Blog Content Displayer -->
            <RewriterRule>
                <LookFor>~/([A-Za-z]w{5,16})/Default.aspx</LookFor>
                <SendTo>~/Default.aspx?Bloger=$1</SendTo>
            </RewriterRule>
            <!-- Rules for Article Lister -->
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/(d{2})\/(d{1,6})\/([A-Za-z]w{5,16}).aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=$1$2$3$4&amp;Bloger=$5</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/(d{2})\/(d{1,6})((\/)?).aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=$1$2$3$4</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/(d{2})\/([A-Za-z]w{5,16}).aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=$1$2$3&amp;Bloger=$4</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/(d{2})((\/)?).aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=$1$2$3</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/([A-Za-z]w{5,16}).aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=$1$2&amp;Bloger=$3</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})((\/)?).aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=$1$2</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/([A-Za-z]w{5,16}).aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=$1&amp;Bloger=$2</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})((\/)?).aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=$1</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/([A-Za-z]w{5,16}).aspx</LookFor>
                <SendTo>~/Default.aspx?Bloger=$1</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/Default.aspx</LookFor>
                <SendTo>~/Default.aspx?ArticleID=-1</SendTo>
            </RewriterRule>
说明:在这里为了访止用户误删节掉重要的.aspx扩展名,我将用户名作为了文件的虚拟标识名称。

最后得到的URL:  http://blog.tyoo.net/Articles/2007/01/18/015000/joshualang.aspx

同时将放在最后的最长为6位的时间设置为可删节变长,就算丢了某些数字也能最方便的找到与该发表时间最接近的列表。

在去除用户名后也不会影响到使用,还是通过前边详细的时间格式很快会得到与您需要的文章最批配的列表。如果用户名完好则能通过删节找到特定时间段对应作者的文章列表。

还要注意的是:用户名的格式([A-Za-z]{6-16})和规则验证的顺序。

总结:
    通过规则的URL重写过程后像实际存在此目录一样会具有严密的格式但显得框架结构更方便更灵活,从而得到功能和用户体验上的重点提升
暂时到这里吧。有什么疑问欢迎回复加入讨论。如果有更好的重写方法很高兴能通知下本人哦。
http://www.cnblogs.com/Joshualang/archive/2007/01/19/624302.html


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·一个特牛的日期时间判断正则表达式-ASP教程,正则表达式
·Remoting编程知识一-.NET教程,.NET Framework
·从客户端检测到有潜在危险的Request.Form 值-ASP教程,客户端相关
·关于DataRow和DataColumn的一点个人简单理解-.NET教程,数据库应用
·DataTable.Select使用小心得-.NET教程,数据库应用
·在Java中如何模拟多继承-JSP教程,Java技巧及代码
·上海移动数据网综合网管的实现
·在VC中用GDI+绘制角度可变的颜色渐变效果-.NET教程,VB.Net语言
·超漂亮的绿色按扭制做-网页设计,Photoshop
·Java获取Html变量的值-JSP教程,Java技巧及代码
最新文章
·阿里联盟:关于结算时间问题的统一说明_网赚技巧
·谷歌官方组织adsense优化大赛_网赚技巧
·google adsense 2007巡讲大会上海站总结_网赚技巧
·网络只是一个开始:专访91now站长小鱼头_站长访谈
·asp.net应用程序资源访问安全模型_asp.net技巧
·给那些迷惑于做垃圾站的站长们_站长心得
·免费——不是威客网站的杀手锏_站长心得
·圈圈浅谈个人网站发展和赚钱的模式-网站推广的口碑篇_站长心得
·说网解络之web2.0概念诠释(1)_站长心得
·google adsense系列技巧100条_google推广
相关主题
  • Url重写之action改变的问题-.NET教程,评论及其它
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭