如何在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
相关产品推荐
相关产品推荐

