You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:23:19