Envoy主机名重写:保留通配符子域的流量转发配置求助
解决Envoy转发任意子域名请求到对应目标子域名的问题
我明白你的需求了——要让Envoy把foo.bar.com/myapp这类请求(其中foo可以是任意合法子域名)转发到foo.fiz.net/myapp。其实这个场景可以通过Envoy的路由正则匹配+主机头重写组合实现,下面是具体的配置方案:
核心配置示例
首先定义后端集群(假设你的服务运行在fiz.net的80端口,如果是HTTPS服务,后续会补充对应配置):
clusters: - name: myapp_backend_cluster type: STRICT_DNS load_assignment: cluster_name: myapp_backend_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: fiz.net port_value: 80
然后在虚拟主机(virtual_host)里配置关键的路由规则,重点是通过正则捕获子域名并替换目标主机:
virtual_hosts: - name: bar_com_vhost # 先匹配所有bar.com的子域名请求 domains: ["*.bar.com"] routes: - match: # 只处理/myapp路径的请求 prefix: "/myapp" # 匹配请求的主机头(:authority),捕获foo部分 headers: - name: ":authority" regex_match: "^([a-zA-Z0-9-]+)\\.bar\\.com$" route: cluster: myapp_backend_cluster # 用捕获到的第一个分组(即foo)替换目标主机 host_rewrite_with_substitution: "\\1.fiz.net"
配置细节解释
- 域名范围匹配:
domains: ["*.bar.com"]确保所有bar.com的子域名请求都进入这个虚拟主机处理,避免无关流量干扰。 - 路径精准过滤:
prefix: "/myapp"限定只处理路径以/myapp开头的请求,符合你的业务场景需求。 - 子域名正则捕获:通过
:authority头的regex_match规则,把foo.bar.com中的foo捕获为第一个正则分组(\\1)。这里的正则^([a-zA-Z0-9-]+)\\.bar\\.com$可以根据你的实际子域名规则调整(比如允许下划线就添加_字符)。 - 主机头动态重写:
host_rewrite_with_substitution: "\\1.fiz.net"直接把目标主机替换成foo.fiz.net,同时原请求的路径/myapp会被完整保留并转发到后端服务。
HTTPS后端适配说明
如果你的后端是HTTPS服务,需要给集群加上TLS配置,确保Envoy能和后端建立安全连接:
clusters: - name: myapp_backend_cluster type: STRICT_DNS transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext sni: "\\1.fiz.net" load_assignment: cluster_name: myapp_backend_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: fiz.net port_value: 443
这样Envoy就会使用动态生成的SNI(foo.fiz.net)和后端完成TLS握手,保证通信安全。
内容的提问来源于stack exchange,提问作者GwydionFR
相关产品推荐
相关产品推荐

