设置 HTTP 请求头和 IIS 服务器变量

作者:Ruslan Yakushev

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

本演练将指导你了解如何使用 URL 重写模块版本 2.0 设置 HTTP 请求头和 IIS 服务器变量。

先决条件

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

  1. 启用了 ASP.NET 角色服务的 IIS 7.0 或更高版本
  2. 已安装 URL 重写模块 2.0

设置演练方案

为了演示如何使用 URL 重写模块 2.0 设置 HTTP 头和 IIS 服务器变量,我们将实现一个方案,在这个方案中,我们会根据请求的 URL 设置请求上的 HTTP Cookie 头。 例如,假设你有一个提供本地化网页的 Web 应用程序。 Web 应用程序根据请求中的 HTTP Cookie 确定响应的语言。 此方法的问题是,搜索引擎不会为此应用程序的本地化内容编制索引,因为搜索引擎抓取程序不使用 HTTP Cookie,因此 Web 应用程序只会提供默认语言的内容。 为了解决此问题,你决定添加有关语言的信息作为 URL 的一部分(例如,http://www.contoso.com/default.aspx),然后使用 URL 重写模块 2.0 设置 Web 应用程序所需的 Cookie,以确定响应的语言。 此外,还需要设置另一个名为 ORIGINAL_URI 的服务器变量,该变量将包含最初请求的 URI 字符串。

若设置演练方案,请复制以下 ASP.NET 代码并将其放入 %SystemDrive%\inetpub\wwwroot\ 文件夹中名为 language.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 v2 Test - Setting Server Variables</title>
</head>
<body>
 <h1>Setting HTTP request header and a server variable with URL Rewrite Module v2</h1>
 <p>The value of the Language cookie is <strong><%=( Request.Cookies["Language"] != null ) ? Request.Cookies["Language"].Value : "Cookie not set" %></strong></p>
 <p>The originally requested URI is <strong><%= HttpUtility.HtmlEncode( Request.ServerVariables["ORIGINAL_URI"] ) %></strong></p>
</body>
</html>

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

创建重写规则

你将使用以下格式创建用于重写 URL 的重写规则:

http://localhost/<language>/anyfile.aspx
将被重写为:
http://localhost/anyfile.aspx

重写规则还将设置两个 IIS 服务器变量:

  • HTTP_COOKIE
  • ORIGINAL_URI

你将使用 IIS 管理器中的 URL 重写 UI 创建重写规则。

打开 IIS 管理器,在左侧的树状视图中选择“默认网站”,然后开启“URL 重写”功能:

Screenshot of the I I S Manager's Default Web Site Home screen with a focus on the U R L Rewrite option.

允许更改服务器变量

默认情况下,分布式重写规则(即为特定网站或 Web 应用程序定义的规则)无法设置或更改任何 IIS 服务器变量,除非已将服务器变量添加到“允许”列表中。 在本演练中,需要将以下两个服务器变量添加到“允许的服务器变量”列表中:

  • HTTP_COOKIE
  • ORIGINAL_URI

注意

“允许的服务器变量”列表不适用于在服务器级别定义的全局规则。 如果使用全局重写规则设置服务器变量,则无需将服务器变量添加到“允许”列表。

从“操作”窗格中选择“查看服务器变量...”操作:

Screenshot of the U R L Rewrite screen with a focus on the View Server Variables option in the Actions pane.

使用“添加...”操作将服务器变量 HTTP_COOKIE 和 ORIGINAL_URI 添加到“允许的服务器变量”列表中:

Screenshot of the Add Server Variable dialog box with ORIGINAL underscore U R I entered as the Server variable name.

更新“允许的服务器变量”列表后,单击“返回规则”操作,回退到规则列表视图。

定义重写映射

下一步是定义一个用于映射 URL 部分的重写映射,将语言表示为由重写规则保存到 HTTP cookie 标头中的区域设置标识符。

在“操作”窗格中选择“查看重写映射...”操作:

Screenshot of the U R L Rewrite screen with a focus on the View Rewrite Maps option in the Actions pane.

单击“添加重写映射...”并将映射的名称指定为“Languages”:

Screenshot of the Add Rewrite Map dialog box with Languages entered as the Rewrite map name.

该映射将定义表示语言的 URL 部分与设置 HTTP 请求 cookie 时要使用的区域设置标识符之间的映射。 单击“编辑映射设置...”操作,指定在找不到映射时要使用的默认值。 输入“en_US”作为默认值:

Screenshot of the Edit Rewrite Map dialog box showing E N underscore U S as the default value to use when the key is not found in the map.

关闭对话框,然后使用“添加映射条目...”操作,添加以下映射:

原始值: 新值:
fr-fr fr_FR
de-de de_DE
ru-ru ru_RU

定义重写规则

最后,你将创建一个重写规则,该规则使用前面定义的重写映射设置服务器变量。

通过单击主功能视图中的“添加规则...”操作并从“入站规则”类别中选择“空白规则”,打开“编辑规则”对话框。 输入规则配置,如下所示:

Screenshot of the Edit Inbound Rule screen showing the Name, Match U R L, Conditions, Server Variables, and Actions sections.

  • 规则名称:“设置服务器变量

  • 请求的 URL:“匹配模式

  • 使用“正则表达式

  • 模式:“^([a-z]{2}-[a-z]{2})/(.*)

  • 条件:

    • 输入:“{Languages:{R:1}}”
    • 类型:“匹配模式”
    • 模式:“(.+)”
  • 操作:

    • 类型:“重写”
    • 重写 URL:“{R:2}”

规则的模式与包含语言段的任何 URL 路径匹配(例如,http://www.contoso.com/de-de/default.aspx)。 它还捕获规则后向引用中的语言段和 URL 路径的其余部分,以便稍后可以在规则中重复使用它们。 规则条件使用以前捕获的语言段作为传递给重写映射“Languages”的查找键。 映射查找的结果存储在条件后向引用中。 规则操作重写 URL 以使其不包含语言段。

展开“服务器变量...”并指定用于设置服务器变量的值:

Screenshot of the Server Variables dialog box with H T T P underscore COOKIE and ORIGINAL underscore U R L entered in the Name field.

  • 名称:HTTP_COOKIE,值:Language={C:1}
  • 名称:ORIGINAL_URI,值:http://{HTTP_HOST}{REQUEST_URI}

可通过使用条件后向引用来设置 HTTP cookie,其中包含从“Languages”重写映射中获取的区域设置标识符。 ORIGINAL_URI 服务器变量的值是使用 {HTTP_HOST} 和 {REQUEST_URI} 服务器变量构建而成。

单击“确定”以关闭对话框,然后在右侧的“操作”窗格中单击“应用”以保存规则。

测试规则

若要测试是否已通过规则正确设置 Cookie 和服务器变量,请打开 Web 浏览器并请求以下 URL:

http://localhost/fr-fr/language.aspx

Screenshot of the U R L Rewrite Module v 2 Test webpage with focus on the U R L bar, the Language cookie is set to F R underscore F R.

应会看到重写规则已根据请求的 URL 设置“语言”Cookie。 此外,可以通过“ORIGINAL_URI”服务器变量访问 ASP.NET 页的原始 URL 字符串。