重写 Azure 应用程序网关中的 HTTP 请求和响应标头 - Azure PowerShell

本文介绍如何使用 Azure PowerShell 配置应用程序网关 v2 SKU 实例,重写请求和响应中的 HTTP 标头。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

准备阶段

  • 若要完成本文中的步骤,需在本地运行 Azure PowerShell。 还需安装 Az 模块 1.0.0 或更高版本。 运行 Import-Module AzGet-Module Az,确定已安装的版本。 如果需要进行升级,请参阅 Install Azure PowerShell module(安装 Azure PowerShell 模块)。 验证 PowerShell 版本以后,请运行 Connect-AzAccount -Environment AzureChinaCloud,以便创建与 Azure 的连接。
  • 需要有应用程序网关 v2 SKU 实例。 v1 SKU 不支持重写标头。 如果没有 v2 SKU,请在开始之前创建应用程序网关 v2 SKU 实例。

创建所需对象

若要配置 HTTP 标头重写,需要完成以下步骤。

  1. 创建 HTTP 标头重写所需的对象:

    • RequestHeaderConfiguration:用于指定要重写的请求头字段以及头的新值。

    • ResponseHeaderConfiguration:用于指定要重写的响应头字段以及头的新值。

    • ActionSet:包含前面指定的请求头和响应头的配置。

    • Condition:一项可选配置。 重写条件评估 HTTP(S) 请求和响应的内容。 如果 HTTP(S) 请求或响应与重写条件匹配,则会发生重写操作。

      如果将多个条件关联到一个操作,仅当满足所有条件时,才会发生该操作。 换言之,操作属于逻辑 AND 运算。

    • RewriteRule:包含多个重写操作/重写条件的组合。

    • RuleSequence:一项可选配置,有助于确定重写规则的执行顺序。 在一个重写集中使用多个重写规则时,此配置非常有用。 规则顺序值较小的重写规则最先运行。 如果为两个重写规则分配了相同的规则顺序值,则执行顺序是不确定的。

      如果没有显式指定 RuleSequence explicitly,则会设置默认值 100。

    • RewriteRuleSet:包含多个要关联到请求路由规则的重写规则。

  2. 将 RewriteRuleSet 附加到路由规则。 重写配置将通过路由规则附加到源侦听器。 使用基本路由规则时,标头重写配置与源侦听器相关联,并且是全局标头重写。 使用基于路径的路由规则时,将在 URL 路径映射中定义标头重写配置。 在这种情况下,该规则只会应用到站点的特定路径区域。

可以创建多个 HTTP 标头重写集,并将每个重写集应用到多个侦听器。 但是,对于一个特定的侦听器,只能应用一个重写集。

登录 Azure

Connect-AzAccount -Environment AzureChinaCloud
Select-AzSubscription -Subscription "<sub name>"

指定 HTTP 标头重写规则配置

在此示例中,我们将修改重定向 URL,方法是:当 HTTP 响应中的 location 标头包含对 chinacloudsites.cn 的引用时,重写该 location 标头。 为此,我们将添加一个条件,用于评估响应中的 location 标头是否包含 chinacloudsites.cn。 我们将使用 (https?)://.*chinacloudsites.cn(.*)$ 模式。 我们将使用 {http_resp_Location_1}://contoso.com{http_resp_Location_2} 作为标头值。 该值会在 location 标头中将 chinacloudsites.cn 替换为 contoso.com

$responseHeaderConfiguration = New-AzApplicationGatewayRewriteRuleHeaderConfiguration -HeaderName "Location" -HeaderValue "{http_resp_Location_1}://contoso.com{http_resp_Location_2}"
$actionSet = New-AzApplicationGatewayRewriteRuleActionSet -ResponseHeaderConfiguration $responseHeaderConfiguration
$condition = New-AzApplicationGatewayRewriteRuleCondition -Variable "http_resp_Location" -Pattern "(https?):\/\/.*chinacloudsites\.cn(.*)$" -IgnoreCase
$rewriteRule = New-AzApplicationGatewayRewriteRule -Name LocationHeader -ActionSet $actionSet -Condition $condition
$rewriteRuleSet = New-AzApplicationGatewayRewriteRuleSet -Name LocationHeaderRewrite -RewriteRule $rewriteRule

检索应用程序网关配置

$appgw = Get-AzApplicationGateway -Name "AutoscalingAppGw" -ResourceGroupName "<rg name>"

检索请求路由规则配置

$reqRoutingRule = Get-AzApplicationGatewayRequestRoutingRule -Name rule1 -ApplicationGateway $appgw

使用配置更新应用程序网关以重写 HTTP 标头

在此示例中,会立即针对基本传递规则关联重写集。 如果是基于路径的传递规则,则默认情况下不会启用关联。 可以通过以下方法之一来启用重写集:通过门户检查需要将重写集应用于哪些路径,或者通过针对每个选项指定 RewriteRuleSet 来提供 URL 路径映射配置。

Add-AzApplicationGatewayRewriteRuleSet -ApplicationGateway $appgw -Name $rewriteRuleSet.Name  -RewriteRule $rewriteRuleSet.RewriteRules
Set-AzApplicationGatewayRequestRoutingRule -ApplicationGateway $appgw -Name $reqRoutingRule.Name -RuleType $reqRoutingRule.RuleType -BackendHttpSettingsId $reqRoutingRule.BackendHttpSettings.Id -HttpListenerId $reqRoutingRule.HttpListener.Id -BackendAddressPoolId $reqRoutingRule.BackendAddressPool.Id -RewriteRuleSetId $rewriteRuleSet.Id
Set-AzApplicationGateway -ApplicationGateway $appgw

删除重写规则

$appgw = Get-AzApplicationGateway -Name "AutoscalingAppGw" -ResourceGroupName "<rg name>"
Remove-AzApplicationGatewayRewriteRuleSet -Name "LocationHeaderRewrite" -ApplicationGateway $appgw
$requestroutingrule= Get-AzApplicationGatewayRequestRoutingRule -Name "rule1" -ApplicationGateway $appgw
$requestroutingrule.RewriteRuleSet= $null
set-AzApplicationGateway -ApplicationGateway $appgw

后续步骤

若要详细了解如何设置某些常见用例,请参阅常见标头重写方案