使用 URL 重写模块

作者: Ruslan Yakushev

关于 URL 重写模块

Microsoft URL 重写模块 2.0 for IIS 7 及更高版本使 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 问题的详细信息,请参阅 URL 重写 ASP.NET Web Forms

使用模块

这些文章介绍了 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。
  8. 在安装程序包中包含 IIS FastCGI 模块的更新
  9. 在安装程序包中包含 用于System.Web.dll的更新
  10. 在安装程序包中包含 IIS SetUri 函数的更新。

已知问题

  1. mod_rewrite使用 REQUEST_URI 服务器变量的规则在使用 URL 重写 导入规则 功能时可能无法正常工作。 若要修复导入的规则使用,可以使用任何文本编辑器打开包含这些规则的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 窗体身份验证中的自动检测模式使用重写 URL 进行重定向。 例如,如果请求的 URL 为“/article.htm”,而 URL 重写模块会将 URL 重写为“/article.aspx”,而受 Forms 身份验证保护,则 ASP.NET 会重定向到“/article.aspx?”AspxAutoDetectCookieSupport=1”。
  5. ASP.NET Forms 身份验证中的 UseUri 模式使用重写 URL 进行重定向。 例如,如果请求的 URL 为“/article.htm”,并且 URL 重写模块将 URL 重写为“/article.aspx”,而受 Forms 身份验证保护,则 ASP.NET 将重定向到“/ (S (vy2ebt45imfkmjjwboow3l55) ) /article.aspx”。
  6. 使用基于 URI 的身份验证或无 Cookie 会话状态时,ASP.NET 重写回原始 URL。 例如,当向“/ (S (vy2ebt45imfkmjwboow3l55) ) /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/