实战:重写URL前缀路径
在微服务落地和API网关部署过程中,一个绕不开的经典场景就是路径适配。你肯定遇到过:前端或是客户端发出的请求是一个路径,但后端服务实际监听的却是另一个。比如,客户端发起的是`/api/v1/users`的请求,而后端只有`/users`这个接口在等着。这种前后端路径不匹配,往往需要我们在网关层做一次“翻译”,也就是URL路径重写。
Envoy Gateway作为下一代Kubernetes原生网关,基于强大的Envoy Proxy构建,提供了非常灵活和精准的路由与重写能力。接下来,我们就用一个具体的例子,看看如何配置它的Rewrite URL Prefix Path功能。

先看第一个实战场景,需求很明确:
- 客户端请求: `https://example.local/api/v1/who`
- 后端服务实际路径: `/who`
- 目标: 让API网关自动完成转化,把客户端请求中包含的`/api/v1/who`这个前缀,精准地重写成`/who`,然后转发给后端。
要实现这个效果,核心是配置Envoy Gateway的HTTPRoute资源,并使用URLRewrite过滤器。具体配置示例如下:
cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: simple
spec:
hostnames:
- example.local
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: simple-gw
rules:
- matches:
- path:
type: PathPrefix
value: /api/v1/who # 浏览器访问路径
filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplacePrefixMatch
replacePrefixMatch: /who # 业务收到访问路径
backendRefs:
- name: simple
port: 80
EOF
配置生效后,如何验证服务按预期工作了呢?直接看结果:

实战:重写URL完整路径
刚才的例子是针对路径前缀的替换,但有时候,我们需要更彻底的改写,比如替换掉整个路径。这在统一健康检查或就绪检查接口时特别常见。
来看另一个场景:
- 客户端请求: `/status/healthz` 和 `/status/readyz`
- 后端服务实际路径: `/ping`
- 目标: 无论客户端请求的是`/status/healthz`还是`/status/readyz`,最终都统一被重写为`/ping`再转发至后端。
这里的关键在于,不再只是替换匹配的前缀,而是替换掉整个匹配到的路径。配置上需要使用`ReplaceFullPath`类型。
cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: simple
spec:
hostnames:
- example.local
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: simple-gw
rules:
- matches:
- path:
type: PathPrefix
value: /status # 浏览器访问路径
filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplaceFullPath
replaceFullPath: /ping # 业务收到访问路径
backendRefs:
- name: simple
port: 80
EOF
配置完成后,验证一下重写效果:

实战:重写主机名
除了改写路径,主机名(Host)的重写在多租户SaaS应用中同样不可或缺。这类应用的典型做法是使用不同子域名来区分租户,例如:
- `tenant1.simple.com`
- `tenant2.simple.com`
应用服务需要根据请求的Host头来判断当前是哪个租户在访问,但最终所有租户的请求都需要落到`simple.com`这个主域名对应的业务服务上。我们当然不想在后端服务里维护一堆租户子域名,这时在网关层重写Host头就成了解法。
使用Envoy Gateway的URLRewrite过滤器,可以轻松实现这个需求。
cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: simple
spec:
hostnames:
- "*.simple.com"
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: simple-gw
rules:
- matches:
- path:
type: PathPrefix
value: /
filters:
- type: URLRewrite
urlRewrite:
hostname: www.simple.com
backendRefs:
- name: simple
port: 80
EOF
来看一下验证结果,可以看到Host头已经按预期被改写了:

结语
通过Envoy Gateway的URLRewrite过滤器,我们能够非常从容地实现路径前缀乃至整个主机名的重写。这种能力,本质上是在解耦客户端请求的格式与后端服务接口的设计,让前后端可以各自独立演化。对于构建灵活、可维护的微服务集成架构来说,这无疑是一个简化流程、提升效率的关键特性。
