使用失败请求跟踪来跟踪重写规则
IIS 7.0 及更高版本的失败请求跟踪 (FRT) 是一种用于排查请求处理失败的强大工具。 FRT 可与 URL 重写模块一起使用,以跟踪重写规则应用于请求 URL 的方式。 本演练将指导你如何使用 FRT 对 URL 重写规则进行故障排除和调试。 有关失败请求跟踪的详细信息,请参阅本文。
先决条件
本演练要求满足以下先决条件:
- IIS 7.0 或更高版本,已启用 ASP.NET 和“跟踪”角色服务
- 已安装 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
并检查页面是否在浏览器中正确呈现。
配置重写规则
在 %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}&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
请求来检查规则是否已正确配置。 如果规则设置正确,则应在浏览器中看到以下响应:
配置失败请求跟踪
现在为“默认网站”启用失败请求跟踪(有关如何启用 FRT 的分步说明,请参阅本文)。 启用失败请求跟踪后,我们将创建一个 FRT 规则,用于跟踪特定于 URL 重写模块的事件。
若要在 IIS 管理器中创建 FRT 规则,请执行以下步骤:
- 单击“失败请求跟踪规则”图标,获取 FRT 规则列表。
- 单击“添加...”操作以启动 FRT 规则创建向导。
- 在向导的第一页上,选择“全部内容(*)”
- 单击“下一步”,将状态代码指定为“200-399”
- 单击“下一步”,然后取消选择除“WWW 服务器”之外的所有跟踪提供程序,然后取消选择除“重写”之外的所有提供程序区域
- 单击“完成”可保存 FRT 规则。
如果在 URL 重写模块后安装了失败请求跟踪,则跟踪提供程序中的“重写”区域可能不可用。 如果没有看到“重写”区域,请转到“添加/删除程序”,然后在修复模式下运行 URL 重写模块安装程序。
分析失败请求跟踪日志文件
创建 FRT 规则后,向 http://localhost/article/234/some-title
发出请求。 这将在 %SystemDrive%\inetpub\Logs\FailedReqLogFiles\
中创建 FRT 日志。 可以使用 Internet Explorer 打开此日志,它将呈现为可以轻松浏览的 HTML 文档。 下面是可在跟踪日志文件中找到的 URL 重写特定事件的示例:
这些事件显示了如何评估重写规则,以及重写模块如何修改请求的 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 字符串。