使用出站规则添加 Web 分析跟踪代码

作者:Ruslan Yakushev

本文档部分适用于 IIS 7 的 URL 重写模块版本 2.0

本演练指导你创建将 Web 分析跟踪脚本插入网页的 IIS 出站重写规则。

先决条件

若要运行本演练,必须满足以下要求:

  1. 已安装 URL 重写模块 2.0 RCrelease。

介绍

Web 分析服务的目的是向网站发布者提供有关其网站访问者的统计信息。 此信息可帮助网站发布者优化内容、广告和服务产品,以提高客户满意度和投资回报率。 通常,联机 Web 分析服务(例如 Google Analytics 或 Omniture)通过收集有关网站访问者的数据来工作。 当网站所有者请求报告时,网络分析提供商会处理这些数据并以方便、易于理解的格式将其呈现给网站所有者。 为了启用分析所需的数据收集,网站所有者必须使用由 Web 分析服务提供商发布的跟踪脚本来检测网站上的所有页面

在某些情况下,向网页添加跟踪代码是一项简单的任务。 但是,在许多情况下,可能需要手动将脚本添加到大量网页中。 在这种情况下,Web 分析检测就成了一项高开销且耗时的任务。 URL 重写模块版本 2 中的响应重写功能可以通过执行即时更改响应内容的出站规则来帮助解决这种情况。

创建出站重写规则

首先,你将创建一个出站重写规则,用于将 JavaScript 代码片段添加到 HTML 响应中。 该代码片段紧邻结束 </body> 标记之前插入,如下图所示

... 
    <script type='text/javascript'>
        //Your web analytics tracking code goes here...
    </script>
</body>

显示 HtmlEncode 函数的 H T M L Web 分析跟踪代码和 X M L 代码的示例。警告:在此特定示例中,假定 JavaScript 代码来自受信任的源,它应按原样插入到 HTML 页面中。 在其他许多情况下,当响应头或响应内容被出站重写规则修改时,应格外小心,以确保插入响应中的文本不包含任何客户端可执行代码,否则可能会导致跨站点脚本漏洞。 当重写规则使用不受信任的数据(例如 HTTP 标头或查询字符串)来生成要插入到 HTTP 响应中的字符串时,这一点尤其重要。 在这种情况下,替换字符串应使用 HtmlEncode 函数进行 HTML 编码,例如:

<action type="Rewrite" value="{HtmlEncode:{HTTP_REFERER}}" />

若要创建出站规则,请执行以下操作:

  1. 打开 IIS 管理器
  2. 选择“默认网站”
  3. 在功能视图中,选择“URL 重写模块”
    已选中“U R L 重写”的“I S 管理器”窗口功能视图的屏幕截图。
  4. 在右侧的操作窗格中,单击“添加规则...”。 在“添加规则”对话框中,选择“出站规则”类别下的“空白规则”,然后单击“确定”。
    “添加规则”对话框的屏幕截图,其中“出站规则”下选择了“空白规则”。

现在必须定义实际的出站规则。 在 URL 重写模块 2.0 中,出站重写规则是通过指定以下信息来定义的:

  • 规则名称。
  • 用于控制是否应将此规则应用于响应的可选前提条件。
  • 用于匹配响应中的字符串的模式。
  • 一组可选条件。
  • 当模式匹配并且所有条件检查都成功时要执行的操作。

命名规则

在“名称”文本框中输入用于唯一标识规则的名称,例如:“添加跟踪脚本”。

定义前提条件

前提条件用于评估是否应对响应执行出站规则评估。 例如,如果修改 HTML 内容的规则,则仅应根据此规则评估内容类型标头设置为“text/html”的 HTTP 响应。 出站规则评估和内容重写是 CPU 密集型操作,可能会对 Web 应用程序的性能产生负面影响。 因此,在应用出站规则时,请使用前提条件来缩小范围。

由于创建的规则应仅应用于 HTML 响应,因此需要定义一个前提条件来检查 HTTP 响应头 content-type 是否等于“text/html”。

若要定义前提条件,请执行以下操作:

  1. 在“前提条件”列表中,选择“<创建新的前提条件...>”。

  2. 随即你会转到“前提条件编辑器”对话框,需要在其中定义前提条件。 如下所述指定前提条件设置:

    • 名称:“IsHTML”

    • 使用:“正则表达式”

    • 单击“添加”以显示“添加条件”对话框。 在此对话框中,指定:

      • 条件输入:“{RESPONSE_CONTENT_TYPE}”

      • 检查输入字符串:“匹配模式”

      • 模式:“^text/html”

        “添加预条件编辑器”对话框的屏幕截图,其中包含设置。

  3. 单击“确定”保存前提条件并返回到“编辑规则”页。

定义匹配范围

出站重写规则可以对 HTTP 标头的内容或响应正文内容进行操作。 该规则需要修改响应内容,因此请在“匹配范围”下拉列表中选择“响应”。

定义模式

在“使用:”下拉列表中,选择“完全匹配”选项

在“模式”文本框中输入以下字符串:

</body>

定义操作

选择“操作”组框中列出的“重写”操作类型。 在“值”文本框中,输入以下字符串:

<script type='text/javascript'>//Your web analytics tracking code goes here...</script></body>

该字符串指定将用作响应中匹配字符串的替换项的新值。 在这种特殊情况下,字符串“</body>”将替换为 JavaScript 代码片段,后接结束 HTML body 标记。

保留所有其他设置的默认值。 “编辑规则”属性页应如下所示:

“编辑出站规则”属性页的屏幕截图,其中选择了设置。

单击右侧的“应用”操作保存规则。

查看配置文件中的重写规则

重写规则存储在 aplicationHost.config 文件或 web.config 文件中。 若要检查我们刚刚创建的规则的配置,请打开位于 %SystemDrive%\inetput\wwwroot\ 中的 web.config 文件。 在此文件中,应会看到包含所有规则定义的 <rewrite> 部分:

<rewrite>
 <outboundRules>
  <rule name="Add tracking script" patternSyntax="ExactMatch" preCondition="">
   <match filterByTags="None" pattern="&lt;/body>" />
   <action type="Rewrite" value="&lt;script type='text/javascript'>//Your web analytics tracking code goes here...&lt;/script>&lt;/body>" />
  </rule>
 <preConditions>
  <preCondition name="IsHTML">
    <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
  </preCondition>
 </preConditions>
</outboundRules>
</rewrite>

测试规则

若要测试规则是否正确地将 JavaScript 代码添加到网页,请请求此 URL http://localhost/iisstart.htm

从服务器收到响应后,打开实际的 HTML 源代码(如果使用 Internet Explorer 8,请转到“页面”-->“查看源代码”)。 响应 HTML 将在结束 HTML 主体标记之前包含 JavaScript 代码:

I S 7 窗口的屏幕截图,其中记事本显示了 JavaScript 代码。

总结

在本演练中,你已了解如何使用 URL 重写模块版本 2 中的出站规则来即时修改 HTTP 响应内容。 需要对 Web 应用程序生成的 HTTP 响应进行较小修改,但无法控制应用程序或者对应用程序进行大规模更改不切实际时,此功能非常有用。