在微服务架构与API网关的实践中,经常需要对客户端请求的URL路径进行重写,以适配后端服务的实际接口规范。例如,前端应用发起/api/v1/users的请求,而后端服务期望的路径是/users。此时,URL路径重写功能就显得至关重要。
Envoy Gateway作为基于Envoy Proxy构建的新一代Kubernetes原生网关,提供了强大且灵活的路由与请求/响应修改能力。本文将结合实际场景,详细演示如何在Envoy Gateway中配置URL重写功能,涵盖路径前缀替换、完整路径替换以及主机名重写。

实战一:重写URL前缀路径
场景需求
客户端请求路径为http://example.local/api/v1/who,但后端服务实际监听的路径是/who。我们的目标是通过网关自动将请求路径由/api/v1/who重写为/who。
配置方法
通过创建HTTPRoute资源并配置URLRewrite过滤器来实现。关键点在于path的type设置为ReplacePrefixMatch。
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
验证效果
应用配置后,客户端访问/api/v1/who的请求将被网关透明地转发到后端服务的/who端点。

实战二:重写URL完整路径
场景需求
客户端可能会请求/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 # 匹配以/status开头的所有路径
filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplaceFullPath # 替换整个路径
replaceFullPath: /ping # 统一重写为/ping
backendRefs:
- name: simple
port: 80
EOF
验证效果
无论客户端请求/status/healthz还是/status/readyz,网关都会将其重写为/ping后转发给后端。

实战三:重写请求主机名
场景需求
在SaaS或多租户应用中,常使用不同子域名来区分租户,例如tenant1.simple.com和tenant2.simple.com。后端服务可能需要一个统一的主机头(如www.simple.com)来进行处理。网关可以在转发前重写Host请求头。
配置方法
在URLRewrite过滤器中配置hostname字段。
cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: simple
spec:
hostnames:
- "*.simple.com" # 匹配所有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 # 将请求的Host头重写为www.simple.com
backendRefs:
- name: simple
port: 80
EOF
验证效果
访问tenant1.simple.com或tenant2.simple.com时,后端服务接收到的请求的Host头都将变为www.simple.com。

总结
通过Envoy Gateway的URLRewrite过滤器,我们可以轻松实现请求路径前缀、完整路径以及主机名的灵活重写。这一功能有效解耦了前端客户端与后端微服务的接口约定,提升了系统集成的灵活性与整洁度,是构建现代云原生应用网关层的关键能力之一。