Traefik(K8s)如何实现子域名A到B的URL重写(无需跳转)
在Traefik(K8s)中实现无重定向的跨子域名请求转发
你的需求完全可以实现,之前的配置问题出在对replacePathRegex中间件的理解上——它仅负责修改URL的路径部分(即域名后的内容,比如/graphql),而非完整URL,所以用https://subdomainA.domain.io/graphql作为匹配正则根本无法命中路径,导致中间件失效。
要实现将subdomainA.domain.io的请求转发到subdomainB.domain.io且保留原URL的需求,核心是修改请求的Host头,让后端服务识别为发往subdomainB的请求,具体配置步骤如下:
1. 创建修改Host头的中间件
使用ReplaceHeader中间件将请求的Host头替换为subdomainB.domain.io:
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: replace-host-to-subdomainb spec: replaceHeader: headers: Host: value: "subdomainB.domain.io"
2. 配置路由关联中间件
根据你的服务类型(K8s内部服务/外部服务)选择对应配置:
情况1:subdomainB对应K8s内部服务
直接在IngressRoute中关联中间件并指向目标服务:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: subdomaina-route spec: entryPoints: - websecure # 对应你启用的HTTPS入口点 routes: - match: Host(`subdomainA.domain.io`) && PathPrefix(`/graphql`) kind: Rule middlewares: - name: replace-host-to-subdomainb services: - name: subdomainb-service # subdomainB对应的K8s服务名称 port: 443 # 服务的HTTPS端口 tls: certResolver: default # 你的证书解析器名称,用于自动签发证书
情况2:subdomainB是外部服务
先创建ExternalName类型的Service指向外部域名:
apiVersion: v1 kind: Service metadata: name: subdomainb-service spec: type: ExternalName externalName: subdomainB.domain.io
再用上述IngressRoute配置关联该服务即可。
补充:如需修改路径(可选)
如果后续需要调整请求路径,可配合replacePathRegex中间件(注意仅匹配路径部分),例如:
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: adjust-graphql-path spec: replacePathRegex: regex: ^/graphql(.*) replacement: /api/graphql$1
将此中间件添加到IngressRoute的middlewares列表中即可。
配置完成后,用户访问subdomainA.domain.io/graphql时,Traefik会在后台将请求转发到subdomainB.domain.io,浏览器地址栏始终显示原URL,不会触发重定向,同时后端身份验证代理能识别修改后的Host头。
内容的提问来源于stack exchange,提问作者Valentin Yanakiev
相关产品推荐
相关产品推荐

