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

在Kubernetes的Ingress Nginx控制器中保留原始URL的配置方法

如何在Ingress Nginx中配置以转发原始请求的Host/URL到后端服务?

刚好我之前在K8S环境里配置Ingress Nginx做HTTPS代理时,也遇到过完全一样的需求——后端要根据原始请求的Host/URL执行不同业务逻辑。下面是我踩过坑后总结的可靠配置方法,完美对应你之前用Nginx时的那些proxy_set_header设置:

1. 用Ingress注解映射原Nginx配置

Ingress Nginx提供了专门的注解来控制请求头转发,不用手动编写Nginx配置文件,直接在Ingress资源里添加注解即可:

  • 复刻原有Nginx头配置:对应你之前写的那几行proxy_set_header,可以用多行注解一次性配置所有需要的头:

    nginx.ingress.kubernetes.io/proxy-set-header: |
      Host $host
      X-Real-IP $remote_addr
      X-Forwarded-For $proxy_add_x_forwarded_for
      X-Forwarded-Host $host
    

    这几行注解完全复刻了你之前的Nginx配置,确保后端能拿到原始请求的Host、用户真实IP以及转发链路信息。

  • 补充HTTPS场景必需的协议头:因为你的Ingress是处理HTTPS的,后端需要知道原始请求的协议类型,一定要加上这个注解:

    nginx.ingress.kubernetes.io/proxy-set-header: "X-Forwarded-Proto $scheme"
    

    这个头会告诉后端用户是通过HTTPS访问的,对依赖URL协议的业务逻辑至关重要。同时记得开启SSL重定向,把HTTP请求强制转到HTTPS:

    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    

2. 完整的Ingress资源配置示例

下面是一个包含所有必需配置的Ingress示例,你可以直接替换成自己的服务和证书信息:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-domain-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-set-header: |
      Host $host
      X-Real-IP $remote_addr
      X-Forwarded-For $proxy_add_x_forwarded_for
      X-Forwarded-Host $host
      X-Forwarded-Proto $scheme
spec:
  tls:
  - hosts:
    - x.com
    - y.com
    secretName: my-tls-cert-secret  # 替换为你的TLS证书Secret名称
  rules:
  - host: x.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: x-domain-service  # 替换为x.com对应的后端服务名称
            port:
              number: 80
  - host: y.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: y-domain-service  # 替换为y.com对应的后端服务名称
            port:
              number: 80

3. 验证配置是否生效

部署完Ingress后,你可以在后端服务中打印请求头来验证:

  • 用Python Flask的话,直接输出request.headers就能看到所有请求头;
  • Java Spring Boot可以通过request.getHeader("Host")获取原始域名;
  • 检查X-Forwarded-Proto的值是否为https,X-Real-IP是否是用户的真实IP。

4. 额外注意事项

  • 确保你的TLS Secret已经正确创建,包含对应域名的证书和私钥,否则HTTPS访问会失败;
  • 如果后端服务有信任代理的配置(比如Spring Boot的server.forward-headers-strategy),记得把Ingress Nginx的IP段加入信任列表,这样后端才会优先使用这些转发头;
  • 上述注解兼容Ingress Nginx v1.0及以上的稳定版本,如果是更老的版本,可能需要调整注解名称(比如旧版本用kubernetes.io/ingress.class: nginx指定控制器类)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:27:37