修改 HTTP 响应头

作者:Ruslan Yakushev

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

本演练介绍如何使用 URL 重写模块 v 2.0 设置 HTTP 响应头。

先决条件

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

  1. 启用了 ASP.NET 角色服务的 IIS 7 或更高版本;
  2. 已安装 URL 重写模块 2.0 候选版本;
  3. 已完成使用 URL 重写 v2 和应用程序请求路由的反向代理上的演练。

介绍

URL 重写模块 2.0 支持基于规则进行 HTTP 头重写。 设置响应头的一个非常常见的使用场景是,修改负载均衡器或反向代理后面的应用程序生成的重定向响应。 例如,当反向代理后面的应用程序返回重定向响应时,响应中的 HTTP Location 标头可能不表示面向 Internet 的地址,而是表示内部应用程序地址。 URL 重写模块 2.0 可在反向代理服务器上用来修改响应中的 Location 标头。 下图说明了这个场景:

Diagram that shows the redirect response process among the client, reverse proxy server, and the internal client server.

  1. HTTP 客户端向网页 http://www.contoso.com/webmail/oldpage.aspx 发出请求。
  2. 反向代理服务器使用 URL 重写 2.0 和应用程序请求路由,根据请求的 URL 路径中的文件夹名称将请求转发到内部内容服务器。 例如 http://webmail/oldpage.aspx
  3. 在内容服务器上运行的 Web 应用程序发出重定向响应 (HTTP/1.1 301),将 HTTP 客户端指向 http://webmail/newpage.aspx
  4. 反向代理服务器使用 URL 重写 2.0 将响应中基于内部的重定向位置替换为基于 Internet 的重定向位置:http://www.contoso.com/webmail/newpage.aspx

设置演练方案

若要设置演练方案,请完成有关使用 URL 重写 v2 和应用程序请求路由的反向代理的演练。 在该演练结束时,你应该会有一个反向代理网站,用于将请求路由到两个内容应用程序:“Web 邮件”和“工资单”。

在本演练中,需要向“Web 邮件”应用程序添加重定向逻辑。 在现实场景中,这可能是 Web 应用程序代码发起的重定向,但为简单起见,在本演练中,你将在 URL 重写模块中使用重定向规则。

  1. 在以下文件夹中创建一个名为 web.config 的文件:

    %SystemDrive%\inetpub\webmail
    
  2. 在文本编辑器中打开该文件,将以下 XML 代码粘贴到其中,然后保存该文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <system.webServer>
      <rewrite>
        <rules>
         <rule name="Redirect" stopProcessing="true">
         <match url="^index\.aspx$" />
         <action type="Redirect" url="default.aspx" />
        </rule>
       </rules>
      </rewrite>
    </system.webServer>
    </configuration>
    

    这是将 index.aspx 的所有请求重定向到 default.aspx 的规则。

现在打开 Web 浏览器并发出请求 http://localhost/webmail/index.aspx。 请注意,浏览器被重定向到 http://localhost:8081/default.aspx,这基本上是“Web 邮件”Web 应用程序使用的内部 URL。 现在,将 URL 重写规则配置为修改 HTTP 重定向响应中的 HTTP Location 标头,以便将浏览器重定向到适当的 URL:http://localhost/webmail/default.aspx

修改入站规则以保留主机头

为了能够修改 HTTP Location 标头,必须保留 HTTP 主机头的原始值。 修改响应时,出站重写规则使用保留的值。 若要保留原始值,请将其存储在临时服务器变量 ORIGINAL_HOST 中。

  1. 在主 URL 重写功能视图页中,在右侧的“操作”窗格中选择“查看服务器变量”:
    Screenshot of View Server Variables under Manage Server Variables in the Actions pane.
  2. 在“允许的服务器变量”页中,选择“添加”,然后输入将用于临时存储 HTTP 主机头值的服务器变量的名称。 例如,ORIGINAL_HOST:
    Screenshot of Server variable name set to ORIGINAL underscore HOST.
  3. 选择“确定”来保存更改,然后返回到主 URL 重写功能视图页。 然后,选择“反向代理到 Web 邮件”入站规则,再选择“编辑”。
  4. 在“编辑入站规则”页中,展开“服务器变量”组框,然后选择“添加”,并为服务器变量输入“ORIGINAL_HOST”,为“值”输入“{HTTP_HOST}”:
    Screenshot of the Edit Inbound Rule page with Set Server Variable Value set to curly brace H T T P underscore HOST curly brace.

创建出站规则以修改 HTTP 响应头

现在,你将创建一个出站重写规则,它在重定向响应中重写 HTTP Location 标头,以将应用程序文件夹添加回 URL 路径并替换主机名。

  1. 在主 URL 重写功能视图页中,选择“添加规则”,然后在“出站规则”类别下选择“空白规则”。
  2. 在“编辑出站规则”页中,将规则命名为“重写 Location 标头”。
  3. 在“先决条件”下拉列表中,选择“创建新的先决条件”。<>
  4. 在“添加先决条件”对话框中,将预条件命名为“IsRedirection”
  5. 选择“添加”,然后输入“{RESPONSE_STATUS}”作为条件输入,输入“3\d\d”作为模式。 此先决条件用于检查响应是否具有重定向状态代码(例如 301、302、307 等)。 “添加组件”对话框应如下所示:
    Screenshot of curly brace RESPONSE underscore STATUS curly brace set as an input and 3 backslash d backslash d set as the pattern.
  6. 选择“确定”,返回到“编辑出站规则”页。
  7. 在“匹配”组框中,使用“匹配范围”下拉列表选择“服务器变量”。
  8. 为“变量名称”输入 RESPONSE_Location,为“模式”输入“^http://[^/]+/(.*)”。 这会配置规则以对响应 HTTP 头“Location”进行操作,并将其值与将 URL 路径存储到向后引用的正则表达式模式匹配。
  9. 展开“条件”组框,选择“添加”,然后输入 {ORIGINAL_HOST} 作为条件输入,输入“.+”作为条件模式。 此条件检查临时服务器变量 ORIGINAL_HOST 是否存在以及是否具有非空值。
  10. 再次选择“添加”,并另外添加一个条件。 将条件输入设置为“{URL}”,将模式设置为“^/(webmail|payroll)/.*”。 此正则表达式用于匹配以 /webmail 或 /payroll 开头的 URL 路径。 此外,模式中的括号捕获所匹配的 URL 字符串的一部分,以便可在构造替换 URL 时重复使用它。
  11. 最后,在“操作”组框中,选择“重写”操作并输入“http://{ORIGINAL_HOST}/{C:1}/{R:1}”作为值。 此操作将 HTTP Location 标头的值替换为一个字符串,该字符串使用服务器变量中的主机名、包含 URL 路径文件夹前缀的条件向后引用以及包含 Location 标头中当前 URL 路径的规则向后引用来构造。

完成的页面应如下所示:

Screenshot of the Edit Outbound Rule pane with ORIGINAL HOST and U R L set as condition input.

测试规则

若要测试规则是否正常工作,请打开 Web 浏览器并向 http://localhost/webmail/index.aspx 发出请求。 浏览器应该会重定向到 http://localhost/webmail/default.aspx

Screenshot of a web browser with the original U R L redirecting to the new U R L.

总结

在此演练中:

  • 你学习了如何使用 URL 重写 2.0 中的多项新功能来实现功能完备的反向代理方案。
  • 你已经将入站规则配置为将请求转发到后端内容服务器并设置临时服务器变量。
  • 然后,你定义了一个出站规则,用于修改 Web 应用程序从后端内容服务器生成的重定向响应中的 HTTP Location 标头。