有关注册 HTTP 模块和 HTTP 处理程序的详细信息,请务必参考 <httpModules> element documentation 和 <httpHandlers> element documentation。
返回页首可以使用 ISAPI 筛选器在 IIS Web 服务器级别实现 URL 重写,也可以使用 HTTP 模块或 HTTP 处理程序在 ASP.NET 级别实现 URL 重写。本文重点介绍如何使用 ASP.NET 实现 URL 重写,因此我们将不对使用 ISAPI 筛选器实现 URL 重写的细节进行深入探讨。但是,有大量的第三方 ISAPI 筛选器可用于 URL 重写,例如:
? | ISAPI Rewrite |
? | IIS Rewrite |
? | PageXChanger |
? | 还有许多其他的筛选器! |
通过 system.web.httpcontext 类的 rewritepath() 方法,可以在 ASP.NET 级别实现 URL 重写。httpcontext 类包含有关特定 HTTP 请求的 HTTP 特定信息。对于 ASP.NET 引擎收到的每个请求,均为该请求创建一个 httpcontext 实例。此类具有如下属性:request 和 response,提供对传入请求和传出响应的访问;application 和 session,提供对应用程序和会话变量的访问;user,提供有关通过了身份验证的用户的信息;其他相关属性。
使用 Microsoft? .NET Framework Version 1.0,rewritepath() 方法可以接受单个字符串作为要使用的新路径。httpcontext 类的 rewritepath(string) 方法在内部对 request 对象的 path 属性和 querystring 属性进行更新。除了 rewritepath(string),.NET Framework 1.1 还包括另一种形式的 rewritepath() 方法,此方法可以接受三个字符串输入参数。此备用重载形式不仅要设置 request 对象的 path 属性和 querystring 属性,还要设置内部成员变量,这些变量用于计算 request 对象的 physicalpath、pathinfo 和 filepath 属性值。
要在 ASP.NET 中实现 URL 重写,需要创建 HTTP 模块或 HTTP 处理程序,以便完成以下操作:
1. | 检查被请求的路径,以确定 URL 是否需要重写。 |
2. | 如果需要重写,通过调用 RewritePath() 方法来重写路径。 |
例如,假设我们的网站中包含每个员工通过 /info/employee.aspx?empID=employeeID 均可访问的信息。为了使 URL 可以更多地被“删节”,我们可以决定通过以下地址来访问员工页面:/people/EmployeeName.aspx。这就是我们要使用 URL 重写的一个例子。也就是说,在请求 /people/ScottMitchell.aspx 页面时,我们要重写该 URL,以便使用 /info/employee.aspx?empID=1001 页面。
在 ASP.NET 级别执行 URL 重写时,可以使用 HTTP 模块或 HTTP 处理程序来执行重写。使用 HTTP 模块时,必须决定在请求有效期内的哪个时间点上来检查 URL 是否需要重写。乍一看,这似乎可以任意选择,但决定会以一种明显而微妙的方式对应用程序产生影响。由于内置 ASP.NET HTTP 模块使用 request 对象的属性执行任务,因此选择在何处执行重写非常重要。(如上所述,重写路径将改变 Request 对象的属性值。)下面列出了这些密切相关的内置 HTTP 模块及其捆绑到的事件:
HTTP 模块 | 事件 | 说明 |
formsauthenticationmodule | authenticaterequest | 确定用户是否通过了窗体身份验证。如果没有,用户将被自动重定向到指定的登录页面。 |
fileauthorizationmoudle | authorizerequest | 使用 Windows 身份验证时,此 HTTP 模块将检查以确保 Microsoft? Windows? 帐户对被请求的资源具有足够的权限。 |
urlauthorizationmodule | authorizerequest | 检查以确保请求者可以访问指定的 URL。通过 Web.config 文件中的 <authorization> 和 <location> 元素来指定 URL 授权。 |
如