日期:2010-12-24  浏览次数:20632 次

最近忙着自己的博客程序,自然而然就转到了博客中老生长谈的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&year=$2&month=$3&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&year=$2&month=$3&day=$4&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&Bloger=$1</SendTo>
</RewriterRule>
 

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