使用失败请求跟踪来跟踪重写规则

作者:Ruslan Yakushev

IIS 7.0 及更高版本的失败请求跟踪 (FRT) 是一种用于排查请求处理失败的强大工具。 FRT 可与 URL 重写模块一起使用,以跟踪重写规则应用于请求 URL 的方式。 本演练将指导你如何使用 FRT 对 URL 重写规则进行故障排除和调试。 有关失败请求跟踪的详细信息,请参阅本文

先决条件

本演练要求满足以下先决条件:

  1. IIS 7.0 或更高版本,已启用 ASP.NET 和“跟踪”角色服务
  2. 已安装 URL 重写 Go Live 版本

设置测试网页

为了演示 URL 重写模块的工作原理,我们将使用简单的测试 ASP.NET 页。 此页读取 Web 服务器变量并在浏览器中输出其值。

复制以下 ASP.NET 代码,并将其放入名为“article.aspx”的文件中的 %SystemDrive%\inetpub\wwwroot\ 文件夹中:

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>URL Rewrite Module Test</title>
</head>
<body>
      <h1>URL Rewrite Module Test Page</h1>
      <table>
            <tr>
                  <th>Server Variable</th>
                  <th>Value</th>
            </tr>
            <tr>
                  <td>Original URL: </td>
                  <td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
            </tr>
            <tr>
                  <td>Final URL: </td>
                  <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
      </table>
</body>
</html>

复制此文件后,浏览到 http://localhost/article.aspx 并检查页面是否在浏览器中正确呈现。

Screenshot of accessing the article page through the web browser.

配置重写规则

%SystemDrive%\inetpub\wwwroot\ 文件夹中找到 web.config 文件,或者创建一个(如果该文件不存在)。 打开 web.config 文件,并在 <system.webServer> 元素中添加以下部分:

<rewrite>
      <rules>
        <rule name="Fail bad requests">
          <match url="." />
          <conditions>
            <add input="{HTTP_HOST}" negate="true" pattern="localhost" />
          </conditions>
          <action type="AbortRequest" />
        </rule>
        <rule name="Rewrite to article.aspx">
          <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
          <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
        </rule>
      </rules>
</rewrite>
  • 如果 HTTP 请求的主机头与“localhost”不匹配,“Fail bad requests”规则将中止 HTTP 连接
  • “Rewrite to article.aspx”规则将 URL 从格式 http://localhost/article/234/some-title 重写为格式 http://localhost/article.aspx?id=234&title=some-title

通过打开浏览器并发出 http://localhost/article/234/some-title 请求来检查规则是否已正确配置。 如果规则设置正确,则应在浏览器中看到以下响应:

Screenshot of the U R L Rewrite Module Test Page that displays the original U R L and the rewritten version.

配置失败请求跟踪

现在为“默认网站”启用失败请求跟踪(有关如何启用 FRT 的分步说明,请参阅本文)。 启用失败请求跟踪后,我们将创建一个 FRT 规则,用于跟踪特定于 URL 重写模块的事件。

若要在 IIS 管理器中创建 FRT 规则,请执行以下步骤:

  1. 单击“失败请求跟踪规则”图标,获取 FRT 规则列表。
    Screenshot of the Default Web Site Home pane with Failed Request Tracing Rules selected.
  2. 单击“添加...”操作以启动 FRT 规则创建向导。Screenshot of the Add Failed Request Tracing Rule dialog with All content (asterisk) selected.
  3. 在向导的第一页上,选择“全部内容(*)”
  4. 单击“下一步”,将状态代码指定为“200-399”
    Screenshot of setting the status codes to the value of 200 dash 399.
  5. 单击“下一步”,然后取消选择除“WWW 服务器”之外的所有跟踪提供程序,然后取消选择除“重写”之外的所有提供程序区域Screenshot of setting Providers to only W W W Server and Areas to only Rewrite.
  6. 单击“完成”可保存 FRT 规则。

如果在 URL 重写模块后安装了失败请求跟踪,则跟踪提供程序中的“重写”区域可能不可用。 如果没有看到“重写”区域,请转到“添加/删除程序”,然后在修复模式下运行 URL 重写模块安装程序。

分析失败请求跟踪日志文件

创建 FRT 规则后,向 http://localhost/article/234/some-title 发出请求。 这将在 %SystemDrive%\inetpub\Logs\FailedReqLogFiles\ 中创建 FRT 日志。 可以使用 Internet Explorer 打开此日志,它将呈现为可以轻松浏览的 HTML 文档。 下面是可在跟踪日志文件中找到的 URL 重写特定事件的示例:

Screenshot of accessing an F R T log using a web browser. The log shows the list of rewrite rules and their rewrite logic.

这些事件显示了如何评估重写规则,以及重写模块如何修改请求的 URL。 让我们浏览一些事件,以更好地了解规则评估逻辑:

URL_REWRITE_START - 此事件指示 URL 重写事件的开始。 事件属性提供以下信息:

  • 输入 URL 字符串为“/article/234/some-title”。
  • 没有查询字符串。
  • Scope="Distributed" 表示规则是本地规则(即,规则在网站的 Web.config 中定义),而不是全局规则(即在服务器级别定义)。

RULE_EVALUATION_START - 此事件指示规则评估逻辑的开始。 事件属性提供以下信息:

  • 规则将正则表达式用于模式语法 (patternSyntax="ECMAScript")
  • 将评估后续规则 (StopProcessing = "false")
  • 规则在站点根级别定义 (RelativePath = "/")

PATTERN_MATCH - 此事件提供有关 URL 如何与规则模式匹配的信息。 事件属性提供以下信息:

  • 规则模式为“.”(也就是说,匹配任何字符)
  • 输入 URL 与模式成功匹配

CONDITIONS_EVALUATION_START - 由于输入 URL 与模式匹配,条件评估开始

CONDITION_EVALUATION - 此事件提供以下信息

  • HTTP_HOST 的值是“localhost”,它与模式匹配
  • 由于在规则(即 Negated="true")中指定了条件否定,条件评估没有成功。

CONDITIONS_EVALUATION_END - 此事件显示此规则的条件评估未成功

RULE_EVALUATION_END - 此事件显示规则未修改 URL (Succeeded="false")。 这是因为规则条件评估失败。

RULE_EVALUATION_START - 此事件显示 URL 字符串已传递到第二个规则

PATTERN_MATCH - 此事件提供有关 URL 如何与规则模式匹配的信息。 事件属性告诉我们:

  • 规则模式为:"^article/([0-9]+)/([0-9a-z]+)"
  • 输入 URL 与模式成功匹配

REWRITE_ACTION - 此事件指示规则评估成功,URL 重写为“/article.aspx”,查询字符串为“id=234&title=some-title”

总结

FRT 记录的 URL 重写特定事件提供了非常详细的信息,可用于对 URL 重写规则进行故障排除和调试,以及了解规则评估逻辑如何应用于 URL 字符串。