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

如何在Kubernetes Nginx Ingress中剥离Host Header的后缀?

在Kubernetes Nginx Ingress中动态剥离Host Header的.extra后缀

针对你在HAProxy中实现的「匹配Host后缀并剥离.extra」的需求,在Kubernetes Nginx Ingress中可以通过自定义Nginx配置片段实现动态处理,无需为每个主机单独创建Ingress资源。

方案1:正则匹配替换(对应HAProxy的实现逻辑)

这种方式和你HAProxy中的规则逻辑完全对应,通过正则捕获去掉.extra后缀,是最精准的方案:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dynamic-host-rewrite
  annotations:
    # 在Nginx的http块定义全局映射规则,性能更优
    nginx.ingress.kubernetes.io/http-snippet: |
      map $host $rewritten_host {
          ~*^(.*)\.extra$ $1;
          default $host;
      }
    # 在当前Ingress对应的server块中,设置传给后端的Host头
    nginx.ingress.kubernetes.io/server-snippet: |
      proxy_set_header Host $rewritten_host;
spec:
  ingressClassName: nginx-internal
  rules:
  - host: "*.example.com.extra"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-target-service
            port:
              number: 80

逻辑说明:

  • map规则会自动匹配所有以.extra结尾的Host,将其替换为去掉后缀的原始主机名;非匹配的Host保持原样。
  • proxy_set_header会把重写后的Host头传递给后端服务,让遗留应用能正确识别。

如果你的Nginx Ingress Controller版本不支持http-snippet,可以改用server-snippet内的if规则(性能略逊于map,但逻辑一致):

nginx.ingress.kubernetes.io/server-snippet: |
  set $rewritten_host $host;
  if ($host ~* ^(.*)\.extra$) {
      set $rewritten_host $1;
  }
  proxy_set_header Host $rewritten_host;

方案2:固定剥离最后6个字符

如果你的场景中需要直接去掉Host的最后6个字符(不管具体后缀内容),可以用Nginx的字符串截取功能:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: strip-host-suffix
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      set $rewritten_host $host;
      # 先判断Host长度至少6个字符,避免截取报错
      if ($host ~* .{6}$) {
          set $rewritten_host $host:0:-6;
      }
      proxy_set_header Host $rewritten_host;
spec:
  ingressClassName: nginx-internal
  rules:
  - host: "*.example.com.extra"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-target-service
            port:
              number: 80

逻辑说明:

  • $host:0:-6是Nginx的字符串截取语法,表示从第0位开始,截取到倒数第6个字符之前的内容,刚好去掉最后6个字符。
  • 增加长度判断是为了避免当Host长度不足6位时出现异常。

这两种方案都能应对主机数量庞大且频繁变化的场景,无需手动维护每个主机的Ingress规则。

内容的提问来源于stack exchange,提问作者TomOnTime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:55:00