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

Ingress Nginx路径重写问题:根路径注入子路径及特定路径转发

问题2:Ingress对象的正确配置方案

需要通过多路径规则或原生Nginx片段注入两种方式实现需求,以下是具体方案:

方案1:多路径规则(推荐,符合K8s Ingress规范)

利用Ingress-Nginx的路径匹配优先级(精确匹配 > 正则匹配),拆分两个独立路径规则:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "90s"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "90s"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "90s"
    # 全局处理后端返回的重定向
    nginx.ingress.kubernetes.io/proxy-redirect-from: /devportal/
    nginx.ingress.kubernetes.io/proxy-redirect-to: /
  name: multitenancy-ingress
  namespace: wso2
spec:
  rules:
  - host: example.com
    http:
      paths:
      # 规则1:精确匹配/,转发至/devportal/
      - backend:
          service:
            name: my-svc
            port:
              name: servlet-https
        path: /
        pathType: Exact
        annotations:
          nginx.ingress.kubernetes.io/rewrite-target: /devportal/
      # 规则2:正则匹配/a、/b、/c及子路径,保留原URI转发
      - backend:
          service:
            name: my-svc
            port:
              name: servlet-https
        path: /(a|b|c)(.*)
        pathType: ImplementationSpecific
        annotations:
          nginx.ingress.kubernetes.io/rewrite-target: /$1$2
  tls:
  - hosts:
    - example.com
    secretName: my-tls

方案2:原生Nginx片段注入(完全复刻原有配置)

如果多路径规则无法满足复杂逻辑,可通过server-snippets直接插入原生Nginx配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "90s"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "90s"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "90s"
    nginx.ingress.kubernetes.io/server-snippets: |
      location / {
        proxy_pass            https://my-svc:servlet-https/devportal/;
        proxy_redirect        https://my-svc:servlet-https/devportal/ /;
      }
      location ~ (/a|/b|/c) {
        proxy_pass      https://my-svc:servlet-https;
        proxy_redirect  https://my-svc:servlet-https/devportal/ /;
      }
  name: multitenancy-ingress
  namespace: wso2
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          service:
            name: my-svc
            port:
              name: servlet-https
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - example.com
    secretName: my-tls

配置说明:

  • 方案1中,pathType: Exact确保精确/请求优先匹配,单独配置rewrite-target保证转发路径为/devportal/;正则规则覆盖/a、/a/xxx等子路径,通过捕获组保留原URI结构。
  • 方案2中,server-snippets直接插入原生Nginx的location规则,完全复刻你原本的配置逻辑,注意将my-svc:servlet-https替换为实际的Service名称和端口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:10:26