本文介绍如何使用 Azure PowerShell 配置 应用程序网关 v2 SKU 实例,以重写请求和响应中的 HTTP 标头。 标头重写使你可以在请求和响应数据包在客户端和后端池之间移动时添加、删除或更新 HTTP 标头。
如果没有 Azure 订阅,可在开始前创建一个试用帐户。
在开始之前,请确保满足以下要求:
-
Azure PowerShell:需要在本地安装 Azure PowerShell。 需要 Azure PowerShell Az 模块版本 1.0.0 或更高版本。 若要检查版本,请运行
Get-Module -ListAvailable Az
。 如果需要进行升级,请参阅 Install Azure PowerShell module(安装 Azure PowerShell 模块)。 -
Azure 连接:验证 PowerShell 版本后,运行
Connect-AzAccount
以使用 Azure 进行身份验证。 - 应用程序网关 v2:需要现有的应用程序网关 v2 SKU 实例。 标头重写仅在 v2 SKU(Standard_v2或WAF_v2)中受支持。 如果没有,请在开始前创建 应用程序网关 v2 SKU 实例。
- 适当的权限:确保对应用程序网关资源具有参与者或所有者权限。
重要
标头重写功能仅适用于应用程序网关 v2 SKU。 v1 SKU 不支持此功能。
若要配置 HTTP 标头重写,需要按特定顺序了解并创建以下组件:
RequestHeaderConfiguration:指定要重写的请求标头字段及其新值。 使用此组件在到达后端服务器之前修改客户端请求中的标头。
ResponseHeaderConfiguration:指定要重写的响应标头字段及其新值。 使用此组件在到达客户端之前修改服务器响应中的标头。
ActionSet:包含指定的请求和响应标头的配置。 每个动作集表示一组要执行的标头修改。
- Condition:一项可选配置。 重写条件评估 HTTP(S) 请求和响应的内容。 如果 HTTP 请求或响应与重写条件匹配,则会发生重写操作。
备注
各种与操作相关的条件使用逻辑与运算 - 必须满足所有条件才能执行该操作。
RewriteRule:合并多个重写操作和重写条件。 每个规则定义何时以及如何修改标头。
RuleSequence (可选):在重写集中有多个重写规则时确定执行顺序。 具有较低序列值的规则首先执行。 如果未指定值,则默认值为 100。
警告
如果将相同的序列值分配给多个规则,则执行顺序将变得不确定。
RewriteRuleSet:包含多个与请求路由规则关联的重写规则。
重写配置范围取决于路由规则类型:
- 基本路由规则:标头重写配置全局应用于关联侦听器的所有请求
- 基于路径的路由规则:标头重写配置仅适用于与 URL 路径映射中定义的特定 URL 路径模式匹配的请求
重要
可以创建多个 HTTP 标头重写集并将每个集应用于多个侦听器,但只能将一个重写集应用于特定的侦听器。
在配置标头重写规则之前,请使用 Azure 进行身份验证并选择订阅:
Connect-AzAccount -Environment AzureChinaCloud
Select-AzSubscription -Subscription "<sub name>"
在此示例中,每当位置标头包含对 chinacloudsites.cn 的引用时,我们都通过重写 HTTP 响应中的位置标头来修改重定向 URL。 为此修改,我们将添加一个条件来评估响应中的位置标头是否包含 chinacloudsites.cn。 我们使用模式 (https?)://.*chinacloudsites.cn(.*)$
。 我们用 {http_resp_Location_1}://contoso.com{http_resp_Location_2}
作为标头值。 此值将 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
在此示例中,会立即针对基本传递规则关联重写集。 在基于路径的路由规则中,默认情况下不会启用关联。 可以通过以下方法之一来启用重写集 - 通过门户检查需要将重写集应用于哪些路径,或者通过针对每个选项指定 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
如果需要从应用程序网关中删除重写规则集,请使用以下步骤:
# Retrieve the current Application Gateway configuration
$appgw = Get-AzApplicationGateway -Name "AutoscalingAppGw" -ResourceGroupName "<rg name>"
# Remove the rewrite rule set association from the routing rule first
$requestRoutingRule = Get-AzApplicationGatewayRequestRoutingRule -Name "rule1" -ApplicationGateway $appgw
# Clear the rewrite rule set reference
$requestRoutingRule.RewriteRuleSet = $null
# Remove the rewrite rule set from the Application Gateway
Remove-AzApplicationGatewayRewriteRuleSet -Name "LocationHeaderRewrite" -ApplicationGateway $appgw
# Apply the changes
Set-AzApplicationGateway -ApplicationGateway $appgw
Write-Output "Rewrite rule set removed successfully"
了解如何配置 HTTP 标头重写规则后,请浏览以下相关文章: