科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道[冷枫]ASP.NET中执行URL重写经典方案

[冷枫]ASP.NET中执行URL重写经典方案

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

介绍如何使用 Microsoft ASP.NET 执行动态 URL 重写。URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。讨论实现 URL 重写的各种技术,并介绍执行 URL 重写的一些实际情况。

作者:冷枫 来源:CSDN 2007年9月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)

创建真正“可删节”的 URL

前一部分中介绍的简单 URL 重写显示了如何轻松地为 URL 重写引擎配置新的重写规则。但在使用正则表达式时,重写规则的真正功能才会发挥更大作用,本部分将对此进行探讨。

blog 在当今正变得越来越流行,似乎每个人都拥有自己的 blog。如果您不熟悉 blog:blog 是经常更新的个人页面,通常作为联机期刊。大多数 blog 只记录每天发生的事情,还有一些 blog 可能关注于特定的主题(例如,电影回顾、体育团队或计算机技术)。

可以在任何地点对 blog 进行更新,更新频率为从每天几次到每周一次或两次,具体情况取决于作者。通常,blog 主页将显示最近的 10 个条目,但实际上,所有 blog 软件均提供存档,访问者可以通过存档读取较早的帖子。Blog 是用于“可删节”URL 的一个功能强大的应用程序。假设在搜索 blog 的存档时,您在 URL /2004/02/14.aspx 上发现了您自己。如果您发现自己在阅读 2004 年 2 月 14 日的帖子,您是否觉得很惊讶?而且,您可能希望查看 2004 年 2 月的所有帖子,在这种情况下,您可以尝试将 URL 删节为 /2004/02/。要查看 2004 年的所有帖子,您可以尝试访问 /2004/。

维护 blog 时,最好为访问者提供此级别的 URL“可删节性”。许多 blog 引擎都提供此功能,但我们将讨论如何使用 URL 重写来实现此功能。

首先,我们需要一个 ASP.NET 网页,此页面将按照日、月或年来显示 blog 条目。假设我们有一个 ShowBlogContent.aspx 页面,该页面的查询字符串参数为年、月和日。要查看 2004 年 2 月 14 日的帖子,我们可以访问 ShowBlogContent.aspx?year=2004&month=2&day=14。要查看 2004 年 2 月的所有帖子,我们可以访问 ShowBlogContent.aspx?year=2004&month=2。最后,要查看 2004 年的所有帖子,我们可以浏览到 ShowBlogContent.aspx?year=2004。(可以在本文的下载内容中找到 ShowBlogContent.aspx 的代码。)

在这种情况下,如果用户访问 /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&amp;month=$2&amp;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> 元素中,& 被转义为 &amp;。在第二个规则的 <sendto> 中使用了另外一种技术(使用 <![cdata[...]]> 元素),无需对内部的内容进行转义。可以使用两种方法中的任何一种,并且都会得到相同的结果。

图 5、6 和 7 显示了操作中的 URL 重写。数据实际上是从我的 blog http://scottonwriting.net/ 中拖过来的。图 5 中显示了 2003 年 11 月 7 日的帖子;图 6 中显示了 2003 年 11 月的所有帖子;图 7 显示了 2003 年的所有帖子。


5. 2003 年 11 月 7 日的帖子


6. 2003 年 11 月的所有帖子


7. 2003 年的所有帖子

注意: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 页面。另外,在每年目录中,您需要再手动创建十二个目录(01、02、?、?...、12),并且每个目录中均有一个 Default.aspx 文件。(如上所述,我们还必须执行前面演示中的操作,即在 /Products/ 目录中添加一个 Default.aspx 文件,以便访问 /Products/ 时可以正确显示 ListCategories.aspx。)

很显然,添加这样一个目录结构可能是一件很痛苦的事情。解决此问题的方法是使所有传入的 IIS 请求都映射到 ASP.NET 引擎。通过这种方法,即使访问 URL /2004/03/,IIS 也会如实地将请求传递给 ASP.NET 引擎(即使并不存在 /2004/03/ 目录)。但是,使用这种方法将使 ASP.NET 引擎负责处理到达 Web 服务器的所有类型的传入请求,包括图像、CSS 文件、外部 JavaScript 文件、Macromedia Flash 文件,等等。

对处理所有文件类型的全面讨论远远超出了本文的范围。有关使用此技术的 ASP.NET Web 应用程序的示例,请参阅 .Text,一个开放源 blog 引擎。.Text 可以配置为将所有请求均映射到 ASP.NET 引擎。它可以使用自定义 HTTP 处理程序来处理生成所有文件类型的问题,自定义 HTTP 处理程序了解如何生成典型的静态文件类型(图像、CSS 文件,等等)。

结论

在本文中,我们讨论了如何在 ASP.NET 级别通过 httpcontext 类的 RewriteUrl() 方法来执行 URL 重写。正如我们所看到的,rewriteurl() 更新了特定的 httpcontext's Request 属性,从而更新了被请求的文件和路径。最终结果是,从用户角度来看,他们要访问某个特定的 URL,但从 Web 服务器端来看,被请求的却是另一个 URL。

可以在 HTTP 模块或 HTTP 处理程序中重写 URL。在本文中,我们介绍了如何使用 HTTP 模块执行重写,并讨论了在管道中的不同阶段执行重写的结果。

当然,如果执行 ASP.NET 级别的重写,则仅当已成功地将请求从 IIS 传递给 ASP.NET 引擎后才会发生 URL 重写。实际上,只有用户请求带 .aspx 扩展名的页面时才会出现这种情况。但是,如果您要使用户可以进入实际并不存在的 URL,但又希望重写到现有的 ASP.NET 页面,则必须创建虚拟目录和 Default.aspx 页面,或者对 IIS 进行配置,以使所有传入请求一律被路由到 ASP.NET 引擎。

参考资料

ASP.NET:Tips, Tutorials, and Code

Microsoft ASP.NET Coding Strategies with the Microsoft ASP.NET Team

Essential ASP.NET with Examples in C#

参考资料

url 重写是涉及到 ASP.NET 和竞争服务器端 Web 技术的一个主题。例如,Apache Web 服务器提供了名为 mod_rewrite 的 URL 重写模块。Mod_rewrite 是一个功能强大的重写引擎,提供了基于条件(如 HTTP 标题和服务器变量)的重写规则以及使用正则表达式的重写规则。有关 mod_rewrite 的详细信息,请查阅 A User's Guide to URL Rewriting with the Apache Web Server

还有许多有关使用 ASP.NET 执行 URL 重写的文章。Rewrite.NET - A URL Rewriting Engine for .NET 对创建模拟 mod_rewrite 正则表达式规则的 URL 重写引擎进行了介绍。URL Rewriting With ASP.NET 为 ASP.NET 的 URL 重写功能提供了很好的概述。Ian Griffiths 包含一个 blog entry,介绍了有关使用 ASP.NET 进行 URL 重写的一些注意事项(如在本文中讨论过的回发问题)。Fabrice Marguerie (read more) 和 Jason Salas (read more) 具有有关使用 URL 重写来增强搜索引擎定位功能的 blog 条目。

作者简介

scott Mitchell 著有五本书,他还是 4GuysFromRolla.com 网站的创建者。在过去五年中,他一直从事 Microsoft Web 技术方面的研究工作。Scott 是一位独立的顾问、培训师和作家。您可以通过 mitchell@4guysfromrolla.com 与作者进行联络,或者通过作者的 blog 进行联络,其网址是:http://scottonwriting.net/



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1610220

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章