作者: Ruslan Yakushev
本文档的此部分适用于 IIS 7 的 URL 重写模块版本 2.0。
本演练介绍如何使用 URL 重写模块 v 2.0 设置 HTTP 响应标头。
先决条件
本演练需要满足以下先决条件:
- 启用了 ASP.NET 角色服务的 IIS 7 或更高版本;
- 已安装 URL 重写模块 2.0 候选版本;
- 反向代理、URL 重写 v2 和应用程序请求路由的演练已完成。
介绍
URL 重写模块 2.0 支持基于规则的 HTTP 标头重写。 设置响应标头的一个非常常见的使用方案是修改负载均衡器或反向代理后应用程序生成的重定向响应。 例如,当反向代理后面的应用程序返回重定向响应时,响应中的 HTTP 位置标头可能不表示面向 Internet 的地址,而是内部应用程序地址。 URL 重写模块 2.0 可用于反向代理服务器,以修改响应中的 Location 标头。 下图显示了此方案:
- HTTP 客户端向网页
http://www.contoso.com/webmail/oldpage.aspx发出请求。 - 反向代理服务器使用 URL 重写 2.0 和应用程序请求路由根据请求的 URL 路径中的文件夹名称将请求转发到内部内容服务器。 例如,
http://webmail/oldpage.aspx; - 在内容服务器上运行的 Web 应用程序发出重定向响应(HTTP/1.1 301),将 HTTP 客户端
http://webmail/newpage.aspx指向: - 反向代理服务器使用 URL 重写 2.0 将响应中基于内部的重定向位置替换为基于 Internet 的重定向位置:
http://www.contoso.com/webmail/newpage.aspx
设置演练场景
为设置演练场景,请完成关于 使用 URL 重写 v2 和应用程序请求路由的反向代理 的演练。 在该演练结束时,应有一个反向代理网站,用于将请求路由到两个内容应用程序:Webmail 和工资单。
在本演练中,需要向 Webmail 应用程序添加重定向逻辑。 在现实方案中,这可能是 Web 应用程序代码发起的重定向,但为简单起见,在本演练中,你将在 URL 重写模块中使用重定向规则。
在以下文件夹中创建名为 web.config 的文件:
%SystemDrive%\inetpub\webmail在文本编辑器中打开该文件,将以下 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,这基本上是 Webmail Web 应用程序使用的内部 URL。 现在,将 URL 重写规则配置为修改 HTTP 重定向响应中的 HTTP 位置标头,以便将浏览器重定向到正确的 URL: http://localhost/webmail/default.aspx
修改入站规则以保留主机标头
为了能够修改 HTTP 位置标头,必须保留 HTTP 主机标头的原始值。 修改响应时,出站重写规则使用保留的值。 若要保留原始值,请将其存储在临时服务器变量ORIGINAL_HOST中。
- 在主 URL 重写功能视图页中,在右侧的“操作”窗格中选择“查看服务器变量”:
- 在 “允许的服务器变量 ”页中,选择“ 添加 ”,然后输入将用于临时存储 HTTP 主机标头值的服务器变量的名称。 例如,ORIGINAL_HOST:
- 选择 “确定 ”保存更改,然后返回到主 URL 重写功能视图页。 之后,选择“反向代理到 Web 邮件”入站规则,然后选择“ 编辑”。
- 在“编辑入站规则”页中,展开“服务器变量”组框;然后选择添加并输入服务器变量名称为“ORIGINAL_HOST”,其“值”为“{HTTP_HOST}”;
创建出站规则以修改 HTTP 响应标头
现在,你将创建一个出站重写规则,在重定向响应中重写 HTTP 位置标头,以将应用程序文件夹添加回 URL 路径并替换主机名。
- 在主 URL 重写功能视图页中,选择“添加规则”,然后在“出站规则”类别下选择“空白规则”。
- 在“编辑出站规则”页中,将规则命名为“重写位置标头”。
- 在“先决条件”下拉列表中,选择“<创建新的先决条件>”。
- 在“添加先决条件”对话框中,将预条件命名为“IsRedirection”
- 选择“添加”,然后输入 {RESPONSE_STATUS} 作为条件输入,“3\d\d”作为模式。 此先决条件用于检查响应是否具有重定向状态代码,例如 301、302、307 等。 预条件对话框应如下所示:
- 选择 “确定 ”以返回到 “编辑出站规则 ”页。
- 在 “匹配 ”组框中,使用 “匹配范围 ”下拉列表选择 “服务器变量”。
- 为“变量名称”输入RESPONSE_Location,为“模式”输入^http://[^/]+/(.*)。 这会配置规则以对响应的 HTTP 头“Location”进行操作,并将其值与一个正则表达式模式进行匹配,该模式将 URL 路径存储到后向引用中。
- 展开“条件”组框,选择“添加”,然后输入 {ORIGINAL_HOST} 作为条件输入和“.+”作为条件模式。 此条件检查临时服务器变量ORIGINAL_HOST是否存在并且具有非空值。
- 选择“ 再添加 一次”并添加另一个条件。 将条件输入设置为 {URL} ,并将模式设置为“^/(webmail|payroll)/.*”。 此正则表达式用于匹配以 /webmail 或 /payroll 开头的 URL 路径。 此外,模式中的括号捕获匹配 URL 字符串的一部分,以便在构造替换 URL 时重复使用它。
- 最后,在“操作”组框中,选择“重写”操作并输入“
http://{ORIGINAL_HOST}/{C:1}/{R:1}”作为值。 此操作将 HTTP 位置标头的值替换为使用服务器变量中的主机名构造的字符串、包含 URL 路径文件夹前缀的条件后引用以及包含 Location 标头中当前 URL 路径的规则后引用。
完整页面应如下所示:
测试规则
若要测试规则正常工作,请打开 Web 浏览器并发出 http://localhost/webmail/index.aspx请求。 浏览器应重定向到 http://localhost/webmail/default.aspx:
总结
在本演练中:
- 你已了解如何使用 URL 重写 2.0 中的多项新功能来实现功能齐全的反向代理方案。
- 已将入站规则配置为将请求转发到后端内容服务器并设置临时服务器变量。
- 然后,你定义了一个出站规则,用于修改 Web 应用程序从后端内容服务器生成的重定向响应中的 HTTP 位置标头。