使用 URL 重写模块 2.0

作者:Ruslan Yakushev

介绍

本文档部分适用于“用于 IIS 7 的 URL 重写 2.0”

用于 IIS 7 及更高版本的 URL 重写 2.0 是一个增量版本,其中包含版本 1.1 中的所有功能,并增加了对 .NET 扩展性和出站响应重写的支持。 更具体地说,它可用于:

  • 通过使用以 .NET 编写的重写提供程序来实现复杂的重写逻辑
  • 将响应 HTML 中 Web 应用程序生成的 URL 替换为对用户和搜索引擎更友好的等效项
  • 修改由反向代理后面的 Web 应用程序生成的 HTML 标记中的链接。
  • 通过使用正则表达式模式匹配来修复任何 HTTP 响应的内容。
  • 修改 HTTP 请求和响应头,以及 IIS 服务器变量。

功能

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

  • 自定义重写提供程序(RTW 中的新增功能)。 当 URL 重写逻辑不能以正则表达式模式表示时,或者需要根据存储在 web.config 文件(如 SQL 数据库或文本文件)之外的数据做出重写决策时,可使用重写提供程序。 客户重写提供程序可用任何 .NET 语言实现
  • 基于规则的响应重写引擎。 出站规则用于表达要与部分响应进行比较的内容的逻辑,以及比较成功时应执行的操作。 Web 服务器和站点管理员可使用出站规则来定义复杂的响应重写逻辑。
  • 特定 HTML 标记的内容中的重写。 可将规则配置为仅在某些 HTML 标记(例如 <a>、<img> 等)中查找特定匹配项,而不是扫描整个响应。这样,模式就大大简化了,将规则应用于该内容的过程比将模式应用于整个响应要快得多。
  • 出站规则的先决条件。 对每个响应应用重写规则是一项昂贵的操作,大多数情况下都不必要。 先决条件用于检查响应元数据,以确定是否应该应用出站规则评估。
  • 重写服务器变量和 HTTP 请求头。 可使用重写规则设置各种 IIS 服务器变量和 HTTP 请求头。
  • 重写 HTTP 响应头。 可使用出站重写规则修改任何现有的 HTTP 响应头或设置新的响应头。
  • 服务器变量的允许列表。 为了防止分布式重写规则意外或有意修改可能影响 Web 应用程序安全性或运行时行为的 IIS 服务器变量,现必须将可修改的服务器变量显式添加到允许列表中。
  • HtmlEncode 函数。 出站重写通常使用不受信任的数据(例如查询字符串或 HTTP 头)生成替换字符串以插入到 HTTP 响应中。 在这些情况下,应使用 HtmlEncode 函数以防止将客户端脚本插入响应中,这可能会导致跨站点脚本漏洞。
  • 跨规则条件跟踪捕获组。 URL 重写 1.1 中的条件反向引用逻辑仅适用于最后匹配的条件。 在 v2 中,可将反向引用逻辑配置为适用于所有匹配的条件。
  • 搜索引擎优化规则模板(RTW 中的新增功能)。 通过三个新的规则模板,可轻松创建重定向规则,这些规则将在你的站点上强制使用规范的网页 URL。
  • 反向代理规则模板(RTW 中的新增功能)。 此模板可用于快速生成实现反向代理配置的入站和出站重写规则。
  • 重写 URL 的日志记录。 可将重写规则配置为在 IIS W3C 日志中记录重写的 URL,而不是记录最初请求的 URL。
  • IIS 管理器中更新的用户界面。 用户界面已得到显著改进,以更好地表示模块配置,并简化诸如配置重写规则和重写条件等常见任务。

安装模块

使用模块主页 https://www.iis.net/extensions/urlrewrite 处的链接下载 URL 重写 2.0

注意

  • 如果已安装以前版本的 URL 重写(如 v1.0 和 v1.1),则会将其升级到 v2.0
  • 如果已安装 URL 重写 2.0 的 RC 版本,则会将其升级到 RTW 版本。

已知问题

  1. 响应重写无法与静态压缩一起工作。 必须禁用 IIS 静态压缩才能使用响应重写。
  2. 如果启用了 rewriteBeforeCache,则出站规则不会应用于已编码分块传输的响应。 如果需要重写已编码分块传输的响应,请将 rewriteBeforeCache 设置为 false

安装扩展性示例

URL 重写扩展性示例包括实现这些提供程序的 .NET 程序集和源代码:

  • DbProvider - 此提供程序可用于通过执行存储过程从 SQL Server 数据库表检索重写映射;
  • FileMapProvider - 此提供程序可用于检索存储在文本文件中的重写映射;
  • FileContainsProvider - 此提供程序可用于检查文本文件中的任何字符串是否为提供程序输入字符串的子字符串

从 MSDN 代码库下载 URL 重写扩展性示例

使用模块

这些文章介绍了 URL 重写 v2.0 的功能,并解释了如何使用它来完成常见的重写场景。

演练

功能参考