2. 重写配置

重写用于修改请求的URL路径或主机头,不改变请求的实际目的地,仅在Sidecar代理层调整请求信息,适用于路径规范化、兼容旧版接口等场景。支持普通路径重写、正则路径重写(uriRegexRewrite)及主机头重写三种方式,可按需适配不同复杂度的路径调整需求。

2.1 普通路径重写示例

适用于固定前缀、后缀的路径调整,直接指定目标重写路径,配置简洁直观。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: demo-service-vs
  namespace: default
spec:
  hosts:
  - demo-service
  http:
  - match: # 匹配规则:锁定/old-api前缀流量
    - uri:
        prefix: /old-api
    rewrite: # 重写规则:将路径替换为/api/v1
      uri: /api/v1 # 示例:/old-api/user → /api/v1/user
    route:
    - destination:
        host: demo-service
        subset: v1

2.2 正则路径重写(uriRegexRewrite)示例

适用于非固定格式的复杂路径重写,通过正则表达式精准匹配路径结构,再动态替换为目标格式,支持分组引用实现灵活的路径转换,适配接口版本迭代、路径格式优化等场景。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: demo-service-vs
  namespace: default
spec:
  hosts:
  - demo-service
  http:
  - match:
    - uri:
        regex: ^/api/(v\d+)/users/(\d+)$ # 匹配路径格式(例:/api/v2/users/123)
    rewrite:
      uriRegexRewrite:
        match: ^/api/(v\d+)/users/(\d+)$ # 正则匹配规则
        rewrite: /api/$1/user/$2 # 路径替换模板(转换为:/api/v2/user/123)
    route:
    - destination:
        host: demo-service
        subset: v1

2.2.1 正则分组替换说明

  • 通过正则表达式中的()定义分组,替换模板中用$1$2依次引用对应分组内容,支持多分组嵌套和复杂规则组合,满足多样化路径转换需求。

  • 上述示例中,$1匹配版本号(如v2),$2匹配用户ID(如123),可快速将多格式旧路径统一为标准路径,无需逐一路由配置。

2.3 主机头重写示例

用于修改请求的主机头信息,适用于服务别名映射、跨服务透明转发等场景,可配合匹配规则实现精准的主机头调整。

http:
- match: # 匹配/api前缀流量
  - uri:
      prefix: /api
  rewrite: # 重写请求主机头
    authority: service-new.default.svc.cluster.local
  route:
  - destination:
      host: demo-service
      subset: v1

2.4 操作注意事项

  • 重写仅作用于Sidecar代理转发环节,客户端收到的响应内容不变,需提前确认后端服务可处理重写后的路径或主机头,避免服务异常。

  • 正则路径重写需严格校验正则语法,建议先在测试环境验证匹配和替换效果,避免线上流量因规则错误被误匹配或漏匹配。

  • 多规则叠加重写时,按配置顺序优先执行,建议为每条重写规则单独配置匹配条件,明确流量范围,避免规则冲突。

作者:叶奕珺  创建时间:2026-01-23 14:41
最后编辑:叶奕珺  更新时间:2026-01-30 18:08