为 URL 重写模块创建重写规则

作者:Ruslan Yakushev

URL 重写模块是 IIS 的扩展,可作为独立 IIS 服务器的下载,同时已预装在 Windows Azure 网站 (WAWS)供你使用。 本演练指导你为 URL 重写模块创建并测试一组重写规则。

先决条件

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

  1. 启用了 ASP.NET 角色服务的 IIS 7 或更高版本。
  2. 安装了 URL 重写模块。 有关详细信息,请参阅使用 URL 重写模块

设置测试网页

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

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

<%@ 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 并检查系统是否已在浏览器中正确呈现页面。

创建重写规则

我们将创建一个简单的重写规则,它使用以下格式重写 URL:

http://localhost/article/342/some-article-title
更改为:
http://localhost/article.aspx?id=342&title=some-article-title

我们将使用 IIS 管理器中的 URL 重写 UI 创建重写规则。 为此,请按照下列步骤进行操作:

  1. 转到 IIS 管理器。
  2. 选择“默认网站”
  3. 在功能视图中,单击“URL 重写”
    Screenshot that shows the Default Web Site Home pane. U R L Rewrite is selected.
  4. 在右侧的“操作”窗格中,单击“添加规则...”
    Screenshot that shows the U R L Rewrite pane.
  5. 在“添加规则”对话框中选择“空白规则”,然后单击“确定”
    Screenshot that shows the Add Rules dialog box.

现在必须定义实际的重写规则。 在 URL 重写模块中,重写规则是通过指定四项必要信息来定义的:

  • 规则名称。
  • 用于匹配 URL 字符串的模式。
  • 一组可选条件。
  • 当模式匹配并且所有条件检查成功时要执行的操作。

为规则命名

在“名称”文本框中输入用于唯一标识该规则的名称,例如:“重写为 article.aspx”

Screenshot that shows the Edit Inbound Rule pane.

定义模式

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

^article/([0-9]+)/([_0-9a-z-]+)

此字符串是一个正则表达式,指定模式将匹配任何满足以下条件的 URL 字符串:

  1. 以字符序列“article/”开头。
  2. 第一个“/”后面包含一个或多个数字字符。
  3. 第二个“/”后面包含一个或多个字母数字、“_”或“-”字符。

请注意,正则表达式的某些部分包含在括号中。 这些括号创建一个捕获组,稍后可以使用反向引用在规则中引用该捕获组。

定义操作

由于要创建的规则应该重写 URL,因此请选择“操作”组框中列出的“重写”操作类型。 在“重写 URL”文本框中,输入以下字符串

article.aspx?id={R:1}&title={R:2}

此字符串指定输入 URL 应重写为的新值。 请注意,对于查询字符串参数值,我们使用了 {R:1} 和 {R:2},它们是对使用括号在规则模式中定义的捕获组的反向引用。

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

Screenshot that shows the Edit Inbound Rule property page.

单击右侧的“应用”以保存规则

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

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

<rewrite>
  <rules>
    <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>

上述语法也适用于在 Windows Azure 网站 (WAWS) 的 Web.config 中配置 URL 重写。

测试重写规则

若要测试规则是否正确重写 URL,请打开 Web 浏览器并请求以下 URL:

http://localhost/article/234/some-title

应会看到 Web 服务器上的重写规则已将原始 URL 更改为 Article.aspx,并且已将“234”和“some-title”作为查询字符串参数值传递。

Screenshot that shows the U R L Rewrite Module Test Page in Internet Explorer.

创建重定向规则

现在我们创建一个重定向规则,该规则将以下格式的所有 URL 重定向到:

http://localhost/blog/some-other-title/543
以下格式:
http://localhost/article/543/some-other-title

重定向规则允许多个 URL 指向单个网页。

为此,请在 IIS 管理器中打开 URL 重写功能视图 UI。 单击“添加规则...”,然后再次选择“空白规则”模板

在“编辑规则”页中输入以下内容

  • 名称:“从博客重定向”(这是规则的唯一名称。)
  • 模式:^blog/([_0-9a-z-]+)/([0-9]+)(此模式将匹配以“blog”开头的 URL 字符串,并将 URL 的第二和第三个段捕获到反向引用中。)
  • 操作:重定向(重定向操作将导致重定向响应发送回浏览器。)
  • 重定向 URL:article/{R:2}/{R:1}(此替换字符串将用作重定向 URL;请注意,它使用反向引用来保留和重新排列在模式匹配期间捕获的原始 URL 片段。)

输入名称、模式和操作,如下所示:

Screenshot that shows the Edit Inbound Rule pane. There are new entries for name, pattern and action.

输入重定向 URL,如下所示:

Screenshot that shows the Edit Inbound Rule pane. Under Action type, redirect has been selected and a Redirect U R L is entered.

保留所有其他设置的默认值。 单击右侧的“应用”以保存规则

测试重定向规则

若要测试规则是否正确重定向请求,请打开 Web 浏览器并请求以下 URL:

http://localhost/blog/some-other-title/323

应会看到,由于执行重定向规则,浏览器被重定向到 http://localhost/article/323/some-other-title,然后根据之前创建的重写规则重写了请求。

Screenshot that shows Internet Explorer on the U R L Rewrite Module Test Page.

创建访问阻止规则

要创建的第三个规则用于阻止向网站发出的所有请求(如果这些请求未设置主机头)。 当你想要防止通过针对服务器的 IP 地址而不是使用主机名发出 HTTP 请求来进行黑客攻击时,此类规则非常有用。

我们将在不使用 IIS 管理器的情况下创建此规则。 打开 %SystemDrive%\inetpub\wwwroot\ 文件夹中的、先前在本文中用作 article.aspx 测试文件的 Web.config 文件。 找到 <rewrite> 部分。 将以下规则插入到 <rules> 集合中,使其成为集合中的第一个规则:

<rule name="Fail bad requests">
  <match url=".*"/>
  <conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
  </conditions>
  <action type="AbortRequest" />
</rule>

<rewrite> 部分应类似于以下代码:

<rewrite>
  <rules>
    <rule name="Fail bad requests">
      <match url=".*"/>
      <conditions>
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="AbortRequest" />
    </rule>
    <rule name="Redirect from blog">
      <match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
      <action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
    </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>

让我们分析一下该规则以了解它的作用。

<match url=".*"/>

上面的元素表示该规则将匹配任何 URL 字符串。

<add input="{HTTP_HOST}" pattern="localhost" negate="true" />

上面的元素向规则添加一个条件,该条件通过读取服务器变量 HTTP_HOST 来检索主机头值,将其与模式“localhost”进行匹配,然后否定匹配结果。 换言之,该条件验证主机头是否与“localhost”不匹配。

<action type="AbortRequest" />

上面的元素告知 URL 重写模块结束 HTTP 请求。

测试访问阻止规则

若要测试该规则,请打开 Web 浏览器并向 http://127.0.0.1/article/234/some-title 发出请求。 你应该看到的是一个浏览器,该浏览器没有收到来自服务器的任何响应。 但是,如果你请求 http://localhost/article/234/some-title,则 Web 服务器会成功进行响应。

失败结果显示如下:

Screenshot that shows a browser saying, This page can't be displayed.

成功结果显示如下:

Screenshot that shows the U R L Rewrite Module Test Page in a browser.

总结

在本演练中,你已了解如何使用 IIS 管理器或通过手动编辑 Web.config 文件来配置 URL 重写规则。 本演练中创建的规则演示了 URL 重写模块的一些重要功能,例如正则表达式支持,以及使用 HTTP 标头和服务器变量做出重写决策的功能。