Azure Application Gateway Rewrite规则未生效问题排查求助
排查Azure应用网关路径重写规则未生效问题
问题背景
通过Terraform部署Azure应用网关,基于路径的路由配置完成后,重写规则(Strip路径前缀)部署无报错但未生效。例如请求host/service1/actuator/info到达后端service1容器时,仍携带service1/actuator/info路径导致404,而直接请求host/actuator/info(路由到默认池)可正常访问。当前关键HCL配置如下:
http_listener { name = "listener-http" frontend_ip_configuration_name = "public-frontend" frontend_port_name = "http-port" protocol = "Http" } backend_http_settings { name = "common-http-settings" protocol = "Https" port = 443 pick_host_name_from_backend_address = true cookie_based_affinity = "Disabled" probe_name = "containerAppProbe" } rewrite_rule_set { name = "strip-service-prefix" dynamic "rewrite_rule" { for_each = var.services content { name = "strip-${rewrite_rule.key}" rule_sequence = local.service_seq[rewrite_rule.key] condition { variable = "var_uri_path" pattern = ".*/${rewrite_rule.key}/(.*)" ignore_case = true } url { path = "{var_uri_path_1}" } } } } url_path_map { name = "service-prefix-map" default_backend_address_pool_name = "${local.service_names_sorted[0]}-pool" default_backend_http_settings_name = "common-http-settings" dynamic "path_rule" { for_each = var.services content { name = "${path_rule.key}-rule" paths = ["/${path_rule.key}/*"] backend_address_pool_name = "${path_rule.key}-pool" backend_http_settings_name = "common-http-settings" } } } request_routing_rule { name = "path-based-rule" rule_type = "PathBasedRouting" http_listener_name = "listener-http" url_path_map_name = "service-prefix-map" rewrite_rule_set_name = "strip-service-prefix" priority = 100 } dynamic "backend_address_pool" { for_each = var.services content { name = "${backend_address_pool.key}-pool" fqdns = [backend_address_pool.value] } }
排查思路
1. 重写规则条件匹配逻辑验证
- 检查
var_uri_path变量取值:Azure应用网关中var_uri_path包含开头的/,比如请求/service1/actuator/info时变量值为/service1/actuator/info。当前正则.*/${rewrite_rule.key}/(.*)可匹配但不够精准,建议改为^/${rewrite_rule.key}/(.*),避免匹配路径中间出现serviceId的情况,同时确保只匹配前缀。 - 用门户测试工具验证:在Azure门户的重写规则界面,使用测试功能输入
/service1/actuator/info,查看是否触发条件,以及var_uri_path_1是否正确捕获到actuator/info。
2. 重写规则执行顺序与优先级检查
- 确认
rule_sequence唯一性:如果多个重写规则的序号重复或为非正整数,规则不会执行。检查local.service_seq生成的序号是否为唯一递增的正整数。 - 排查路由规则优先级:确认是否有其他优先级更高的路由规则抢占请求,导致当前绑定重写规则的路由未被触发。
3. 路径路由与重写规则的执行顺序验证
Azure应用网关执行顺序为路径路由匹配 → 重写规则执行,需确认:
- 路径规则匹配情况:查看应用网关访问日志,确认
/service1/actuator/info是否命中service1-rule并进入对应后端池,未命中的请求会走默认池,且不会触发当前重写规则。 - 重写规则触发范围:当前重写规则绑定在路径路由规则上,仅命中该路由的请求才会执行重写,默认池请求不触发。
4. 后端HTTP设置排查
- 检查
backend_http_settings的path参数:如果该参数设置了固定值,会覆盖重写后的路径。当前配置未设置该参数,默认传递重写后的路径,但需确认无其他动态配置干扰。 - 排除Host头影响:
pick_host_name_from_backend_address仅控制Host头传递,不影响路径,可排除该因素。
5. 日志与监控分析
- 启用应用网关日志:开启访问日志和重写规则日志,查看
rewriteRuleApplied字段确认规则是否触发,以及重写前后的路径值。 - 查看后端容器日志:直接确认后端接收到的请求路径,验证重写是否生效。
6. Terraform配置隐性问题排查
- 验证
local.service_seq定义:确保其生成的序号合法(正整数、无重复),若序号为0或负数,规则无法执行。 - 对比部署后实际配置:用Azure CLI命令
az network application-gateway rewrite-rule show查看实际规则参数,确认与Terraform配置一致,避免模板与实际部署存在差异。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

