URL 重写
- 格式:doc
- 大小:248.50 KB
- 文档页数:20
首先来明确一下定义: URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。
一个好的URL标准:∙简短。
∙易于键入。
∙可以看出站点的结构。
∙“可删节”,允许用户通过删除 URL 的组成部分来浏览站点。
请求到达 IIS 时将会发生什么情况在正式研究 URL 如何实现重写之前,应首先了解Microsoft® Internet Information Services (IIS) 如何处理传入请求,这一点非常重要。
当请求到达 IIS Web 服务器时,IIS 检查被请求文件的扩展名以确定如何处理该请求。
IIS 可以自行处理请求(如 HTML 页面、图像以及其他静态内容),或者将请求路由到 ISAPI 扩展。
(ISAPI 扩展是一个处理传入 Web 请求的非托管编译类。
其任务是生成被请求资源的内容。
)例如,当传入针对 Info.asp 网页的请求时,IIS 会将此消息路由到 asp.dll ISAPI 扩展。
然后,该 ISAPI 扩展将加载被请求的 ASP 页面,执行该页面,并将所呈现的 HTML 返回给 IIS,然后,IIS 将该 HTML 发送回请求客户端。
对于 页面,IIS 会将此消息路由到 aspnet_isapi.dll ISAPI 扩展。
然后,aspnet_isapi.dll ISAPI 扩展将处理操作传递给托管的 辅助进程,该辅助程序将处理请求,并返回 网页的呈现 HTML。
您可以自定义 IIS,以指定扩展名与 ISAPI 扩展的映射关系。
图 1 显示了 Internet Information Services 管理工具的“应用程序配置”对话框。
请注意,与 有关的扩展名(.aspx、ascx、config、asmx、rem、cs、vb 及其他)均已映射到 aspnet_isapi.dll ISAPI 扩展。
使用 ISAPI 筛选器检查请求IIS 除了可以将传入 Web 请求的文件扩展名映射到相应的 ISAPI 扩展之外,还将执行许多其他任务。
例如,IIS 将尝试对发出请求的用户进行身份验证,并确定通过身份验证的用户是否有权限访问被请求的文件。
在处理请求的有效期内,IIS 将经历几个状态。
在每个状态下,IIS 都将引发可以使用 ISAPI 筛选器以编程方式进行处理的事件。
与 ISAPI 扩展一样,ISAPI 筛选器是在 Web 服务器上安装的非托管代码块。
ISAPI 扩展被设计为可以响应针对特定文件类型的请求。
另一方面,ISAPI 筛选器还包含可以对 IIS 引发的事件进行响应的代码。
ISAPI 筛选器可以截取甚至修改传入和传出的数据。
ISAPI 筛选器可以应用于很多方面,包括:∙身份验证和授权。
∙记录和监视。
∙HTTP 压缩。
∙URL 重写。
虽然 ISAPI 筛选器可用于执行 URL 重写,但本文将讨论如何使用 实现 URL 重写。
不过,我们将对使用 ISAPI 筛选器与使用 中的技术实现 URL 重写进行权衡。
请求进入 引擎时将会发生什么情况在 之前,需要使用 ISAPI 筛选器来实现 IIS Web 服务器上的 URL 重写。
由于 引擎与 IIS 非常相似,因此可以使用 进行 URL 重写。
存在相似之处的原因在于 引擎可以实现以下功能:∙在处理请求时可以引发事件。
∙允许任意数量的 HTTP 模块处理所引发的事件,这与 IIS 的 ISAPI 筛选器相似。
∙将呈现被请求资源这项任务委托给 HTTP 处理程序,该处理程序与 IIS 的 ISAPI 扩展相似。
与 IIS 一样, 引擎在请求的有效期内将会触发事件,通过发信号来表示其处理过程从一个状态改变为了另一个状态。
例如,当 引擎首次响应请求时,BeginRequest事件将被触发。
接下来触发的是AuthenticateRequest事件,该事件在已建立用户标识时出现。
(此外,还有大量的其他事件:AuthorizeRequest、ResolveRequestCache和EndRequest,等等。
这些事件属于System.Web.HttpApplication类;有关详细信息,请参阅位于以下网址的技术文档:HttpApplication Class Overview。
)正如上一部分所讨论的,可以创建 ISAPI 筛选器以响应 IIS 引发的事件。
同样, 提供了 HTTP 模块,该模块可以响应由 引擎引发的事件。
可以将 Web 应用程序配置为具有多个 HTTP 模块。
对于由 引擎处理的每个请求,将初始化每个已配置的 HTTP 模块,并允许将事件处理程序绑定到处理请求期间所引发的事件。
请注意,对每个请求均使用了许多内置 HTTP 模块。
其中的一个内置HTTP 模块是FormsAuthenticationModule,该模块首先检查是否使用了窗体身份验证,如果使用,将检查是否对用户进行了身份验证。
如果没有使用,会自动将用户重定向到指定的登录页面。
如上所述,通过使用 IIS,传入请求将最终发送给 ISAPI 扩展,而 ISAPI 扩展的任务是返回特定请求的数据。
例如,在请求传统的 ASP 网页时,IIS 将请求传递给 asp.dll ISAPI 扩展,该扩展的任务是返回被请求的 ASP 页面的 HTML 标记。
引擎使用相似的方法。
初始化 HTTP 模块后, 引擎的下一项任务是确定应由哪个 HTTP 处理程序来处理请求。
所有通过 引擎传递的请求最终都将到达 HTTP 处理程序或 HTTP 处理程序工厂(HTTP 处理程序工厂仅返回 HTTP 处理程序的实例,然后使用该实例来处理请求)。
最终的 HTTP 处理程序将返回响应,即呈现被请求的资源。
此响应将被发送回 IIS,然后 IIS 将响应返回给提出请求的用户。
包括许多内置的 HTTP 处理程序。
例如,PageHandlerFactory用于呈现 网页。
WebServiceHandlerFactory用于呈现 Web 服务的响应 SOAP 信封。
TraceHandler将向trace.axd呈现请求的 HTML 标记。
图 2 描述了如何处理对 资源的请求。
首先,IIS 接收到请求,并将请求调度给aspnet_isapi.dll。
接下来, 引擎对已配置的 HTTP 模块进行初始化。
最后将调用正确的 HTTP 处理程序,并呈现被请求的资源,将所生成的标记返回给 IIS 和请求客户端。
图 2. IIS 和 正在处理请求创建和注册自定义 HTTP 模块和 HTTP 处理程序创建自定义 HTTP 模块和 HTTP 处理程序是相对简单的任务,包括创建实现正确接口的托管类。
HTTP 模块必须实现System.Web.IHttpModule接口,而 HTTP 处理程序和 HTTP 处理程序工厂必须分别实现System.Web.IHttpHandler接口和System.Web.IHttpHandlerFactory接口。
创建 HTTP 处理程序和HTTP 模块的细节超出了本文的范围。
要获得详细的背景知识,请阅读 Mansoor Ahmed Siddiqui 的文章HTTP Handlers and HTTP Modules in 。
创建了自定义 HTTP 模块或 HTTP 处理程序之后,必须将其注册到 Web 应用程序。
为整个 Web 服务器注册 HTTP 模块和 HTTP 处理程序仅需在 machine.config 文件中进行简单的添加即可;而为特定 Web 应用程序注册 HTTP 模块或 HTTP 处理程序包括向应用程序的 Web.config 文件中添加几行 XML。
特别要说明的是,要将 HTTP 模块添加到 Web 应用程序,应在 Web.config 的configuration/system.web 部分添加以下几行:<httpModules><add type="type" name="name" /></httpModules>type值提供了 HTTP 模块的程序集和类名称,而name值提供了友好名称,可以在 Global.asax 文件中使用此友好名称来引用 HTTP 模块。
Web.config 的 configuration/system.web 部分中的 <httpHandlers> 标记对 HTTP 处理程序和 HTTP 处理程序工厂进行了配置,如下所示:<httpHandlers><add verb="verb" path="path" type="type" /></httpHandlers>如上所述,对于每个传入请求, 引擎将确定应使用哪个 HTTP 处理程序来呈现请求。
此决定是基于传入请求的动词和路径做出的。
动词将指定所作出的 HTTP 请求的类型(GET 或 POST),而路径将指定被请求文件的位置和文件名。
因此,如果我们希望 HTTP 处理程序处理对扩展名为 .scott 的文件的所有请求(GET 或 POST),可以在 Web.config 文件中添加下面几行:<httpHandlers><add verb="*" path="*.scott" type="type" /></httpHandlers>其中,type 是 HTTP 处理程序的类型。
注意:注册 HTTP 处理程序时,应确保 HTTP 处理程序使用的扩展名已从 IIS 映射到 引擎,这一点非常重要。
也就是说,在本 .scott 示例中,如果 .scott 扩展名没有从 IIS 映射到aspnet_isapi.dll ISAPI 扩展,则对文件 foo.scott 的请求将导致 IIS 试图返回文件 foo.scott 的内容。
为了使 HTTP 处理程序可以处理此请求,必须将 .scott 扩展名映射到 引擎。
然后, 引擎将把请求正确地路由到相应的 HTTP 处理程序。
有关注册 HTTP 模块和 HTTP 处理程序的详细信息,请务必参考<httpModules> element documentation 和<httpHandlers> element documentation。
返回页首实现 URL 重写可以使用 ISAPI 筛选器在 IIS Web 服务器级别实现 URL 重写,也可以使用 HTTP 模块或 HTTP 处理程序在 级别实现 URL 重写。