在这种情况下,如果用户访问 /2004/02/14.aspx,我们需要将 URL 重写为 ShowBlogContent.aspx?year=2004&month=2&day=14。所有三种情况(URL 指定了年、月和日时;URL 仅指定了年和月时;URL 仅指定了年时)均可使用重写规则进行处理:
<RewriterConfig> <Rules> <!-- Blog 内容显示程序规则 --> <RewriterRule> <LookFor>~/(\d{4})/(\d{2})/(\d{2})\.aspx</LookFor> <SendTo>~/ShowBlogContent.aspx?year=$1&month=$2&day=$3</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/(\d{4})/(\d{2})/Default\.aspx</LookFor> <SendTo><![CDATA[~/ShowBlogContent.aspx?year=$1&month=$2]]></SendTo> </RewriterRule> <RewriterRule> <LookFor>~/(\d{4})/Default\.aspx</LookFor> <SendTo>~/ShowBlogContent.aspx?year=$1</SendTo> </RewriterRule> </Rules></RewriterConfig>
这些重写规则表明了正则表达式的功能。在第一个规则中,我们使用模式 (\d{4})/(\d{2})/(\d{2})\.aspx 查找 URL。在简明英语中,它对应了这样一个字符串:首先是四个数字,后跟一个斜杠,然后是两个数字,后跟一个斜杠,然后再跟两个数字,最后是一个 .aspx。每个数字组周围的括号非常重要,通过它可以在相应的 <sendto> 属性中引用这些括号内的匹配字符。 特别是,我们可以针对第一、第二和第三个括号组分别使用 $1、$2 和 $3 引用回括号内的匹配组。
注意:由于 Web.config 文件采用 XML 格式,但是必须对元素文字部分中的字符(如 &、< 和 >)进行转义。在第一个规则的 <sendto> 元素中,& 被转义为 &。在第二个规则的 <sendto> 中使用了另外一种技术(使用 <![cdata]> 元素),无需对内部的内容进行转义。可以使用两种方法中的任何一种,并且都会得到相同的结果。
图 5、6 和 7 显示了操作中的 URL 重写。数据实际上是从我的 blog /uploadfile/201210/12/F220367498.gif" width=450 border=0>
注意:URL 重写引擎在 <lookfor> 元素中需要使用正则表达式模式。如果您对正则表达式不熟悉,可以阅读我在早些时候编写的一篇文章 An Introduction to Regular Expressions。另外,还有一个很好的网站:RegExLib.com,在那里您可以获取有关常用正则表达式的帮助信息,还可以共享您自己的自定义正则表达式。
当请求 /2004/03/19.aspx 时,IIS 将通知 .aspx 扩展,并将请求路由到 ASP.NET 引擎。请求在 ASP.NET 引擎的管道中移动时,URL 将被重写为 ShowBlogContent.aspx?year=2004&month=03&day=19,并且访问者会看到 2004 年 3 月 19 日的 blog 条目。但是当用户浏览到 /2004/03/ 时将会发生什么情况呢?除非有一个 /2004/03/ 目录,否则 IIS 将返回一个 404 错误。此外,此目录中还需要具有 Default.aspx 页面,以便可以将请求传递给 ASP.NET 引擎。
因此,要使用这种方法,必须手动创建一个用于每年的目录(其中包含 blog 条目),并且目录中具有一个 Default.aspx 页面。另外,在每年目录中,您需要再手动创