You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:00:57