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

Ingress-NGINX如何根据请求路径动态设置Host头

解决方案

你可以通过server-snippet定义Nginx的map规则提取路径,再用configuration-snippet设置转发的Host头,完全满足动态适配任意路径的需求,不需要硬编码。

完整Ingress配置示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  namespace: my-ns
  annotations:
    # 全局定义路径转Host的映射规则
    nginx.ingress.kubernetes.io/server-snippet: |
      map $uri $path_host {
          # 捕获/之后的全部路径内容(自动去掉前置/),拼接成xxx.example.com
          ~^/(.+) $1.example.com;
          # 处理根路径请求的默认Host值
          default root.example.com;
      }
    # 在请求匹配的location中设置转发的Host头
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header Host $path_host;
spec:
  ingressClassName: nginx
  rules:
    - host: 'example.com'
      http:
        paths:
        - backend:
            service:
              name: my-svc
              port:
                number: 80
          path: /
          pathType: Prefix

关键配置说明

1. 用server-snippet定义map规则

server-snippet会把配置注入到Nginx的server块中,全局生效:

  • map $uri $path_host:根据Nginx内置的$uri变量(不包含查询参数的请求路径)生成自定义的$path_host变量
  • 正则~^/(.+):匹配所有非根路径的请求,自动捕获/之后的全部内容(比如请求/foo/bar时,捕获到foo/bar),然后拼接成foo/bar.example.com作为Host头
  • default规则:处理根路径(/)的请求,你可以根据业务需求修改默认的Host值

2. 用configuration-snippet设置转发Host头

configuration-snippet会把配置注入到当前Ingress规则对应的location块中:

  • proxy_set_header Host $path_host:覆盖默认的Host头设置,将转发到my-svc的请求Host头替换为我们生成的动态值,完美适配Knative的Host路由机制

自定义调整

如果你的需求是只取路径的第一级目录(比如请求/foo/bar时,Host头为foo.example.com),只需要修改map中的正则规则:

map $uri $path_host {
    ~^/([^/]+) $1.example.com;
    default root.example.com;
}

注意事项

  • 确保你的Ingress-Nginx Controller版本在v0.25及以上(更低版本可能不支持部分注解)
  • 如果有多个Ingress规则,map的变量名(比如$path_host)要唯一,避免全局变量冲突
  • 测试时可以用curl -H "Host: example.com" https://example.com/foo/bar -v查看转发的Host头是否符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:21:00