使用 URL 重写模块

作者:Ruslan Yakushev

关于 URL 重写模块

适用于 IIS 7 及更高版本的 Microsoft URL 重写模块 2.0 使 IIS 管理员能够创建功能强大的自定义规则,将请求 URL 映射到便于用户记住、并更轻松地查找搜索引擎的友好 URL。 可以使用 URL 重写模块执行 URL 操作任务,其中包括:

  • 定义强大的规则,将复杂 URL 转换为简单且一致的 Web 地址。
  • 轻松替换 Web 应用程序 URL,以生成用户和搜索引擎友好结果。
  • 基于 HTTP 标头和 IIS 服务器变量重写 URL。
  • 根据重写规则中表达的逻辑执行重定向、发送自定义响应或停止 HTTP 请求。
  • 根据 URL 段或请求元数据控制对网站内容的访问。

URL 重写模块既可以作为下载在自己的 IIS 服务器安装,也可以在 Microsoft 的 Azure 网站云平台上安装。

URL 重写 2.0 功能

Microsoft URL 重写模块 2.0 包含以下主要功能:

  • 基于规则的 URL 重写引擎。 重写规则定义用于分析请求 URL 的逻辑,并在请求 URL 与定义的规则匹配时,将其映射到重写 URL。 Web 服务器和网站管理员可以使用重写规则集来定义 URL 重写逻辑。
  • 正则表达式模式匹配。 重写规则可以使用正则表达式语法进行 ECMA-262 中定义的模式匹配。
  • 通配符模式匹配。 重写规则可以使用通配符语法进行模式匹配。
  • 全局和分布式重写规则。 URL 重写使用全局规则定义服务器范围的 URL 重写逻辑。 这些规则在 applicationHost.config 文件中定义,它们取代在配置层次结构中较低级别配置的规则。 该模块还使用分布式规则来定义特定于特定配置范围的 URL 重写逻辑。 可以使用 Web.config 文件在任何配置级别定义这种类型的规则。
  • 访问服务器变量和 HTTP 标头。 服务器变量和 HTTP 标头提供有关当前 HTTP 请求的其他信息。 此信息可用于配置重写规则或撰写输出 URL。
  • 各种规则操作。 规则可能会执行其他操作,例如发出 HTTP 重定向、中止请求或将自定义状态代码发送到 HTTP 客户端,而不是重写 URL。
  • 对 IIS 内核模式和用户模式输出缓存的支持。 IIS 输出缓存为 Web 应用程序提供显著的性能改进。 URL 重写模块与这两种类型的输出缓存完全兼容。 这意味着,可以安全地缓存重写 URL 的响应,从而提升依赖 URL 重写的 Web 应用程序的性能。
  • 字符串操作函数。 内置字符串操作函数可用于将 URL 转换为小写,并执行 URL 编码和解码。
  • 重写映射。 重写映射是名称值对的任意集合。 可以在重写规则中使用重写映射来生成替换 URL。 当你有一大套重写规则时,重写映射特别有用,所有这些规则都使用静态字符串(即没有使用模式匹配)。 在这些情况下,可以使用输入 URL 作为键,将替换 URL 作为值,将其中的所有映射放入重写映射中,而不是定义一大套简单的重写规则。 然后,可以拥有一个引用重写映射的重写规则,以基于输入 URL 查找替换 URL。
  • 失败请求跟踪支持。 IIS 失败请求跟踪可用于排查与 URL 重写相关的错误。
  • 规则模板。 规则模板是 URL 重写模块用户界面的扩展,可简化特定任务的重写规则的创建。 该模块包含 3 个规则模板,还支持插入任意数量的自定义模板。
  • 用于测试正则表达式和通配符模式的用户界面 (UI)。 模块中提供了用于测试规则模式的 UI。 使用 UI 可以在重写规则中快速检查正则表达式或通配符模式的结果。 还可以使用 UI 排查和调试与模式匹配相关的问题。
  • 用于管理重写规则和重写映射的 UI。 可以使用 IIS 管理器中的 URL 重写模块添加、删除和编辑重写规则和重写映射。
  • 用于导入 mod_rewrite 规则的 UI。 URL 重写模块包括用于将重写规则从 mod_rewrite 格式转换为 IIS 格式的 UI。

在何处获取 URL 重写模块

有关详细信息和下载模块,请参阅 URL 重写扩展主页

从 Go Live 版本升级

如果已安装 URL 重写模块的 Go Live 版本,安装包会将其升级到 URL 重写版本 2.0。 将保留 ApplicationHost.config 和 Web.config 文件中的所有重写规则。

ASP.NET 更新

URL 重写模块安装程序包包括一个 ASP.NET 更新,用于修复特定于 URL 重写模块的 ASP.NET bug。 具体而言,更新包含以下 bug 的修补程序:

  1. 使用 URL 重写时,ASP.NET Web 服务器控件中的 ~ 运算符解析不正确。
  2. 当 sitemap 包含虚拟 URL 时,ASP.NET SiteMap.CurrentNode 属性返回 null。

仅当安装 URL 重写模块的计算机具有 .NET Framework 3.5 SP1 或更高版本时,才会应用更新。 如果在安装 URL 重写模块后安装所需的 .NET Framework 版本,可以通过运行 URL 重写模块安装程序,然后选择安装程序对话框中的“修复”选项来应用 ASP.NET 更新。

有关这些和其他与 URL 重写相关的其他 ASP.NET 问题的详细信息,请参阅 ASP.NET Web 窗体的 URL 重写

使用模块

这些文章介绍了 URL 重写模块的功能,并说明如何使用它来实现常见的 URL 重写方案。

学习基础知识

参考和指南

视频演练

自 Go Live 发布以来的更改

自 Go Live 发布以来,对 URL 重写模块进行了以下新增、更改和重要 bug 修复:

  1. 添加了字符串操作函数 UrlEncodeUrlDecode
  2. 通过服务器变量 UNENCODED_URL 提供对原始 URL 的访问权限。 此服务器变量现在完全包含 Web 浏览器请求的原始编码 URL。
  3. 添加了用于为应用程序请求路由 (ARR) 配置重写规则的 UI。
  4. 添加了对从 URL 重写模块的 Go Live 版本就地升级的支持。
  5. 添加了清理内部缓存的功能,以避免在缓存重写规则时过度使用内存。
  6. 修复了与包含非 ASCII 字符的 URL 重写相关的 bug。
  7. 修复了处理正则表达式的 bug,该 bug 会导致不区分大小写的模式错误地计算字符范围。
  8. 在安装程序包中包含 IIS FastCGI 模块的更新
  9. 已将 System.Web.dll 更新包含在安装程序包中。
  10. 在安装程序包中包含 IIS SetUri 函数的更新。

已知问题

  1. 在使用 URL 重写导入规则功能时,使用 REQUEST_URI 服务器变量的 mod_rewrite 规则可能无法正常工作。 若要修复导入的规则使用,可以使用任何文本编辑器打开包含这些规则的 Web.config 文件。 找到该 <rewrite> 节,然后在该节内将字符串“{SCRIPT_NAME}”的所有实例替换为字符串“{URL}”。
  2. 摘要式身份验证不能与 URL 重写模块一起使用。
  3. ASP.NET 窗体身份验证使用重写 URL 进行重定向。 例如,如果请求的 URL 为“/article.htm”,并且 URL 重写模块将 URL 重写为“/article.aspx”(受 Forms 身份验证保护),则 ASP.NET 将重定向到“/login.aspx?ReturnUrl=%2Farticle.aspx”。
  4. ASP.NET Forms 身份验证中的自动检测模式使用重写的 URL 进行重定向。 例如,如果请求的 URL 为“/article.htm”,并且 URL 重写模块将 URL 重写为“/article.aspx”(受 Forms 身份验证保护),则 ASP.NET 将重定向到“/article.aspx?AspxAutoDetectCookieSupport=1”。
  5. ASP.NET 窗体身份验证中的 UseUri 模式使用重写 URL 进行重定向。 例如,如果请求的 URL 为“/article.htm”,并且 URL 重写模块将 URL 重写为“/article.aspx”(受 Forms 身份验证保护),则 ASP.NET 将重定向到“/(S(vy2ebt45imfkmjjwboow3l55))/article.aspx”。
  6. 使用基于 URI 的身份验证或无 Cookie 会话状态时,ASP.NET 重写回原始 URL。 例如,当向“/(S(vy2ebt45imfkmjjwboow3l55))/article.htm”发出请求时,URL 重写模块将“/article.htm”重写为“/article.aspx”,然后 ASP.NET 将 URL 重写回“/article.htm”,这可能会导致“404 - 找不到文件”错误。
  7. 当 URL 重写模块重写到文件夹时,IIS DefaultDocument 模块可能会重定向到重写的 URL。 例如,如果重写规则中的替换 URL 为“/folder1/folder2”,并且这些文件夹存在于文件系统上,并配置了默认文档,则 DefaultDocument 模块会将 Web 客户端重定向到“/folder1/folder2/”,从而公开重写的 URL。 若要防止发生这种情况,请在重写到文件夹时使用替换 URL 末尾的“/”,例如“/folder1/folder2/